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

Нужна помощь Управление уведомлениями от wemos

Moseich

Member
Собрал девайс для контроля и управления котлом. Несколько дней проверял дома ( котел в 100км) - все работает.
Но мне не нравится то, что уведомления о предельном значении параметра не заканчиваются, идут каждую секунду . Можно ли программно квитировать их? Т.е. нажав кнопку остановить этот поток?
Код:
//KOTEL  пины  V2, V3  и V4 для датчиков.E_MAIL 

/* WEMOS. 3 датчика DS18В20  + RELE _ 19 апреля 2019

RELE1_GPIO=D5 и RELE2_GPIO=D6 используются в регуляторе температуры.

реле активируются сигналом "0".  Замыкающие контакты   RELE1   включены

вместо перемычки  котла через дополнительные контакты.  RELE1  требует дополнительного

разрешения на включение.   Для этого будет использовано RELE2 и стороннее реле,

управляемое пo SMS внешним GSM девайсом,  поскольку в надежности BLYNK пока нет уверенности*/

#define BLYNK_PRINT Serial

//не надеюсь на значения задействованных GPIO при старте, поэтому

//присваиваю такие , какие хочу получить при старте для блока из 2 реле

 const uint8_t RELE1_GPIO=D5;       //GPIO 14

 const uint8_t RELE1_ON=1;     

 const uint8_t RELE1_OFF=0;

 

const uint8_t RELE2_GPIO=D6;       //GPIO 12     



#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h>

#include <OneWire.h>

#include <DallasTemperature.h>

#include <SimpleTimer.h>



#define ONE_WIRE_BUS D4    //WEMOS пины D3 и D2  нельзя использ!!!!

int alarmPin = 7; //******************

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

//определяю пороги для регулятора температуры в градусах(в двух режимах):

int tmin=15;  // 7 - 9градусов - это поддерживаемый минимум температуры котловой воды

int tmax=17; //15-17гр - это заблаговременный (за 4 часа до выезда на дачу) нагрев



char auth[] =         

      char ssid[] = "";

      char pass[] = " ";



BlynkTimer timer;  // контроль непрерывности работы девайса.  

void myTimerEvent(){ 

Blynk.virtualWrite(V8, millis() / 2000);}



void setup()

{ 

Serial.begin(9600);

Serial.println(ESP.getFreeHeap());

Blynk.begin(auth, ssid, pass);

sensors.begin();

//Настройка функции, которая будет вызываться каждую секунду(timer)

timer.setInterval(1000L, myTimerEvent);

 timer.setInterval(2500L, sendTemps);

pinMode (RELE1_GPIO, OUTPUT);

pinMode (RELE2_GPIO, OUTPUT);
}

