Как переопределить автоматическое управление в приложении Blynk?

Я новичок в Blynk и успешно построил простой проект контроля температуры воды. Он состоит из ESP32, подключаемого водонагревателя и платы реле переменного тока. ESP32 управляет релейной платой, в то время как водонагреватель подключен к релейной плате.

Код, который у меня есть, включит реле, как только температура воды опустится ниже 16 градусов. В приложении Blynk я хочу добавить кнопку, которая позволяет пользователю вручную управлять работой реле. Но я не знаю, как его закодировать. Так как я запрограммировал ESP, чтобы выключить реле, как только температура выше 16C, если я попытаюсь включить его вручную при 20C, например, реле не будет оставаться включенным, потому что ЕСЛИ оператор потерпит неудачу.

Как я могу закодировать это так, чтобы иметь возможность ручного управления? Таким образом, как только пользователь включит кнопку внутри приложения Blynk, ESP позволит ручное управление цифровым выводом (триггер задержки) и вернется в автоматический режим контроля температуры только после того, как кнопка будет выключена?

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 14 //провод передачи данных, подключенный к контакту 14
#define RELAY_PIN 23 //IoT-реле, подключенное к контакту 23

OneWire oneWire(ONE_WIRE_BUS); //экземпляр для связи с любым устройством OneWire

DallasTemperature sensor(&oneWire); //pass reference to Dallas Temperature object

BlynkTimer timer; //создание объекта Blynk timer для временных интервалов
float waterTemp;  //температура от DS18B20 в C

char auth[] = "xxxxxxx";    
char ssid[] = "xxxxxxx";     
char pass[] = "xxxxxxx";

void setup() {
  Serial.begin(9600);
  sensor.begin();
  Blynk.begin(auth, ssid, pass);
  sensor.setResolution(9);           //по умолчанию 9 бит
  timer.setInterval(1000L, sendTemp);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
}

void sendTemp() {
  sensor.requestTemperatures();      //сначала должен запросить чтение
  waterTemp = sensor.getTempCByIndex(0);
  if (waterTemp != DEVICE_DISCONNECTED_C) {
    Serial.print("Temp = "); 
    Serial.println(waterTemp);   
    Blynk.virtualWrite(V1, waterTemp);
    if (waterTemp < 16) {
      digitalWrite(RELAY_PIN, HIGH); //включить IoT-реле
    } else {
      digitalWrite(RELAY_PIN, LOW);  //выключить IoT-реле
    }
  } else {
    Serial.println("Ошибка: Не удалось прочитать данные о температуре");
    Blynk.notify("Ошибка: Не удалось прочитать данные о температуре");
    digitalWrite(RELAY_PIN, LOW);
  }
}

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

, 👍1

Обсуждение

используйте переменную состояния, @Juraj

if(is_manual){ do new stuff}else{ run old code} Кроме того, это звучит как опасность пожара. Я бы еще кое-что сделал, чтобы убить все, если станет слишком жарко, не только экстрасенс, но и те, кто может запереться. Термический предохранитель был бы хорош., @dandavis


1 ответ


1

Примерно так:

Сделайте глобальную переменную int mode;

Считайте 3-позиционный переключатель приложения Blynk в цикле();

Установите режим на 1, 2 или 3, полученный из приложения Blynk (для включения/выключения/АВТОМАТИЧЕСКОГО);

Замените этот фрагмент кода:

if (waterTemp < 16) {
  digitalWrite(RELAY_PIN, HIGH); //включить реле интернета вещей (IoT)
} else {
  digitalWrite(RELAY_PIN, LOW);  //отключить реле интернета вещей (IoT)
}

с

if (mode == 1) {
  digitalWrite(RELAY_PIN, HIGH);
} else if (mode = 2) {
  digitalWrite(RELAY_PIN, LOW);
} else {
  if (waterTemp < 16) {
    digitalWrite(RELAY_PIN, HIGH); //включить реле IoT
  } else {
    digitalWrite(RELAY_PIN, LOW);  //выключить реле IoT
  }
}

Вам все равно придется решить, что произойдет, когда DEVICE_DISCONNECTED_C == TRUEи т. Д., Но в этом суть.

,