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

Перестал работать BLYNK + ESP32 + DS

Moseich

Member
Освоил новый BLYNK. Тариф бесплатный с ограниченными функциями. Управление котлом работает надежно. Но случилась ЗАСАДА!
Добавил в скетч получение сигнала об открытии двери. Сигнал получаю, а вот виджет термометра регулятора ( temp) перестал работать, его показания " ритмично изменяются от мин до мах".
Остальные термометры работают исправно.
Убираю из скетча новую ф-ю void ledWidget() - исправляется. Менял сенсор, переставлял ф-ю после setup - не помогает.
Просьба к опытным товарищам посмотреть мой скетч, может найдете в чем причина. Заранее благодарю!

/ PROTO"
#define BLYNK_TEMPLATE_ID "TM...
#define BLYNK_DEVICE_NAME "Pr..
#define BLYNK_AUTH_TOKEN "Iz4RBwehw8"


#include <WiFi.h> //esp32
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

//include <BlynkSimpleEsp8266.h>

/* ----------------ПИНЫ------------
* 15- датчики температуры DS18B20
* 21 - "сухой контакт"
* 22,23- реле
* виртуальные:
* V1 - led1
* V2 - led2
* V10 - led10
* V3- seconds время работы
* V4 - slider
* V0 - temp
*. V5 - temp1
* V6- temp2 */

// Подключение DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 15 //WEMOS пины D3 и D4 притянуты к Vcc
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);


#define RELE_1 22
#define RELE_2 23
int32_t ONkotel;

const int btnPin = 21; //контроль концевика двери

WidgetLED led1(V0); // temp
WidgetLED led3(V3); // время непрер работы
WidgetLED led(V10);

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = «I.....»;
char pass[] = "....;

BlynkTimer timer;
void myTimerEvent()
{
Blynk.virtualWrite(V3, millis() / 1000);
}

BLYNK_WRITE(V4) //читаем слайдер - задаем регулятору температуру
{
ONkotel = param.asInt();
}

/*****************************************************
получаем данные о температуре и регулируем ее
*******************************************************/

void sendTemps(){
sensors.requestTemperatures();

int16_t temp = sensors.getTempCByIndex(0); -
int16_t temp1 = sensors.getTempCByIndex(1);
int16_t temp2 = sensors.getTempCByIndex(2);

Blynk.virtualWrite(V0, temp ); - ЭТОТ ГАД НЕ РАБОТАЕТ! КАК НАДО
Blynk.virtualWrite(V5, temp1 );
Blynk.virtualWrite(V6, temp2 );

if (temp1 <= ONkotel)
{
led1.on();
digitalWrite(RELE_1, LOW);
}
else if (temp1 >= ONkotel-1)
{
led1.off();
digitalWrite(RELE_1, HIGH);
}
}

void ledWidget()
{
if (digitalRead (btnPin ) == HIGH )
{
Blynk.virtualWrite(V10, HIGH);
}
else {
Blynk.virtualWrite(V10, LOW);
}
delay(500);
}

BLYNK_CONNECTED() // (синхронизация)
{
Blynk.syncVirtual(V2,V4,V10);
}

BLYNK_WRITE(V2) //Виртуальный контакт Реле_2
{
int value2 = param.asInt();
pinMode (RELE_2,OUTPUT);

if(param.asInt() == 1)
{
digitalWrite(RELE_2,LOW);
}
else
{
digitalWrite(RELE_2,HIGH);
}
}

void setup() /*************/
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
sensors.begin();//DS

pinMode (5,OUTPUT);
pinMode (21,INPUT);

pinMode (RELE_1,OUTPUT);
digitalWrite (RELE_1, HIGH);
pinMode (RELE_2,OUTPUT);
digitalWrite (RELE_2, HIGH);

timer.setInterval(3000L, myTimerEvent);
timer.setInterval( 1000L, ledWidget);
}

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

}
 

aZholtikov

Active member
Не работал с BLYNK и могу ошибаться, но...

Судя по коду ledWidget() это обработчик события таймера BlynkTimer timer... А в обработчиках крайне не рекомендуется делать всякие delay(500)...
Попробуйте в обработчике только ставить семафор, а обработку делать в loop.

И...
Вместо всего этого:

if (digitalRead (btnPin ) == HIGH )
{
Blynk.virtualWrite(V10, HIGH);
}
else {
Blynk.virtualWrite(V10, LOW);
}
Можно написать всего лишь: Blynk.virtualWrite(V10, digitalRead(btnPin) ? HIGH : LOW) или еще проще - Blynk.virtualWrite(V10, digitalRead(btnPin))
 
Сверху Снизу