Есть устройство (счетчик) на 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
Тут нет ошибки. Крч смотрите
Есть три виджета:
- Chart (вывод Вт каждую минуту) - V0
- Value display (для вывода киловатт) - V1
- 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 и всё будет работать
Я думаю там просто не пробиваемая стена у топикстартера… Из-за того что с этим write и read есть некая логическая запутанность. Дабы избежать её (ну не понимает человек).
Измените следующее событие:
BLYNK_CONNECTED() {
Blynk.syncAll();
}
У вас также вот эта часть кода:
BLYNK_WRITE(V2){kWT=param.asFloat();}
в переменную kWT пишет 0. Потому как V2 у Вас в виджете приложения наверняка тоже 0. Как минимум из этого кода туда ничего не пишется в V2.