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

NODEMCU + LCD+BLYNK

Sergey0001

New member
Добрый день, подскажите новичку, задачи такие:
1) На NODEMCU (3шт) независимых друг от друга хочу подключить по 1 реле и ds18b20,чтобы реле вкл/выкл по заданной температуре. Заданную уставку температуры хочу отображать в BLYNK на LCD.
2) Возможность смены уставки температуры через приложение BLYNK.
3) Так же необходимо сделать переключатель в blynk авт.реж(по уставке) и ручной режим просто вкл/выкл реле.
Подскажите пожалуйста, как это возможно реализовать, либо ссылку на подобные темы. Выводить температуру и вкл/откл реле через blynk я умею, а вот по уставке нет.
 

IgorM

New member
Как раз над таким же примерно проектом работаю. Только кнопку не делал, потому как без надобности.
Плюсом у меня еще установлен датчик тока. Еще сообщения отправляются в телеграмм через бота. И обновление сделал по воздуху.
Я сам новичок, только учусь. может все это можно было как то лучше сделать, но у меня работает.


Код:
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define Relay2 14 //пин реле
boolean tr = true; //назначаем логическую переменную для однократной отправки сообщения о температуре

// персональные данные
char auth[] = "********"; //токен
char ssid[] = "*****";  //Имя точки доступа WIFI
char pass[] = "*******"; //пароль точки доступа WIFI

#define ONE_WIRE_BUS D3 // пин датчика d18b20

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
BlynkTimer timer1;

float temp2; //переменная температуры
int tempConst2 = 10; //температура по умолчанию
int gistT = 1; //задаем дельту
float i; //показания датчика тока
float I; //сила тока

void sendTemps(){   //проверка температуры
  sensors.requestTemperatures();
  temp2 = sensors.getTempCByIndex(0);
  Serial.println(temp2);
  Blynk.virtualWrite(V1, temp2);
}
BLYNK_WRITE(V4){    //считываем данные со слайдера
  tempConst2 = param.asInt();
}
void checktemp(){   //сравниваем заданную и текущую температуру
  if (temp2 >= tempConst2 + gistT) //если температура в норме
  {
    digitalWrite(Relay2, HIGH); //выключаем реле
    Serial.println(tempConst2);
    if (tr == true)
    {
      Blynk.email("*****@etlgr.com", "Температура в норме", " ");
      Serial.println("_HIGH_");
      tr = false; //присваиваем переменной обратное значение чтобы сообщение больше не отправлялось
    }
  }
  else if (temp2 <= tempConst2 - gistT) // если температура нниже
  {
    digitalWrite(Relay2, LOW); //включаем реле
    Serial.println(tempConst2);
    if (tr == false) // проверяем логическую переменную
    {
      Blynk.email("*****@etlgr.com", "Низкая температура", " ");
      Serial.println("_LOW_");
      tr = true; //меняем значение переменной чтобы больше не отправлялось сообщение
    }
  }
}
void amper(){       //датчик силы тока
  i = analogRead(A0);
  I = (i - 491) / 12,178;
  if (I < 0){
    I = I * - 1;
  }
  Serial.println(I);
  Blynk.virtualWrite(V2, I);
}
void setup(){       //настройки
  pinMode(Relay2, OUTPUT);        // пин реле выход
  Serial.begin(9600);             // скорость сериал порта
  Blynk.begin(auth, ssid, pass);  //старт блинка
  Blynk.syncAll();                // синхронизация блинка
  sensors.begin();                // старт датчика температуры
  ArduinoOTA.begin();             // старт обновления по воздуху

  // Таймеры на запуск функций
  timer1.setInterval(3000L, sendTemps); //опрос d18b20
  timer1.setInterval(3000L, checktemp); //сравнение текущей температуры с заданой
  timer1.setInterval(1000L, amper);     //амперметр
}

void loop(){
  ArduinoOTA.handle();
  Blynk.run();
  timer1.run();
}
 

Sr.FatCat

Member
@IgorM, у меня тоже похожий проект, только управление 2-мя реле (обогрев и вентиляция) и датчики беспроводные.
Понравилось, как у вас сделано лаконично и прозрачно. Единственное, посоветую вместо syncAll сделать
BLYNK_CONNECTED(){....}
Тогда при каждом переподключении будут обновляться данные блинка и программа. Не знаю, как у Вас, а у меня переподключений более 7000 за 2-е суток работы.
Не знаю, кто виноват - провайдер, сервер блинк, или мой код - но факт остается фактом: связь предельно не стабильная и зависит от времени суток.
 

IgorM

New member
@IgorM, у меня тоже похожий проект, только управление 2-мя реле (обогрев и вентиляция) и датчики беспроводные.
Понравилось, как у вас сделано лаконично и прозрачно. Единственное, посоветую вместо syncAll сделать
BLYNK_CONNECTED(){....}
Тогда при каждом переподключении будут обновляться данные блинка и программа. Не знаю, как у Вас, а у меня переподключений более 7000 за 2-е суток работы.
Не знаю, кто виноват - провайдер, сервер блинк, или мой код - но факт остается фактом: связь предельно не стабильная и зависит от времени суток.
Спасибо, поизучаю.
У меня тоже было время когда отваливался часто, но опытным путем установил, что в этом был виноват частый опрос датчика температуры. Поставил раз в 3 секунды и все стало лучше.
 

