BlynkTimer

Приведенный код работает как надо. Мне нужно было регулировать включение светодиода в процентах от 0 до 100 с периодом в 8 секунд. Первый таймер мне регулировать не надо. То есть если задано 25 процентов, то 2 секунды горит, 6 не горит.
Таймер наблюдателя делать не стал, просто в момент изменения числа процентов старый таймер удаляется и запускается новый с введенными параметрами. Мне кажется это оптимальный вариант. :slight_smile:
Я правильно понимаю, что таймеры работают только во время действия loop()? Если долго выполняется подпрограмма, таймер в этот момент не работает.

BlynkTimer is independent of server connection, so as long as there is nothing blocking the underlying void loop() processes, like delay(), then timers should “interrupt” other code as needed.

Доброй ночи, собственно зачем такое сложное управление светодиодом?

Ну, в реальности это не светодиод, а соленоидный клапан. Регулировка скорости вытекания жидкости.

1 Like

И все таки.
Есть функция восстановления связи с сервером при обрыве.

void reconnectBlynk(){       // функция которая проверяет соединение

  if (!Blynk.connected()) { //если соединения нет то 
    if (Blynk.connect()) {  // конектимся
      BLYNK_LOG("Reconnected"); Serial.println ("---rec---");   // выводим в лог   
      } else {
      BLYNK_LOG("Not reconnected"); // выводим в лог     
             
    }
  }

Если произошел разрыв, то эта функция может выполнятся несколько секунд. В это время все таймеры не работают. Это понятно.
Но, когда функция завершится, все пропущенные срабатывания таймеров стремятся выполнится мгновенно. А этого можно избежать?

Why not? BlynkTimer is a “clone/port” of SimpleTimer and is NOT affected with a server disconnection… as long as timer.run() is still in the void loop()

Сервер не при чем. Несколько секунд выполняется только функция reconnectBlynk(), управление на loop() не передается. Таймеры не работают.

Well, whatever your function is trying to determine is related to the server… at least that is what those commands are in reference to… boolean checks of server status.

You topic is getting confusing… you wanted to know why the timer seemed to be having pauses before acting like it was catching up. That can be explained by bad code, improper use of timers or even older library versions.

Then you wanted to know about ways to flash an LED then later a solenoid valve.

But now you are working with some form of strange connection management that may be locking up your sketch? While I am not clear on what that function is supposed to do, aside from print connection status (which I think can be done simpler) I do not see any cyclical conditions that could cause any blocking issues.

Я буду вам очень благодарен, если вы дадите ссылку на пример правильной организацией подключения Blynk к wifi. С проверкой и переподключением, если произошел разрыв связи.
С таймерами суть в том, что если какая-то функция выполняется долго (например функция вывода на экран занимает у меня 500мс), то во время выполнения этой функции, все функции, которые выполняются по таймерам, работать не будут. Далее, как я уже писал.
Библиотеку Blynk обновил.
Попробую показать. Вод код:

    void setup() {
      Serial.begin(9600);
      Serial.println(" ");
      Serial.println("Launch");


      setSyncInterval ( 10 * 60 );
      timer.setInterval(5000L, t3000ms);
      timer.setInterval(50L, t50ms);
        
    }
    void t3000ms() {
     Serial.println( "-----");
     unsigned long t = millis();
     while (( millis() - t ) < 3000 );
     Serial.println( "----3000ms");
    }
    void t50ms() {
      unsigned long t = millis();
      Serial.println( "50ms");
    }
    void loop() {
       if (Blynk.connected()) {
        Blynk.run(); // Запускаем Блинк
       }
       timer.run(); // Запускаем таймер
     unsigned long t = millis();
     while (( millis() - t ) < 10 );
     Serial.print( millis() - t );
     Serial.println( " loop");
    }

Вот вывод:

>         50ms
>         10 loop
>         10 loop
>         10 loop
>         10 loop
>         10 loop
>         -----
>         ----3000ms
>         50ms
>         10 loop
>         50ms
>         10 loop
>         10 loop
>         10 loop
>         10 loop
>         50ms
>         10 loop
>         10 loop
>         10 loop
>         10 loop
>         11 loop
>         50ms

Видно, что во время выполнения функции t3000ms() функция t50ms() не выполняется.
После выполнения функции t3000ms() функия t50ms() выполняется начинает “догонять”.

I already did provide a link (at the start of this topic) to one such option that I have made.

The issue is that a while() loop is a blocking loop, as in nothing else is allowed to happen until it finishes whatever it is doing… the solution is to find other ways to do the job with non-blocking programming methods.

A crude option is to include Blynk.run() and timer.run() commands within the while() loop… but doing so, at least with the Blynk.run() can apparently cause other memory issues if abused.

Вот это вариант, спасибо.
А если такой возможности нет, как в приведенной функции reconnectBlynk() (она реально может выполняться секунд 10). Тогда наверно имеет смысл останавливать таймеры в начале функции, и запускать их в конце? Но команды остановить все таймеры сразу нет. Только по одному.

В вашем примере не увидел как Blynk будет восстанавливать связь при ее обрыве.
Если я уберу из своего кода reconnectBlynk() (вызывается тоже по таймеру 30 сек), то при обрыве связи связь сама не восстановится. Если можно, приведите код.

with the command…

Blynk.connect();  // Try to reconnect to the server

If for some reason it is the WiFi that is not reconnecting (but I haven’t had that issue, even with router reboots) then one could also ad a preceding command like…

WiFi.begin(ssid, pass);  // Non-blocking if no WiFi available

Спасибо.
У меня используется ESP8266_Lib.h, BlynkSimpleShieldEsp8266.h
Какой неблокирующий код для WiFi будет для этих библиотек?
Сейчас в setup() использую

EspSerial.begin(ESP8266_BAUD);
Blynk.config(wifi,auth);
Blynk.connectWiFi(ssid, pass);
Blynk.connect();

И еще. Я понимаю, что этого не может быть, но проверял много раз.
Вот код в setup(), где устанавливаются таймеры.

setSyncInterval ( 10 * 60 );
timer_reconnectBlynk = timer.setInterval(30155L, reconnectBlynk);
timer_showvaluse = timer.setInterval(2031L, showvaluse);
timer_induction = timer.setInterval (3600387L, induciton);
timer.setInterval (501, read_sensor);
timer.setInterva`l (203, blynkprint);

Любой таймер, который указан в списке первым ( в данном случае timer_reconnectBlynk ), работать не будет.

You have to connect to WiFi before you can connect to Blynk :stuck_out_tongue_winking_eye:

I do seem to recall issues with named timers (using ID) but that seems to no longer be an issue for me…

Make sure you are fully updated with latest versions of ESP Core (stable is 2.4.2), Blynk Library (0.5.4), App and if used Local Server.

Я использую Mega 2560 c ESP8266 в качестве модуля связи. Зачем мне ESP Core? Он не был установлен, теперь установил 2.4.2 - ничего не изменилось.
Blynk 0.5.4 стоит, приложение обновлено, сервер не использую.


Blynk.connectWiFi(ssid, pass);
Blynk.config(wifi,auth);

Так не работает.

I mentioned it in case you did need it… Although using an ESP as shield was inferred, you never mentioned exact hardware used before.

Well… don’t forget to search around this forum for relevant keywords… I use a basic Mega ESP-01 sketch that I posted earlier this month…

Я в своем коде использую один таймер, на 1 сек, у меня LAN соединение. При вызове таймера инструментирую переменную
a = a + 1; //инкрементируем счетчик времени
if (a>59) a = 0;
Разбиваю выполнение функций по разным значениям переменной а.
Например - измерение температуры - раз в минуту

//-----------------------измеряем влажность и темпиратру AM2302-----------------------------------
  if(a==30)   //прошло 60 секунд - измеряем темпиратуру (a - изменяеться от 0 до 60ти)
  { 
    sensors_event_t event;  
    dht.temperature().getEvent(&event);
    if (!isnan(event.temperature)) 
    {
       Blynk.virtualWrite(V7, event.temperature);
       Serial.print("tempiratura = ");
       Serial.println(event.temperature);
    }
  
    dht.humidity().getEvent(&event);
    if (!isnan(event.relative_humidity)) 
    {
      Blynk.virtualWrite(V8, event.relative_humidity);
      Serial.print("vlashnost   = ");
      Serial.println(event.relative_humidity);
    }
  }

каждые 30 секунд измеряем потребление электричества

if(a==21 || a==51)  //выводим мнгновенное потребление в ваттах с усреднением за 30 секунд
  {
    //Serial.print("30 sec = ");
    //Serial.print(impuls_counter_30sec);
    //Serial.println(" impuls");
    potreblenie_vatt = impuls_counter_30sec*120/1.6;
    Blynk.virtualWrite(V56, potreblenie_vatt);
    impuls_counter_30sec = 0;
  }

  if(a==22 || a==52)  //выводим общее потребление энергии в киловаттах
  {
    vsego_kvt = impuls_counter;
    vsego_kvt = vsego_kvt/1600;
    Blynk.virtualWrite(V54, vsego_kvt);
    //Serial.print("impuls_counter = ");
    //Serial.println(impuls_counter);
    //Serial.print("vsego_kvt = ");
    //Serial.println(vsego_kvt);

    vsego_tenge = vsego_kvt * 19;
    Blynk.virtualWrite(V55, vsego_tenge);
  }

И так далее. Не переживаю о пересечении таймеров.

Подсчитал, вывод одной переменной через Blynk.virtualWrite() занимает около 70 мс. Это нормально?

Тоже подсчитывал время выполнения общения с сервером blynk. При работе с LAN интернетом проблем не возникает, даже не было мысли выполнить измерение. Но запустив BLYNK на GSM модуле SIM900 заметил что операции общения с сервером занимают очень долгое время. В частности на включение\выключение светодиода led2.on(); или led2.off(); уходит 300 миллисекунд !!! . Это быстрая операция, на отправку данных , например Blynk.virtualWrite(V24, 4); уходит еще больше времени. Вот такая проблема при работе через GSM канал.

если надо быстрей то выкидывай мегу, и бери arm чип, типа есп8266 или есп32.
также рекомендую использовать команду switch чтоб ifы не плодить