• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обсуждение Blynk и ESP8266

speakme

New member
device was disconnected
Какие причины этой ошибки и как бороться? Весь инет излазил уже.. То все четко работает, то начинается.. Никакой надежности.
Мой скетч на NodeMCU управляет шаговым двигателем 28BYJ-48-5V и тремя датчиками температуры DS18B20. Спасибо
 

speakme

New member
Код:
// скетч автоматического управления шаговым двигателем 28BYJ-48-5V по температуре от датчиков ds18b20
#include<AccelStepper.h>
#define HALFSTEP 8
#define motorPin1  14 // пины шагового двигателя
#define motorPin2  12
#define motorPin3  13
#define motorPin4  15
AccelStepper mystepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <SimpleTimer.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 04 // пин для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

bool buttl = 0;   // команда открыть
bool buttr = 0;   // команда закрыть
bool buttll = 0;  // команда открыть полностью
bool buttrr = 0;  // команда закрыть полностью
int turn = 226;   // угол 20' по умолчанию, шагов по автоматике
int turnm = 8500; // 845 градусов (2 оборота - 720 градусов)
bool turn_stop;

float temp_def; // ds18b20
float temp_par;
float temp_cub;
int temp_def_max; // верхняя критическая температура дефа
int temp_def_min; // нижняя критическая температура дефа
unsigned long time_reed_temp = 0; // время измерения температуры перед регулировкой
bool butt_auto_on = 0; //кнопка включения автоматики
int time_auto_period = 30000;
float timeout = (millis() / 1000);
unsigned long TimeLightOffOn = 0;

SimpleTimer timer;

char auth[] = "***";
char ssid[] = "speakme";
char pass[] = "183461..";

BLYNK_CONNECTED()
{
  Blynk.syncAll();
}
BLYNK_WRITE(V6) //открыть
{
  buttl = param.asInt();
}
BLYNK_WRITE(V4) //закрыть
{
  buttr = param.asInt();
}
BLYNK_WRITE(V9) //открыть макс
{
  buttll = param.asInt();
}
BLYNK_WRITE(V10) //закрыть макс
{
  buttrr = param.asInt();
}
BLYNK_WRITE(V5) // вкл автоматики
{
  butt_auto_on = param.asInt();
}
BLYNK_WRITE(V8) // слайдер шага двигателя
{
  turn = param.asInt();
}
BLYNK_WRITE(V11) // слайдер дефа мин
{
  temp_def_min = param.asInt();
}
BLYNK_WRITE(V12) // слайдер дефа макс
{
  temp_def_max = param.asInt();
}
BLYNK_WRITE(V14) // стоп вращение
{
  turn_stop = param.asInt();
}
/*BLYNK_WRITE(V15) // период действия автоматики
{
  time_auto_period = param.asInt();
}*/

void setup()
{
  mystepper.setMaxSpeed(200.0);
  mystepper.setAcceleration(300.0);
  mystepper.setCurrentPosition (0);     // Установить счетчик как текущую позицию.
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
//  Blynk.connect();
 
  sensors.begin();

  timer.setInterval (50, butt); // считывание кнопок Blynk
  timer.setInterval (3000, sendBlynk); // отправка данных в Blynk
  timer.setInterval (time_auto_period, automatic); // запуск автоматической корекции двигателя по температуре
//  timer.setInterval (1000, prints); //Serial.print

/*  while (Blynk.connect() == false) {
  if(((millis()/1000) - timeout) > 10){   // issue msg if not connected to Blynk in more than 10 seconds
    break;
    }
}*/
}

