From d9686e3cf6a1e39a0b8eed2d25a4d014b4433868 Mon Sep 17 00:00:00 2001 From: kim Date: Wed, 8 Oct 2025 06:03:13 +0000 Subject: [PATCH] Upload files to "socket" --- socket/GH_socket.ino | 264 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 socket/GH_socket.ino diff --git a/socket/GH_socket.ino b/socket/GH_socket.ino new file mode 100644 index 0000000..c5c3050 --- /dev/null +++ b/socket/GH_socket.ino @@ -0,0 +1,264 @@ +#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(); +}; \ No newline at end of file