อยากตั้งเวลา เปิด-ปิด รีเลย์ 1 และ กำหนดค่าอุณหภูมิให้ทำงานAuto โดยปรับผ่านหน้าจอ app netpie

อยากตั้งเวลา เปิด-ปิด รีเลย์ 1 และ กำหนดค่าอุณหภูมิให้ทำงานAuto โดยปรับผ่านหน้าจอ app netpie
รบกวนทุกท่านช่วยชี้แนะ ว่าต้อง แก้ตรงไหน ครับ

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
int ddht = 14; //D5
#define DHTTYPE DHT11
DHT dht(ddht, DHTTYPE);
int relay1 =  2 ; // D4
int relay2 = 16 ; // D0
int relay3 = 12 ; // D6 
int relay4 = 13 ; // D7 
String autoHum = "on"; 
String autoTem = "on"; 
String SW01 = "on"; 
String SW02 = "on"; 
const char* ssid = "XXXXXXXXXXXXXXXXXX";
const char* password = "XXXXXXXXXXXXXXXXXX";
const char* mqtt_server = "broker.netpie.io";
const int mqtt_port = 1883;
const char* mqtt_Client = "XXXXXXXXXXXXXXXXXX";
const char* mqtt_username = "XXXXXXXXXXXXXXXXXX";
const char* mqtt_password = "AXXXXXXXXXXXXXXXXXX";
WiFiClient espClient;                
PubSubClient client(espClient);      
char msg[100];
void reconnect() {                   
  while (!client.connected()) {                                        
    Serial.print("Attempting MQTT connection…");                      
    if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {    
      Serial.println("connected");     
      client.subscribe("@msg/#");
      client.subscribe("@msg/relay2");    //////////////////////////////////////////////
      client.subscribe("@msg/relay3");
      client.subscribe("@msg/relay4");          
    } else {                         
      Serial.print("failed, rc=");                                  
      Serial.print(client.state());                                
      Serial.println("try again in 5 seconds");    
      delay(5000);
    }
  }
}
void callback(char* topic, byte* payload, unsigned int length) {     
  Serial.print("Message arrived [");  
  Serial.print(topic);                                               
  Serial.print("] ");                                               
  String message;                                                   
  String tpc;                                                        
  for (int i = 0; i < length; i++) {                                 
    message = message + (char)payload[i];  
  }                                                                  
  Serial.println(message);     
  if (String(topic) == "@msg/relay1") {
    if(message == "on"){
      digitalWrite(relay1,LOW);         
      client.publish("shadow/data/updata","(\"data\":(\"relay1\":\"on\"))");
      Serial.println("relay1 ON");}
    else  if(message == "off"){
      digitalWrite(relay1,HIGH);    
      client.publish("shadow/data/updata","(\"data\":(\"relay1\":\"off\"))");
      Serial.println("relay1 OFF");}              
   }                                   
  if (String(topic) == "@msg/relay2") {
    if(message == "on"){
      digitalWrite(relay2,LOW);         
      client.publish("shadow/data/updata","(\"data\":(\"relay2\":\"on\"))");
      Serial.println("relay2 ON");}
    else  if(message == "off"){
      digitalWrite(relay2,HIGH);    
      client.publish("shadow/data/updata","(\"data\":(\"relay2\":\"off\"))");
      Serial.println("relay2 OFF");}              
   }                                   
  if (String(topic) == "@msg/relay3") {
    if(message == "on"){
      digitalWrite(relay3,LOW);         
      client.publish("shadow/data/updata","(\"data\":(\"relay3\":\"on\"))");
      Serial.println("relay3 ON");}
    else  if(message == "off"){
      digitalWrite(relay3,HIGH);    
      client.publish("shadow/data/updata","(\"data\":(\"relay3\":\"off\"))");
      Serial.println("relay3 OFF");}              
   }
   if (String(topic) == "@msg/relay4") {
    if(message == "on"){
      digitalWrite(relay4,LOW);               
      client.publish("shadow/data/updata","(\"data\":(\"relay4\":\"on\"))");
      Serial.println("relay4 ON");}
     else  if(message == "off"){
      digitalWrite(relay4,HIGH);    
      client.publish("shadow/data/updata","(\"data\":(\"relay4\":\"off\"))");
      Serial.println("relay4 OFF");}              
   }
}  