void sendBlynk()  // отправка данных в Blynk
{
  if ((Blynk.connected()) && (mystepper.isRunning() == 0))
  {
    Blynk.virtualWrite(V8, turn);
    Blynk.virtualWrite(V7, mystepper.currentPosition() / 11.3216);    // 11,3215912208333 положение двигателя в градусах

    sensors.requestTemperatures();
    temp_def = sensors.getTempCByIndex(0);
    temp_par = sensors.getTempCByIndex(1);
    temp_cub = sensors.getTempCByIndex(2);
unsigned long time_reed_temp = 0; // время начала
int time_out = 1000; // время задержки
if (millis() - time_reed_temp > time_out)
  {
    time_reed_temp = millis();
    Blynk.virtualWrite(V1, temp_def);
    Blynk.virtualWrite(V2, temp_par);
    Blynk.virtualWrite(V3, temp_cub);
  }
// Время с момента перезагрузки
//  byte Seconds = ((millis()+TimeLightOffOn)/1000UL)%60;
  byte Minutes  = (((millis()+TimeLightOffOn)/1000UL)/60UL)%60;
  byte Hours   = (((millis()+TimeLightOffOn)/1000UL)/3600UL)%24;
    Blynk.virtualWrite(V16, Hours);
    Blynk.virtualWrite(V17, Minutes);
//    Blynk.virtualWrite(V18, Seconds);
/*  Serial.print(Hours);
  Serial.print(':');
  Serial.print(Minutes);
  Serial.print(':');
  Serial.println(Seconds);*/
  }
}

void automatic() // запуск автоматической корекции положения двигателя по температуре
{
  // деф
  if (butt_auto_on == 1)
  {
    if (temp_def <= temp_def_min)
    {
      mystepper.move(turn);
    }
    if (temp_def >= temp_def_max)
    {
      mystepper.move(-turn);
    }
    mystepper.disableOutputs();
  }
  if ((temp_def_min <= temp_def) && (temp_def <= temp_def_max))
    {
      Blynk.setProperty(V1, "color", "#66ccff"); // голубой
    }
    else
    {   
      Blynk.setProperty(V1, "color", "#ff3333"); // красный
    }

  // Пар
  if ((temp_par >= 78.3) && (temp_par <= 78.5))
  {
    Blynk.setProperty(V2, "color", "#66ccff"); // голубой
  }
  if ((temp_par > 78.5) && (temp_par <= 98))
  {
    Blynk.setProperty(V2, "color", "#ffff33"); // желтый
  }
  if ((temp_par < 78.3) || (temp_par > 98))
  {
    Blynk.setProperty(V2, "color", "#ff3333"); // красный
  }
}

void loop()
{
//  if(Blynk.connect() == true)
//  {
    Blynk.run();
//  }
  timer.run();
  mystepper.run();
}

void butt() // ручное управление двигателем
{
  if (butt_auto_on == 0)
  {
    if (buttl == 1)
    {
      mystepper.move(turn);     // Переместиться в относительно указанное положение. Открыть
    }
    if (buttr == 1)
    {
      mystepper.move(-turn);      // Закрыть
    }
    if (buttll == 1)
    {
      mystepper.moveTo(turnm);  // Переместиться в абсолютно указанное положение против часовой, открыть вентиль.
    }
    if (buttrr == 1)
    {
      mystepper.moveTo(0);       // закрыть вентиль
    }
    mystepper.disableOutputs();
  }
  if (turn_stop == 1)
  {
    mystepper.stop();
  }
}
 
/*void prints()
{
  Serial.print("max = ");
  Serial.println(temp_def_max);
  Serial.print("min = ");
  Serial.println(temp_def_min);
  Serial.print("угол = ");
  Serial.println(angle);
//  Serial.println(temp_def);
//  Serial.println(temp_par);
//  Serial.println(temp_cub);
}*/
Можно покритиковать код? Понимаю, что его еще допиливать и допиливать
 
Последнее редактирование:

kab

New member
// Пар
Можно покритиковать код? Понимаю, что его еще допиливать и допиливать
Так речь про баню?
Высокие влажность, температура...

Эти факторы при изготовлении устройства учтены?
Обычно такие нестабильности связаны не со скетчем, а с проблемами изготовления+недостаточная продуманность питания
 

kab

New member
То все четко работает, то начинается..
Вот когда "начинается" надо для начала полазить по всем устройствам с мультимером - хотя бы проверить питание. Попытаться потом проверить сигнальные цепи...
Пишите - дальше посмотрим...
 

speakme

New member
Так речь про баню?
Высокие влажность, температура...
Нет, это автоматика самогонного аппарата. :D
Задача регулировать напор охлаждающей воды с контролем температуры.
Питание 12В/1,6А для двигателя через LM2596s DC-DC преобразователь, 5В/2,1А для ESPшки от зарядного моб.телефона. Пока так. Потом все от DC-DC запитаю..
 

