BLYNK
HOME       📲 GETTING STARTED       📗 DOCS       ❓HELP CENTER       👉 SKETCH BUILDER

Вопрос по синхронизацию

Есть устройство (счетчик) на ESP. Так вот суть вопроса в том, что счетчик считает что то не важно. И этот показатель передает на сервер (цифру) и она хранится там до обновления ведь так? Так вот а бывает такое что счетчик отключается по причине питания и при подаче питания начинает считать с нуля. Вот как лучше и что прописать в функции Conected когда счетчик снова подключается к серверу чтобы он обновил эту информацию из того виджета куда он пишет? пробовал BLYNK_WRITE(V6) засунуть в коннектед ругается что не объявлен индификатор и т.д. тогда как? Заранее спасибо

Blynk.syncVirtual вызовет BLYNK_WRITE со значением виджета.
https://docs.blynk.cc/#blynk-main-operations-state-syncing

Эм а он как бы не стягивает наоборот? Т.е. мне нужны данные с виджета куда обычно идет запись. Т.е. как бы наоборот. Т.е. мне надо в Blynk.syncVirtual выбрать мой виртуальный пин по которому я передаю на сервер? а как он узнает в какие переменные мне эти данные надо загрузить?
Т.е. смотрите этот метод работает да но только в том случае допустим когда у меня на сервере есть какая то кнопка например и при подключении устройство берет эти значения и обновляет с сервера их статус или значение. Но когда у меня изначально виджет для того чтобы принимать значения и с него надо стянуть их при подключении метод не пашет. Какие еще варианты?

Есть виджет типа value display (V0) я по таймеру передаю переменную Cold каждые 30 сек например:
void Timer() {Blynk.virtualWrite(V0, Cold);}
При перезапуске устройства надо чтобы оно начало считать с тех же цифр что последний раз передала? поняли? т.е. в смом начале она должна обновить с сервера переменную cold. Теперь думаю понятнее

В доках вроде нормально описано все.

BLYNK_CONNECTED() {


    if (isFirstConnect) {
      Blynk.syncVirtual(V0);

      isFirstConnect = false;
    }
  }

BLYNK_WRITE(V0) //синхронизация
{
 Cold = param.asInt();
}

Вы по моему не поняли( а жаль. Что вы за пример привели сами можете прокомментировать? вы выше код видел как все построено? функция синхронизации работает в одну сторону а не в обе! А у меня вопрос как разово сделать чтение с помощью BLYNK_WRITE в том же например BLYNK_CONNECTED???

BLYNK_CONNECTED вызывается как раз когда создается подключение разово. и мне надо считать с виджета куда пишется обычно. блин крч то что вы привели не пашет и все(

тот код который я написал как раз этим и занимается, при соединении с сервером разово вызывает функцию BLYNK_WRITE

Ну как бы не разово))) может вы там ошибку допустили? скобку там забыли нет?

Т.е. щас это выглядит как простая функция BLYNK_WRITE которая например висит на кнопке например. она никак не завязана с BLYNK_CONNECTED. Ну это как я вижу. Почему она вызовется разово? потмоу что типа в коде есть описание на V0 на передачу поэтому типа при синхронизации он его обновит так? ну попробую. Т.е. мне просто нужен типа свободный пин виртуальный чисто для этого обмена как я понял.?

нифига не понял что вы там написали, но для этой ситуации вроде достаточно просто делать синхронизацию при подключении и делать с данным что вам нужно. я так всегда делал проблем не было.

Да вв не поняли))) Ну и ладно. Пока тот пример что привели не пробовал но как попробую отпишу

Вот мой полный код.
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
# define OUT 15
# define PORT1 13
# define PORT2 12
# define PORT3 14
# define LED 2
# define SDA_port 4
# define SCL_port 5

BlynkTimer timer;