void setup() { 
   
  dht.begin(14);  
  pinMode(relay1, OUTPUT);
  digitalWrite(relay1, HIGH); 
  pinMode(relay2, OUTPUT);
  digitalWrite(relay2, HIGH); 
  pinMode(relay3, OUTPUT);
  digitalWrite(relay3, HIGH); 
  pinMode(relay4, OUTPUT);
  digitalWrite(relay4, HIGH);
  Serial.begin(115200);    
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
    {
        Serial.print(".");                   
    }
  Serial.println("");
  Serial.println("WiFi connected");
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
  } 
void loop() {
      if (!client.connected()) {                     
      reconnect();  
    }   
    float h = dht.readHumidity(); 
    float t = dht.readTemperature();
    if (isnan(h) || isnan(t))              
    {          
        Serial.println(F("Failed to read from DHT sensor!"));  
        return;                   
    }                                             
  if (autoTem == "on") {                  
    if (t > 60) {        //ตั้งการแบบปรั้งค่าที่ netpie ได้ ครับ         
      digitalWrite(relay1, LOW);                        
    } else {                         
      digitalWrite(relay1, HIGH);                     
    }
  }
//================================================  
  int r1 = digitalRead(relay1); 
  int r2 = digitalRead(relay2);
  int r3 = digitalRead(relay3); 
  int r4 = digitalRead(relay4);
//==================เป็นการส่ง data goto netpie====================================== 
String data = "{\"data\":{\"Humidity\":"+String(h) + 
              ",\"Temperature\":"+String(t)+ 
              ",\"relay1\":"+String(r1)+
              ",\"relay2\":"+String(r2)+
              ",\"relay3\":"+String(r3)+
              ",\"relay4\":"+String(r4)+
              "}}"; 
//================================================================================= 
  Serial.println(data);                       
  data.toCharArray(msg , (data.length() + 1)); 
  client.publish("@shadow/data/update", msg);  
  client.loop();                               
  delay(1000);
//================================================
}    //==== end void loop ===============
//================================================  
String getMsg(String topic_, String message_) 
     {
   //================================================ 
    if (topic_ == "@msg/relay1") {  
      if (message_ == "on") {        //netpie["???"].publish("@msg/relay1","on")
          digitalWrite(relay1, LOW);                 
          autoHum = "off";                       
     } else if (message_ == "off") { //netpie["???"].publish("@msg/relay1","off")
           digitalWrite(relay1, HIGH);                    
       autoTem = "on";                  
     }
     }
     return autoHum;       
   }

มือใหม่ครับ รบกวนด้วยครับ ขอบคุณครับ

การตั้งเวลาเปิด-ปิดรีเลย์และการกำหนดค่าอุณหภูมิให้ทำงานแบบอัตโนมัติ โดยปรับผ่านหน้าจอ App NETPIE สามารถทำได้โดยเพิ่มฟังก์ชันการตรวจสอบข้อความจาก MQTT ที่รับค่าต่าง ๆ เช่น เวลาเปิด-ปิดและค่าที่ต้องการให้อุณหภูมิทำงานแบบ Auto จากข้อความที่ส่งมาจาก NETPIE

สิ่งที่ต้องปรับในโค้ด

  1. เพิ่มตัวแปรสำหรับตั้งค่าจาก NETPIE:
  • เพิ่มตัวแปรสำหรับเวลาการทำงานของรีเลย์ (เปิด-ปิด) เช่น startTimeRelay1 และ endTimeRelay1
  • เพิ่มตัวแปรสำหรับอุณหภูมิที่ต้องการ เช่น autoTempThreshold
  1. ปรับฟังก์ชัน callback:
  • เพิ่มการตรวจสอบข้อความที่เกี่ยวข้องกับเวลาการทำงานและอุณหภูมิ
  • อัปเดตค่าตัวแปรตามข้อมูลที่รับจาก NETPIE
  1. ปรับ void loop():
  • เพิ่มเงื่อนไขในการตรวจสอบเวลาเปิด-ปิดของรีเลย์
  • ใช้ค่าที่ตั้งมาจาก MQTT ในการควบคุมรีเลย์