kab

New member
Нет, это автоматика самогонного аппарата. :D
Задача регулировать напор охлаждающей воды с контролем температуры.
Питание 12В/1,6А для двигателя через LM2596s DC-DC преобразователь, 5В/2,1А для ESPшки от зарядного моб.телефона. Пока так. Потом все от DC-DC запитаю..
Ну, если про питание - попробуйте esp и датчики питать от разных зарядников
Только землю не забыть соединить...
 

speakme

New member
Навел порядок по питанию. У каждого компонента свое. Поднял на ESPшке напряжение до 10В. И все работало ок, даже не знал, что сюда написать.. Начал допиливать код. И вот, посмотрел биатлон.. Сейчас ничего не работает. device was disconnected каждые 8 сек. Сама ESPшка работает, на телефон приходит время непрерывной работы. Датчики температуры тоже обновляются, но не каждые 2 сек. Загрузил даже предыдущий скетч - та же беда. Похоже косяк у них на сервере? Wi-Fi дома нормально.
 

speakme

New member
Ха... Сворачиваю приложение на андроид не закрывая, ошибка прекращается. Только открываю - сразу реконнект. Таак....
:confused:
 

speakme

New member
Нашел пару ошибок, которые исправил. Вроде бы заработало..
Код:
// скетч автоматического управления шаговым двигателем 28BYJ-48-5V по темпратуре от датчиков ds18b20
#include<AccelStepper.h>
#define HALFSTEP 8
#define motorPin1  14 // пины шагового двигателя
#define motorPin2  12
#define motorPin3  13
#define motorPin4  15
AccelStepper mystepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

//#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <SimpleTimer.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 04 // пин для ds18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

bool buttl = 0;   // команда открыть
bool buttr = 0;   // команда закрыть
bool buttll = 0;  // команда открыть полностью
bool buttrr = 0;  // команда закрыть полностью
int turn;   // шагов по автоматике, угол 10' по умолчанию
int turnm = 8500; // 750 градусов (это максимум)
int turn_temp; //шагов. считывается со слайдера в градусах
int steps; // положение двигателя
float temp_def; // ds18b20
float temp_par;
float temp_cub;
unsigned long time_reed_temp = 0; // время измерения температуры перед регулировкой
bool butt_auto_on = 0; //кнопка включения автоматики
float timeout = (millis() / 1000);
unsigned long TimeLightOffOn = 0;
int time_out = 1000; // время задержки

int temp_def_calc; // расчетная температура дэфа
int temp_def_delta_min = 2;
int temp_def_delta_max = 3;
int temp_cub_def_delta = 4;

SimpleTimer timer;

char auth[] = "***";
char ssid[] = "speakme";
char pass[] = "183461..";

BLYNK_CONNECTED()
{
  Blynk.syncAll();
}
BLYNK_WRITE(V6) //открыть
{
  buttl = param.asInt();
}
BLYNK_WRITE(V4) //закрыть
{
  buttr = param.asInt();
}
BLYNK_WRITE(V9) //открыть макс
{
  buttll = param.asInt();
}
BLYNK_WRITE(V10) //закрыть макс
{
  buttrr = param.asInt();
}
BLYNK_WRITE(V5) // вкл автоматики
{
  butt_auto_on = param.asInt();
}
BLYNK_WRITE(V8) // слайдер шага двигателя
{
  turn_temp = param.asInt();
}

void setup()
{
  mystepper.setMaxSpeed(200.0);
  mystepper.setAcceleration(300.0);
  mystepper.setCurrentPosition (0);     // Установить счетчик как текущую позицию.
  Blynk.begin(auth, ssid, pass);
 
  sensors.begin();

  timer.setInterval (50, butt); // считывание кнопок Blynk
  timer.setInterval (2000, sendBlynk); // отправка данных в Blynk
  timer.setInterval (10000, automatic); // запуск автоматической корекции двигателя по температуре
}