AndrF

Active member
А давайте интерфейсики покажем...

Screenshot_20171031-143741.png

У меня тоже было время когда отваливался часто, но опытным путем установил, что в этом был виноват частый опрос датчика температуры. Поставил раз в 3 секунды и все стало лучше.
Зачем так часто? Раз в минуту - более чем достаточно.
 

Sr.FatCat

Member
А давайте интерфейсики покажем...
Интерфейсики у нас как из одной песочницы :)
Screenshot_20171031-152720.png Screenshot_20171031-152740.png Screenshot_20171031-152808.png

Как вам удалось добиться, чтобы установленную температуру на графике тоже показывал?
Просто прописать туда пин виджета недостачно? Делаете на него еще digitalWrite в коде?
Зачем так часто? Раз в минуту - более чем достаточно.
Так, то понятно. В OneWire и библиотеке d18b20 все изобилует делаями, вот Blynk.run() и не достаточно часто крутился.
У меня дело хуже - у меня то, не то что делаев и библиотек никаких нет - все в ручную, по прерыванию. У меня одни if. Единственный цикл
максимум на 250 значений, которые обрабатываются +-, да >> << тормозить больше чем на 2-3мкс ничего не может
 

AndrF

Active member
Просто прописать туда пин виджета недостачно? Делаете на него еще digitalWrite в коде?
Если точнее, то Blynk.virtualWrite().

У меня управление только газовым котлом - большего в однушке и не нужно. Все живет в часах.

IMG_20171011_085446.jpg

Так, то понятно. В OneWire и библиотеке d18b20 все изобилует делаями
Зачем? Запустил преобразование, через секунду считал результат - никакие delay мне для этого не нужны - я и так знаю что прошла секунда. Точнее полсекунды, так как на один из PIN-ов я подаю сигнал меандра от DS3132 и его просто проверяю. Как итог - dalay-ев нет вообще.
 

Sr.FatCat

Member
Если точнее, то Blynk.virtualWrite().
Т.е. я правильно понимаю, что это должно выглядеть вот так безумно:

Код:
BLYNK_WRITE(V6) {
    temperature =  param.asInt();
       Blynk.virtualWrite(V6, temperature);
}
Зачем? Запустил преобразование, через секунду считал результат - никакие delay мне для этого не нужны - я и так знаю что прошла секунда. Точнее полсекунды, так как на один из PIN-ов я подаю сигнал меандра от DS3132 и его просто проверяю. Как итог - dalay-ев нет вообще.
Вы не используете библиотек OneWire.h и DallasTemperature.h совсем? Если используете - посмотрите коды их .cpp - шников и поймете, что я имел ввиду про delay
 

AndrF

Active member
Т.е. я правильно понимаю, что это должно выглядеть вот так безумно:
Нет. Blynk.virtualWrite() выполняется в loop() раз в минуту.

Вы не используете библиотек OneWire.h и DallasTemperature.h совсем? Если используете - посмотрите коды их .cpp - шников и поймете, что я имел ввиду про delay
Основная задержка там - это задержка преобразования - до 750 ms. Но вас ведь никто не заставляет ей пользоваться. Пишите:

В setup():

sensors.setWaitForConversion(false);

В loop() раз в минуту:

sensors.requestTemperatures();

И еще через секунду читаете:

CurrTemp = sensors.getTempCByIndex(0);

Все остальное - мелочь и выполняется быстро.
 

IgorM

New member
Как вам удалось добиться, чтобы установленную температуру на графике тоже показывал?
Просто прописать туда пин виджета недостачно? Делаете на него еще digitalWrite в коде?
По моему это просто в интерфейсе блинка делается. Добавляете еще одну переменную, присваиваете ей пин и все.
 

IgorM

New member
У меня управление только газовым котлом
Я пока опасаюсь такие серьезные и опасные устройства на такой микроконтроллер вешать, а если что-то пойдет не так? Лучше уж пусть автоматика котла всем заведует - это ее прямая обязанность, а ЕСП пускай наблюдает и мне сообщает.
Все живет в часах.
Отлично получилось, это специальный корпус или сами делал?
 

AndrF

Active member
Я пока опасаюсь такие серьезные и опасные устройства на такой микроконтроллер вешать, а если что-то пойдет не так? Лучше уж пусть автоматика котла всем заведует - это ее прямая обязанность, а ЕСП пускай наблюдает и мне сообщает.
Автоматика не сможет так поддерживать температуру в комнате. С котлом значительно лучше. Да и ничего там сложного нет - у котлов предусмотрен релейный вход для этого дела.

Отлично получилось, это специальный корпус или сами делал?
Обычный, покупной. Инструменты - дрель и напильник...
 

leha889

New member
Здравствуйте ,помогите пожалуйста есть блок sonoff th16 я его прошил на blynk ,все подключается показывает темпр. и влажность.Но я ни как не могу настроить виджеты чтоб при превышение темпр. например 26 выключалось реле .Если темпр.V5 ,влажность V6 а кнопка V20 .Подскажите пожалуйста если можно поподробней как сделать
 
Сверху Снизу