ตัวอย่างโค้ดที่ปรับปรุง

// เพิ่มตัวแปรใหม่
unsigned long startTimeRelay1 = 0; // เวลาเริ่มเปิดรีเลย์ 1 (หน่วย: วินาที)
unsigned long endTimeRelay1 = 86400; // เวลาเปิดรีเลย์ 1 สิ้นสุด (24 ชั่วโมง)
float autoTempThreshold = 30.0; // ค่าอุณหภูมิที่ต้องการ

void callback(char* topic, byte* payload, unsigned int length) {
    String message;
    for (int i = 0; i < length; i++) {
        message += (char)payload[i];
    }

    // ตรวจสอบหัวข้อสำหรับตั้งค่ารีเลย์
    if (String(topic) == "@msg/relay1/start") {
        startTimeRelay1 = message.toInt(); // รับค่าเวลาเริ่มต้น
    } else if (String(topic) == "@msg/relay1/end") {
        endTimeRelay1 = message.toInt(); // รับค่าเวลาสิ้นสุด
    } else if (String(topic) == "@msg/autoTempThreshold") {
        autoTempThreshold = message.toFloat(); // รับค่าอุณหภูมิ
    }

    // โค้ดเดิมสำหรับการควบคุมรีเลย์
    if (String(topic) == "@msg/relay1") {
        if (message == "on") {
            digitalWrite(relay1, LOW);
            client.publish("shadow/data/updata", "(\"data\":(\"relay1\":\"on\"))");
        } else if (message == "off") {
            digitalWrite(relay1, HIGH);
            client.publish("shadow/data/updata", "(\"data\":(\"relay1\":\"off\"))");
        }
    }
}

void loop() {
    if (!client.connected()) {
        reconnect();
    }

    client.loop();

    // อ่านค่าจากเซ็นเซอร์ DHT
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    // ตรวจสอบค่าเวลาและอุณหภูมิ
    unsigned long currentTime = millis() / 1000; // เวลาปัจจุบัน (หน่วย: วินาที)
    if (autoTem == "on" && t > autoTempThreshold) {
        digitalWrite(relay1, LOW); // เปิดรีเลย์ถ้าอุณหภูมิเกิน
    } else if (autoTem == "on") {
        if (currentTime >= startTimeRelay1 && currentTime <= endTimeRelay1) {
            digitalWrite(relay1, LOW); // เปิดรีเลย์ตามเวลาที่ตั้ง
        } else {
            digitalWrite(relay1, HIGH); // ปิดรีเลย์ถ้าอยู่นอกเวลาที่ตั้ง
        }
    }

    // ส่งข้อมูลไปยัง NETPIE
    String data = "{\"data\":{\"Humidity\":" + String(h) + 
                  ",\"Temperature\":" + String(t) +
                  ",\"relay1\":" + String(digitalRead(relay1)) + "}}";
    client.publish("@shadow/data/update", data.c_str());

    delay(1000);
}

สิ่งที่ต้องทำใน App NETPIE

  1. สร้างสไลเดอร์หรือตัวควบคุมเพื่อส่งค่าเวลาเปิด-ปิดรีเลย์ (startTimeRelay1 และ endTimeRelay1) และค่าที่ต้องการสำหรับอุณหภูมิ (autoTempThreshold).
  2. ส่งค่าผ่าน MQTT โดยกำหนดหัวข้อเป็น @msg/relay1/start, @msg/relay1/end, และ @msg/autoTempThreshold.

จุดสำคัญ

  • ตรวจสอบการส่งค่าผ่าน App NETPIE เพื่อให้แน่ใจว่า MQTT หัวข้อและข้อความถูกต้อง
  • ทดสอบระบบอย่างละเอียดเพื่อให้มั่นใจว่าการทำงานสอดคล้องกับเวลาที่กำหนด

คำแนะนำเพิ่มเติม

  • คุณอาจเพิ่มการบันทึกค่า startTimeRelay1, endTimeRelay1 และ autoTempThreshold ลงในหน่วยความจำ EEPROM ของ ESP8266 เพื่อให้ค่าเหล่านี้ยังคงอยู่หลังการรีเซ็ตอุปกรณ์.