void sendBlynk()  // отправка данных в Blynk
{
  if (Blynk.connected() && mystepper.isRunning() == 0)
  {
//    Blynk.virtualWrite(V8, turn);
   
    sensors.requestTemperatures();
    temp_def = sensors.getTempCByIndex(0);
    temp_par = sensors.getTempCByIndex(1);
    temp_cub = sensors.getTempCByIndex(2);

if (millis() - time_reed_temp > time_out) // задержка после запроса датчикам
  {
    Blynk.virtualWrite(V1, temp_def);
    Blynk.virtualWrite(V2, temp_par);
    Blynk.virtualWrite(V3, temp_cub);
    time_reed_temp = millis();
  }

// Время с момента перезагрузки
  byte Minutes  = (((millis()+TimeLightOffOn)/1000UL)/60UL);
    Blynk.virtualWrite(V17, Minutes);
  }

  steps = mystepper.currentPosition(); // положение двигателя
/*  byte hi = highByte(steps); // старший байт
  byte low = lowByte(steps); // младший байт
  EEPROM.write(1, hi);  // записываем в ячейку 1 старший байт
  EEPROM.write(2, low); // записываем в ячейку 2 младший байт
  for (int addr=0; addr<1024; addr++)
  {
    byte val = EEPROM.read(addr); // считываем 1 байт по адресу ячейки
  }
    val = word(hi, low);
*/
  float angle = steps / 11.3216;
  Blynk.virtualWrite(V7, angle);    // 11,3215912208333 шагов на 1 градус
}

void loop()
{
  Blynk.run();
  timer.run();
  mystepper.run();
}

void butt() // ручное управление двигателем
{
  if (mystepper.isRunning() == 0)
  {
    mystepper.disableOutputs();
  }
  if (butt_auto_on == 0)
  {   
    turn = round (turn_temp * 11.3216);
    if (buttl == 1)
    {
      mystepper.move(turn);     // Переместиться в относительно указанное положение. Открыть
    }
    if (buttr == 1)
    {
      mystepper.move(-turn);      // Закрыть
    }
    if (buttll == 1)
    {
      mystepper.moveTo(turnm);  // Переместиться в абсолютно указанное положение против часовой, открыть вентиль.
    }
    if (buttrr == 1)
    {
      mystepper.moveTo(0);       // закрыть вентиль
    }
  }
}

void automatic() // запуск автоматической корекции положения двигателя по температуре
{
  // деф
  temp_def_calc = temp_cub - temp_cub_def_delta; //31-4=27
  if (butt_auto_on == 1) // && (temp_cub > 75))
  {   
    turn = round (turn_temp * 11.3216);
    if (temp_def_calc - temp_def >= temp_def_delta_max) //27-22=4
    {
      mystepper.move(turn*2); //открыть, темп дефа увеличить
    }
    if ((temp_def_calc - temp_def > temp_def_delta_min) && (temp_def_calc - temp_def < temp_def_delta_max)) //19-22=-3
    {
      mystepper.move(turn); //открыть, темп дефа увеличить
    }
    if (temp_def_calc - temp_def <= -temp_def_delta_max) //19-22=-3 = -3!
    {
      mystepper.move(-turn*2); //закрыть, темп дефа уменьшить
    }
    if ((temp_def_calc - temp_def < temp_def_delta_min) && (temp_def_calc - temp_def > -temp_def_delta_max))
    {
      mystepper.move(-turn); //закрыть, темп дефа уменьшить
    }
      mystepper.disableOutputs();
  }

  if (abs(temp_def_calc - temp_def) < temp_def_delta_min)
  {
    Blynk.setProperty(V1, "color", "#66ccff"); // голубой
  }
  if ((abs(temp_def_calc - temp_def) <= temp_def_delta_max) && (abs(temp_def_calc - temp_def) >= temp_def_delta_min))
  {
    Blynk.setProperty(V1, "color", "#ffff33"); // желтый
  }
  if (abs(temp_def_calc - temp_def) > temp_def_delta_max)
  {    
    Blynk.setProperty(V1, "color", "#ff3333"); // красный
  }
  // Пар
  if ((temp_par >= 78.3) && (temp_par <= 78.5))
  {
    Blynk.setProperty(V2, "color", "#66ccff"); // голубой
  }
  if ((temp_par > 78.5) && (temp_par <= 98))
  {
    Blynk.setProperty(V2, "color", "#ffff33"); // желтый
  }
  if ((temp_par < 78.3) || (temp_par > 98))
  {
    Blynk.setProperty(V2, "color", "#ff3333"); // красный
  }
}
/*void prints()
{
}*/
Сейчас у меня задача сохранить одну переменную в энергонезависимой памяти. Нашел про EEPROM, поковыряю сам. А вопрос вот в чем. Наверняка на сервере Blynk хранятся мои переменные? Можно их использовать в этом качестве? Срок хранения - месяц и более, пока устройство не используется.
 