void sendTemps()
{   

sensors.requestTemperatures();

float temp = sensors.getTempCByIndex(0);

float temp1 = sensors.getTempCByIndex(1);

float temp2 = sensors.getTempCByIndex(2);

delay(2000);

Serial.println(temp );

Blynk.virtualWrite(V3, temp );    delay(100);

Blynk.virtualWrite(V4, temp1 );

Blynk.virtualWrite(V2, temp2 );

//регулятор  температуры

if ( temp <  tmin)

  digitalWrite(RELE1_GPIO,RELE1_ON);

 if ( temp  > tmax)

  digitalWrite(RELE1_GPIO,RELE1_OFF); 
}

  void mail() 
{
 // УВЕДОМЛЕНИЯ на смартфон *************************

float temp = sensors.getTempCByIndex(0);

if(temp <= 9)
  {
    Blynk.email(«……@mail.ru","Температура обратки менее 9C!"); // вызов API Blynk для отправки EMAIL
    Blynk.notify("  обратка  < 9C!!!»); // вызов API Blynk для отправки уведомлений
  }
}
void loop()
{
  Blynk.run();
sendTemps();
mail();
timer.run();
}
 

Сергей_Ф

Moderator
Команда форума
@Moseich вы программу сами писали? Что у вас шлёт предельные значения каждую секунду? Вот этот кусок кода и отключите при "нажатии кнопки".
Или вы хотите готовый скетч?
 

Moseich

Member
@Moseich вы программу сами писали? Что у вас шлёт предельные значения каждую секунду? Вот этот кусок кода и отключите при "нажатии кнопки".
Или вы хотите готовый скетч?
Я копипастер , слепил сам этот скетч из разных. Поэтому и попросил помочь. Спасибо за подсказку- понял что отключить надо таймеры. Кнопку я пропишу в приложении и привяжу к физическому пину, например D0. при нажатии на этом пине появится нужный уровень - тоже понимаю. но как сформулировать условие отключения куска кода не могу домыслить-старею.
if D0 = 0 { timer.setInterval = работает }
if D0 = 1 {timer.setInterval = не работаеt}
 

Сергей_Ф

Moderator
Команда форума
Кнопку я пропишу в приложении и привяжу к физическому пину, например D0.
зачем это? "Привязка"нужна только для какого то физического действия - сработка реле, зажигания светодиода.

Могу предположить, что шлёт у вас
  • timer.setInterval(1000L, myTimerEvent);
Вот можете этот таймер отключить вообще или задать ему интервал побольше.

Почитайте
 
Последнее редактирование:

Moseich

Member
зачем это? "Привязка"нужна только для какого то физического действия - сработка реле, зажигания светодиода.

Могу предположить, что шлёт у вас

Вот можете этот таймер отключить вообще или задать ему интервал побольше.

Почитайте
Спасибо , буду вникать! В основном я "настраиваю свои" скетчи методом тыка, к сожалению.
 

nikolz

Well-known member
Спасибо , буду вникать! В основном я "настраиваю свои" скетчи методом тыка, к сожалению.
а изучить основы лень мешает, или гордость не позволяет?
--------------
вот в этом условии
  1. if(temp <= 9)
  2. {
  3. Blynk.email(«……@mail.ru","Температура обратки менее 9C!"); // вызов API Blynk для отправки EMAIL
  4. Blynk.notify(" обратка < 9C!!!»); // вызов API Blynk для отправки уведомлений
  5. }

добавьте флаг нажатия кнопки
флагом управляйте от внешней кнопки
когда флаг false условие не будет исполняться
условие будет записано так
if((temp<=9)&& flag)
{
 

Сергей_Ф

Moderator
Команда форума
@nikolz вы уверены, что посоветовали правильно? У ТС в этом случае не будет уведомления о критической температуры. А он хочет избавиться от информирования о предельных значениях, которые идут каждую секунду.
 

nikolz

Well-known member
@nikolz вы уверены, что посоветовали правильно? У ТС в этом случае не будет уведомления о критической температуры. А он хочет избавиться от информирования о предельных значениях, которые идут каждую секунду.
я понял так, что если температура меньше 9 то посылает сигнал. меньше 9 это критическое значение или нет?
далее чел хочет чтобы по кнопке отключать это извещение
в приведенном условии сообщается о том что темп меньше
мы его и блокируем по кнопке
если есть другое критические то блокировка делается аналогично.
возможно что-то пропустил.
 

Сергей_Ф

Moderator
Команда форума
@nikolz вы невнимательно посмотрели. ТС хочет отключить сообщения, которые посылает программа каждую секунду. Это делает таймер, запуская процедуру myTimerEvent. Что там посылается - я не знаю, но понял именно так. А уведомление опускание ниже предела температуры, отключать вряд ли надо. Смысл всего этого именно получить уведомление об этом.
 

Moseich

Member
Сергей_Ф, С таймерами я разобрался . И мне показалось, что Вы не поняли моего вопроса.
Уведомления приходят только по условию и мне нужно, чтобы это происходило однократно.
Да, таймер тут совсем не нужен, т.к. с каждым новым циклом сигнал заново формируется:
if(temp <= 9)
{ Blynk.notify(" обратка < 9C!!!»);
}

Как правильно записать следующую команду типа disable (Blynk.notify)-
остановить дальнейшее формирование синала?
 

Moseich

Member
Пока сочинял уже появились два сообщения.
я понял так, что если температура меньше 9 то посылает сигнал. меньше 9 это критическое значение или нет?
далее чел хочет чтобы по кнопке отключать это извещение
в приведенном условии сообщается о том что темп меньше
мы его и блокируем по кнопке
...
оПока писал появились новые сообщения.
Да, 9 градусов - это околокритическое состояние котла. При 7 градусах в обратке он переходит в неуправляемый режим спасения самого себя от разморозки, который нельзя выключить. ( это я про свой котел Виссман, другими не интересовался). Смартфон всегда при мне и я могу дистанционно либо включить доп нагрев, либо отключить его питание.
 

Moseich

Member
@nikolz вы невнимательно посмотрели. ТС хочет отключить сообщения, которые посылает программа каждую секунду. Это делает таймер, запуская процедуру myTimerEvent. Что там посылается - я не знаю, но понял именно так. А уведомление опускание ниже предела температуры, отключать вряд ли надо. Смысл всего этого именно получить уведомление об этом.
Я отключил эти таймеры (я же их скопипастил) и ничего не изменилось
 

Moseich

Member
а изучить основы лень мешает, или гордость не позволяет?
--------------
вот в этом условии
  1. if(temp <= 9)
  2. {
  3. Blynk.email(«……@mail.ru","Температура обратки менее 9C!"); // вызов API Blynk для отправки EMAIL
  4. Blynk.notify(" обратка < 9C!!!»); // вызов API Blynk для отправки уведомлений
  5. }

добавьте флаг нажатия кнопки
флагом управляйте от внешней кнопки
когда флаг false условие не будет исполняться
условие будет записано так
if((temp<=9)&& flag)
{
Изучать основы в 74 года я конечно пытаюсь, но память сильно подводит. Именно из-за этого я стал изучать ардуино, как только перестал работать в прошлом году. Чтобы тренировать извилины, При чем тут гордость.
 

Сергей_Ф

Moderator
Команда форума
@nikolz извинююсь, это я не так понял автора оказывается.
@Moseich а кнопка, то вам какая нужна? аппаратная или на экране смартфона?
Как вы отключили таймер и как вы увидели, что ничего не происходит? У вас два таймера. Один отправляет температуру, каждые 2500мс, другой каждую секунду вызывает процедуру для поддержания связи, как я понял.
Вам надо сделать как сказал @nikolz - по нажатию кнопки присвоить flag значение false, тогда уведомления больше не придут до сброса этого flag обратно в true.
 
Последнее редактирование:

nikolz

Well-known member
Изучать основы в 74 года я конечно пытаюсь, но память сильно подводит. Именно из-за этого я стал изучать ардуино, как только перестал работать в прошлом году. Чтобы тренировать извилины, При чем тут гордость.
У вас очень сырой алгоритм.
Алгоритм это не программа, а последовательность действий приводящая к желаемому результату.
алгоритмы пишутся на том языке, на котором чел умеет мыслить.
В данном случае полагаю это русский язык. Вы его знаете достаточно хорошо.
Когда напишите алгоритм то наступит время перевода его в программу
Это как перевод рассказа с одного языка на другой - можно сделать со словарем. можно скопировать из него целые фразы.
Но сначала пишется рассказ, а потом перевод.
----------------------------------------------------------
Тренировка извилин эффективнее продляет жизнь, чем тренировка мышц.
 

nikolz

Well-known member
относительно программы
у таймеров есть два режима - автомат и однократно
и еще таймер можно остановить и снова запустить.
Останавливать и запускать можно по кнопке.
 

Moseich

Member
nikolz, Я согласен с Вашими тезисами, но у меня возникла срочная необходимость заменить работавший 8 лет девайс из телефона сименс С25 и интерфейса ( аналог сегодняшних GSM модулей охраны). Он полностью управлял котлом и поливом на даче. Две недели назад я понял, что не смогу восстановить его и решил заменить ардуино-есп. И все это время копипастил. Не до красоты алгоритма - главное чтобы работал.
Завтра уезжаю - посевная начинается! Спасибо, я буду следовать Вашим советам.
 
Сверху Снизу