#include #include #include #include #include #include #include #define HostName "GreenHouse" #define DHTPIN0 D4 #define Heater D5 #define Irrigator D6 #define Ventilator D7 #define Reset D8 DHTesp dht0; SocketIOclient socketIO; void control(void); String getData(void); void sendData(String, String); void socketIOEvent(socketIOmessageType_t, uint8_t *, size_t ); void OTA(void); //const char* ssid = "olleh_WiFi_0886"; //const char* password = "0000009554"; //const char* websockets_server = "192.168.10.243"; //const char* websockets_server = "192.168.10.51"; const uint16_t websockets_port = 3000; const char* ssid = "lab"; const char* password = "ksg1019!"; const char* websockets_server = "192.168.0.187"; IPAddress ip(192,168,0,200); IPAddress gateway(192,168,0,1); IPAddress subnet(255,255,255,0); struct dataStruct{ float temp_GH, humidity_GH, soil_humidity_GH, temp_Env, humidity_Env, soil_humidity_Env; int control, temp_c, vent_c, irrigate_gh, irrigate_env; }Data; String msg, Event; void setup() { Data.temp_c = 1; Data.vent_c = 35; Data.irrigate_gh = 50; Data.irrigate_env = 50; Data.control = 8; delay(1000); dht0.setup(DHTPIN0, DHTesp::DHT22); pinMode(Heater, OUTPUT); pinMode(Irrigator, OUTPUT); pinMode(Ventilator, OUTPUT); pinMode(Reset, OUTPUT); digitalWrite(Heater, HIGH); digitalWrite(Irrigator, HIGH); digitalWrite(Ventilator, HIGH); digitalWrite(Reset, HIGH); Serial.begin(115200); delay(1000); WiFi.config(ip, gateway, subnet); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.print("."); } String ip = WiFi.localIP().toString(); Serial.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); OTA(); socketIO.begin(websockets_server, websockets_port, "/socket.io/?EIO=4"); delay(1000); socketIO.onEvent(socketIOEvent); } void loop() { ArduinoOTA.handle(); socketIO.loop(); if(Event == "data") { Serial.println(msg); sendData("Data1", getData()); control(); Event = ""; } if(Event == "Ok") { Serial.println(msg); Event = ""; } if(Event == "control") { String con = msg.substring(0, msg.indexOf(',')); int num = (msg.substring(msg.indexOf(',')+1, msg.length())).toInt(); if(con == "t_con") Data.temp_c = num; if(con == "h_con") Data.irrigate_gh = num; if(con == "v_con") Data.vent_c = num; if(con == "control") Data.control = num; Event = ""; } } void sendData(String str1, String str2) { DynamicJsonDocument doc(512); JsonArray array = doc.to(); String output; array.add(str1); array.add(str2); serializeJson(doc, output); socketIO.sendEVENT(output); array.clear(); }; void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { String out; switch(type) { case sIOtype_DISCONNECT: Serial.printf("[IOc] Disconnected!\n"); break; case sIOtype_CONNECT: //Serial.printf("[IOc] Connected to url: %s\n", payload); // join default namespace (no auto join in Socket.IO V3) socketIO.send(sIOtype_CONNECT, "/"); break; case sIOtype_EVENT: //Serial.printf("[IOc] get event: %s\n", payload); out = (char*)payload; msg = out.substring(out.indexOf(',')+2, out.indexOf("]")-1); Event = out.substring(2, out.indexOf(',')-1); break; case sIOtype_ACK: Serial.printf("[IOc] get ack: %u\n", length); hexdump(payload, length); break; case sIOtype_ERROR: Serial.printf("[IOc] get error: %u\n", length); hexdump(payload, length); break; case sIOtype_BINARY_EVENT: Serial.printf("[IOc] get binary: %u\n", length); hexdump(payload, length); break; case sIOtype_BINARY_ACK: Serial.printf("[IOc] get binary ack: %u\n", length); hexdump(payload, length); break; } } void control(){ if(bitRead(Data.control, 3)) { if( Data.irrigate_gh > Data.soil_humidity_GH) { bitSet(Data.control, 0); digitalWrite(Irrigator, LOW); } else if( (Data.irrigate_gh + 10) < Data.soil_humidity_GH ) { bitClear(Data.control, 0); digitalWrite(Irrigator, HIGH); } if( (Data.temp_c -1) > Data.temp_GH ) { bitSet(Data.control, 1); digitalWrite(Heater, LOW); } else if( (Data.temp_c +1) < Data.temp_GH ){ bitClear(Data.control, 1); digitalWrite(Heater, HIGH); } if ( Data.vent_c < Data.temp_c ) { bitSet(Data.control, 2); digitalWrite(Ventilator, LOW); } else if( (Data.vent_c - 5) > Data.temp_c ) { bitClear(Data.control, 2); digitalWrite(Ventilator, HIGH); } if( Data.irrigate_env > Data.soil_humidity_Env) { bitSet(Data.control, 4); } else if( (Data.irrigate_env + 10) < Data.soil_humidity_Env ) { bitClear(Data.control, 4); } } else { if (bitRead(Data.control, 0)) digitalWrite(Irrigator, LOW); else digitalWrite(Irrigator, HIGH); if (bitRead(Data.control, 1)) digitalWrite(Heater, LOW); else digitalWrite(Heater, HIGH); if (bitRead(Data.control, 2)) digitalWrite(Ventilator, LOW); else digitalWrite(Ventilator, HIGH); } if(bitRead(Data.control, 5 )) { delay(1000); Serial.println("Resetting...."); digitalWrite(Reset, LOW); } } String getData(){ String s1, s3; Data.temp_GH = dht0.getTempAndHumidity().temperature; Data.humidity_GH = dht0.getTempAndHumidity().humidity; Data.soil_humidity_GH = (1024 - (float)analogRead(A0))/10; s1 = String(Data.temp_GH)+","+String(Data.humidity_GH)+","+String(Data.soil_humidity_GH)+","; s3 = s1+String(Data.temp_c)+","+String(Data.irrigate_gh)+","+String(Data.vent_c)+","+String(Data.control); Serial.println(s3); return s3; } void OTA(){ ArduinoOTA.setHostname(HostName); ArduinoOTA.setPassword("7788"); ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_SPIFFS type = "filesystem"; } Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf(".");if (progress == 100) Serial.printf("\n"); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); };