Igorka

New member
При попытке скомпилировать такой код, компилятор ругается...
Код:
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "64ed973d132b4a3bb5.........";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Silver";
char pass[] = "00000000";

void setup()
{
  // Debug console
  Serial.begin(1152
  00);

  // Send e-mail when your hardware gets connected to Blynk Server
  // Just put the recepient's "e-mail address", "Subject" and the "message body"
  Blynk.email("your_email@mail.com", "Subject", "My Blynk project is online.");

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);
}

void loop()

В общем то проблема в этой строчке:
Код:
Blynk.email("your_email@mail.com", "Subject", "My Blynk project is online.");
Подскажите.Что не так?
--------------------------------------------------------------------------------------------------------------------------------
Ошибка в написании скорости порта дебаг консоли.Значение 115200 написано не в одну строчку, два нуля перенесено на другою строку...
 
Последнее редактирование:

Chatlanin

New member
При попытке скомпилировать такой код, компилятор ругается...

В общем то проблема в этой строчке:
Код:
Blynk.email("your_email@mail.com", "Subject", "My Blynk project is online.");
Подскажите.Что не так?
Скетч нормально компилится. Попробуйте обновить Blynk библиотеку.
 

Ol_3

New member
Пол дня мучаюсь. Подскажите где беда. Плата wemos d1 mini. Компьютер яблоко. Библиотеку blynk установил. Пример с миганием светодиодом работает, плата живая. При попытке загрузить пример esp8266_Standalone ошибка при компилировании. то одного файла не хватает, то другого. в итоге запнулся на
/Users/ol_3/Documents/Arduino/libraries/ESP8266WiFi/src/bearssl/include/bearssl/samples/client_basic.c:33:24: fatal error: sys/socket.h: No such file or directory
#include <sys/socket.h>

куда его записать?
 

D1M0N

New member
Нужна помощь , установил локальный сервер на orangepi , захожу на сервер через приложение , но не вижу токена , где мне его посмотреть?

Буду признателен за ответы сильно не пинайте.
Там шестеренка сверху (Project settings)
Ищите кнопку "Copy All" - auth tokens
Потом из буфера обмена ее можно вставить в текст

Также токен можно найти, зайдя на сервер https://192.168.1.100:9443/admin
свой ип есстно...
Там в юзерах покопайтесь и все найдете
 

D1M0N

New member
Поделюсь своим кодом для "погодной станции"
Wemos D1 mini + bmp180 + dht11
Локальный Блинк сервер на малине

Код:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

char auth[] = "----------------------";
char ssid[] = "----------------------";
char pass[] = "----------------------";

#define DHTPIN D4
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
SimpleTimer timer;
Adafruit_BMP085 bmp;

void sendSensor()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
float p = bmp.readPressure();

if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
}

Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);
Blynk.virtualWrite(V7, p/100);
}

void setup()
{

Serial.begin(9600);

if (!bmp.begin()) {
    Serial.println("Could not find BMP180 sensor at 0x77");
    while (1) {}
  }

Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080); // адрес вашего блинк сервера

dht.begin();

// данные обновляются каждые 10 сек
timer.setInterval(10000L, sendSensor);
}

void loop()
{
Blynk.run();
timer.run(); // Initiates SimpleTimer
}
 

D1M0N

New member
Единственной проблемой было в IDE Sloeber (Eclipse) с библиотекой SimpleTimer.
Некоторые скетчи упорно не компилятся с последними патчами, решается откатами на более ранние версии...
 

Вложения

mdul_

New member
Всем Привет! Подскажите новичку, залил всё по инструкции. Работает! Вот только один момент смущает: ESP после подачи питания все пины используемые в blynk переводит в "1" вне зависимости от состояния "Кнопки" в приложении. Так должно быть? Мне бы хотелось, что бы они оставались в "0".
Спасибо!
 
Сверху Снизу