float kWTm=0;
float kWT=0;
int Impuls=0;
char auth[]="***********";       //Ключ для подключения к WiFi
char ssid[]="******";                                  //Логин для подключения к WiFi
char pass[]="********";                               //Пароль для подключения к WiFi
 
void setup(){
     pinMode(PORT1, INPUT_PULLUP);
     pinMode(PORT2, INPUT);
     pinMode(PORT3, INPUT);
     pinMode(OUT, OUTPUT);
     pinMode(LED, OUTPUT);
     digitalWrite(LED,LOW);
     attachInterrupt(PORT1, FNC_COUNT, RISING);
     timer.setInterval(60000L, FNC_UPDATE);           
     Blynk.begin(auth, ssid, pass);}

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

//Передача "Вт" на сервер каждую минуту
void FNC_UPDATE(){
     Blynk.virtualWrite(V0, kWTm); 
     Blynk.virtualWrite(V1, kWT);
     kWTm=0;}
     
//Посчет Вт счетчика по импульсам
void FNC_COUNT(){
     Impuls++; 
     if (Impuls==32){
        kWT=kWT+0.010; 
        kWTm=kWTm+0.010;}}
        
//Корректировка показаний при необходимости  
BLYNK_WRITE(V2){kWT=param.asFloat();} 

//Синхронизация значения
BLYNK_CONNECTED(){Blynk.syncVirtual(V1);}

Вопрос еще раз если делать вот так синхронизацию, то он вызывает как я понял Blynk.virtualWrite(V1, kWT); и перезаписывает при включении 0. А мне надо чтобы он как раз с V1 при подключении записывал данные в kWT наоборот как бы.

запрашиваешь V1 а пишешь V2, тут явно ошибка, пин который синхронизируешь должен быть такой же как и в Blynk_write

Тут нет ошибки. Крч смотрите
Есть три виджета:

  1. Chart (вывод Вт каждую минуту) - V0
  2. Value display (для вывода киловатт) - V1
  3. Num input (для корректировки показаний киловатт) - V2

Поняли? Т.е. я каждую минуту кидаю значение в V0 и в V1 и они остаются на сервере до следующего обновления так?

Вот а если пропадет питание на устройстве например и оно перезапустится то оно отправит обнуленное значение на сервер и начнет считать снова. Вот мне надо что бы перед началом счета оно брало данные с сервера последние?

Вы запрашиваете синхронизацию пин V1, но не пишете обработчик для него. просто замените V2 на V1 или скопируйте с V2 обработчик. вам в самом начале скинули пример но вы даже не полностью его скопировали

Да ну ясно что нет обработчика. Это я типа написал как вы мне писали применить просто синхронизацию. Вот я вам и показал что это не совсем то. Крч мне надо дописать например взять еще одни виртуальный пин так? Например V3 и сделать по нему чисто присвоение BLYNK_WRITE(V3){kWT=param.asFloat();}
Но тогда как программа поймет что мне надо стянуть данные с V1??? Вот в чем вопрос поняли? Т.е. данные которые содержатся на сервере за пином V1 их надо стягивать при подключении. ПОняли? Я очень тупой видать. ПОкажите на строчке кода. То что выше там нет нигде привязки к V1 в котором как бы будут храниться данные на сервере. Или мне надо просто написать обработки BLYNK_WRITE(V1){kWT=param.asFloat();} ??? но по моему блинк тогда ругается что два раза использование пина вроде

добавите обработчик на V1 и всё будет работать

:slight_smile: Я думаю там просто не пробиваемая стена у топикстартера… Из-за того что с этим write и read есть некая логическая запутанность. Дабы избежать её (ну не понимает человек).

Измените следующее событие:

BLYNK_CONNECTED() {
     Blynk.syncAll();
}

У вас также вот эта часть кода:

BLYNK_WRITE(V2){kWT=param.asFloat();} 

в переменную kWT пишет 0. Потому как V2 у Вас в виджете приложения наверняка тоже 0. Как минимум из этого кода туда ничего не пишется в V2.