• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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".
Спасибо!
 
Сверху Снизу