/* Basic ESP8266 MQTT example โปรแกรมสำหรับ ESP8266 โดยใช้ mqtt_server broker.mqtt-dashboard.com */ #include #include #include #include #include StaticJsonDocument<200> doc; SoftwareSerial Serial2(D3, D4); // RX, TX String message; int s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12; // Update these with values suitable for your network. const char* mqtt_server = "broker.mqtt-dashboard.com"; WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (200) int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย int dst = 0; //กำหนดค่า Date Swing Time char msg[MSG_BUFFER_SIZE]; String data ; #define ConfigWiFi_Pin D2 #define ESP_AP_NAME "ESP8266 xxxxxxxxxx" int th, tw, tm, ts, td, tn, ty; String vs, strz, strx, stry; int tsec, vset_t1,f_reset; float mml; int ii = 0, vz, fx, fm, vf; char strzx[15]; float vsec; int value = 0; String vx1 = "200"; //100-999 #define vtopic "xxxxx/yyyyy" //ตั้งขึันมาเอง void setup() { pinMode(D0, OUTPUT); pinMode(D1, OUTPUT); pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output pinMode(ConfigWiFi_Pin, INPUT_PULLUP); Serial.begin(9600); Serial2.begin(9600); Serial.println("Starting..."); digitalWrite(D1,1); WiFiManager wifiManager; if (digitalRead(ConfigWiFi_Pin) == LOW) // Press button { //reset saved settings wifiManager.resetSettings(); // go to ip 192.168.4.1 to config } wifiManager.autoConnect(ESP_AP_NAME); while (WiFi.status() != WL_CONNECTED) { delay(250); Serial.print("."); } /* WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(250); Serial.print("."); } */ Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server Serial.println("\nLoading time"); while (!time(nullptr)) { Serial.print("*"); delay(1000); // wdt_enable(WDTO_2S); } client.setServer(mqtt_server, 1883); client.setCallback(callback); } void pro1() { time_t now = time(nullptr); struct tm* p_tm = localtime(&now); Serial2.println("L2N"); Serial2.println("vname"); Serial2.print("L2h"); Serial2.print(p_tm->tm_hour < 10 ? "0" : ""); Serial2.println(p_tm->tm_hour); Serial2.print("L2h"); Serial2.print(p_tm->tm_hour < 10 ? "0" : ""); Serial2.println(p_tm->tm_hour); Serial2.print("L2d"); Serial2.print(p_tm->tm_wday < 10 ? "0" : ""); Serial2.println(p_tm->tm_wday); Serial2.print("L2m"); Serial2.print(p_tm->tm_min < 10 ? "0" : ""); Serial2.println(p_tm->tm_min); Serial2.print("L2s"); Serial2.print(p_tm->tm_sec < 10 ? "0" : ""); Serial2.println(p_tm->tm_sec); Serial.print("T:"); Serial.print(p_tm->tm_wday);Serial.print("/"); Serial.print(p_tm->tm_hour);Serial.print(":"); Serial.print(p_tm->tm_min);Serial.print(":"); Serial.println(p_tm->tm_sec); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); time_t now = time(nullptr); struct tm* p_tm = localtime(&now); if (digitalRead(D2)==0) { data ="name:"+ vx1 + "topic:" + vtopic; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); delay(1000); } if (millis() - mml > 1000) { mml = millis(); fm = fm + 1; f_reset=f_reset+1; if (f_reset>120) { digitalWrite(D1, 0); delay(100); digitalWrite(D1, 1); } if (fm > 20) { fm = 0; Serial2.println("OK"); } if (digitalRead(D0) == HIGH) digitalWrite(D0, LOW); else digitalWrite(D0, HIGH); } if (millis() - vsec > 3000) { vsec = millis(); // if (digitalRead(D0) == HIGH) digitalWrite(D0, LOW); else digitalWrite(D0, HIGH); ts = p_tm->tm_sec; tm = p_tm->tm_min; th = p_tm->tm_hour; tw = p_tm->tm_wday; td = p_tm->tm_mday; tn = p_tm->tm_mon + 1; ty = p_tm->tm_year ; String vty = String(ty); String vtn = String(tn); String vtd = String(td); String vtw = String(tw); String vth = String(th); String vtm = String(tm); String vts = String(ts); //snprintf (msg, MSG_BUFFER_SIZE, "hello88 world #%ld", value); // Serial.print("Publish3333 message: "); //Serial.println(msg); //client.publish("saksri/muk", msg); // if ( s06 == 1) // { // data = vx1 + "D2" + vth + ":" + vtm + ":" + vts; // data.toCharArray(msg, (data.length() + 1)); // client.publish(vtopic, msg); // } } if (Serial2.available()) Serial2Event(); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); message = ""; for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); message = message + (char)payload[i]; } // Serial.print("message="); // Serial.println(message); String v2 = String(message).substring(0, 1); String v2x = String(message).substring(0, 6); String vxx = String(message).substring(3, 6); String v4 = String(message).substring(3, length); String v3 = String(message).substring(6, length); String vtt = String(message).substring(0, length); // Serial.println(v3); // Serial.println( ); //Serial.println(vstateStr2 ); if (v2x == vx1+"DRR") Serial2.println(v3 ); if (v2x == vx1+"STT") { Serial2.println(v4); Serial.println("xxxxxxxxxxxxxxxxxxxxxx" ); } if (v2x == vx1+"HDT") Serial2.println(v3); if (v2x == vx1+"SBF") Serial2.println("L2S" ); if (v2x == vx1+"SBO") Serial2.println("L2R" ); if (v2x == vx1+"SBH") Serial2.println("L2H" ); if (v2x == vx1+"RE1") Serial2.println("L2E1" ); if (v2x == vx1+"RE2") Serial2.println("L2E2" ); if (v2x == vx1+"RE3") Serial2.println("L2E3" ); if (v2x == vx1+"RE4") Serial2.println("L2E4" ); if (v2x == vx1+"STY" ) Serial2.println(v4); if (v2x == vx1+"STN" ) Serial2.println(v4); if (v2x == vx1+"STD" ) Serial2.println(v4); if (v2x == vx1+"STW" ) Serial2.println(v4); if (v2x == vx1+"STH" ) Serial2.println(v4); if (v2x == vx1+"STM" ) Serial2.println(v4); if (v2x == vx1+"STS" ) Serial2.println(v4); // Serial.println(v2x ); //Serial.println(message ); // Serial.println(vtt ); if (v2x== vx1+"TDM") { time_t now = time(nullptr); struct tm* p_tm = localtime(&now); ts = p_tm->tm_sec; tm = p_tm->tm_min; th = p_tm->tm_hour; tw = p_tm->tm_wday; td = p_tm->tm_mday; tn = p_tm->tm_mon + 1; ty = p_tm->tm_year ; String vty=String(ty); String vtn=String(tn); String vtd=String(td); String vtw=String(tw); String vth=String(th); String vtm=String(tm); String vts=String(ts); String data = vx1+"NN"+vx1; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TY"+vty; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TN"+vtn; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TD"+vtd; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TW"+vtw; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TH"+vth; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TM"+vtm; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); data = vx1+"TS"+vts; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (message == vx1 + "H00") { Serial2.println("L2XX"); } if (message == vx1 + "AON") { Serial2.println("L210"); s01 = 1; } if (message == vx1 + "AOFF") { Serial2.println("L211"); s01 = 0; } if (message == vx1 + "BON") { Serial2.println("L220"); s02 = 1; } if (message == vx1 + "BOFF") { Serial2.println("L221"); s02 = 0; } if (message == vx1 + "CON") { Serial2.println("L230"); s03 = 1; } if (message == vx1 + "COFF") { Serial2.println("L231"); s03 = 0; } if (message == vx1 + "DON") { Serial2.println("L240"); s04 = 1; } if (message == vx1 + "DOFF") { Serial2.println("L241"); s04 = 0; } if (message == vx1 + "EON") { Serial2.println("L250"); s05 = 1; } if (message == vx1 + "EOFF") { Serial2.println("L251"); s05 = 0; } if (message == vx1 + "FON") { Serial2.println("L260"); s06 = 1; } if (message == vx1 + "FOFF") { Serial2.println("L261"); s06 = 0; } Serial.print("s="); Serial.print(s01); Serial.print(s02); Serial.print(s03); Serial.println(s04); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... // client.publish("outTopic", "hello world"); // ... and resubscribe // client.subscribe("saksri/muk"); client.subscribe(vtopic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void Serial2Event() { while (Serial2.available()) { char inChar = (char)Serial2.read(); stry += inChar; ii++; if (inChar == '\n' || inChar == '\r') { strx = stry; stry = ""; // Serial.println(strx); if (strx[0] == 'K' && strx[1] == 'T' ) { // delay(10); // Serial2.println("saksri"); pro1(); f_reset=0; } //if (strx[0] == 'T' ) // { // microgear.chat("controllerplug",strx); // strz += strx; //} if (strx[0] == 'D' && strx[1] == 'X' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = strx[7]; strzx[6] = strx[8]; strzx[7] = strx[9]; strzx[8] = strx[10]; strzx[9] = strx[11]; // String vstx =String(strx); String data = "Q" + vx1 + strx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'F' ) { if (strx[1] == '1' ) client.publish(vtopic, "Q-ระบบทำงาน ตามเวลาที่ตั้งใว้ปกติ"); if (strx[1] == '2' ) client.publish(vtopic, "Q-ระบบ งด ทำงาน ตามเวลาที่ตั้งใว้ปกติ"); if (strx[1] == '3' ) client.publish(vtopic, "Qaaaa3333"); if (strx[1] == '4' ) client.publish(vtopic, "Qaaaaa4444"); } if (strx[0] == 'Q' ) { strz += strx; // microgear.chat("controllerplug",strx); } if (strx[0] == 'T' ) { String data = strx; // Serial.println(data); data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); strz = ""; } if (strx[0] == 'Z' ) { String data = strz; // Serial.println(data); data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); strz = ""; } if (strx[0] == 'L' && strx[1] == '2' ) { int v1 = strx[2] & 0b00001111; int v2 = strx[3] & 0b00001111; int v3 = strx[4] & 0b00001111; int v4 = v1 * 100 + v2 * 10 + v3; if (bitRead(v4, 0) == 1) { String data = vx1 + "1ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "1OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (bitRead(v4, 1) == 1) { String data = vx1 + "2ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "2OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (bitRead(v4, 2) == 1) { String data = vx1 + "3ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "3OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (bitRead(v4, 3) == 1) { String data = vx1 + "4ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "4OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } // Serial.print("sak "); Serial.println(v4); } if (strx[0] == 'H' && strx[1] == '1' ) { int v1 = strx[2] & 0b00001111; int v2 = strx[3] & 0b00001111; int v3 = strx[4] & 0b00001111; // Serial.println(strx); // Serial.println(v1); // Serial.println(v2); if (v1 == 2) { if (v2 == 1) { String data = vx1 + "2ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "2OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } } if (v1 == 3) { if (v2 == 1) { String data = vx1 + "3ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "3OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } } if (v1 == 4) { if (v2 == 1) { String data = vx1 + "4ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "4OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } } if (v1 == 5) { if (v2 == 1) { String data = vx1 + "5ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "5OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } } if (v1 == 6) { if (v2 == 1) { String data = vx1 + "6ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "6OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } } if (v1 == 1) { if (v2 == 1) { String data = vx1 + "1ON"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } else { String data = vx1 + "1OFF"; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } } } if (strx[0] == 'D' && strx[1] == '1' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = strx[7]; strzx[6] = strx[8]; strzx[7] = strx[9]; strzx[8] = strx[10]; strzx[9] = strx[11]; String data = vx1+"D1" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '2' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = strx[7]; strzx[6] = strx[8]; strzx[7] = strx[9]; strzx[8] = strx[10]; strzx[9] = strx[11]; String data = vx1+"D2"+ strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '3' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = ' '; strzx[6] = ' '; strzx[7] = ' '; String data = vx1+"D3" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '4' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = ' '; strzx[6] = ' '; strzx[7] = ' '; String data = vx1 + "D4" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '5' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = ' '; strzx[6] = ' '; strzx[7] = ' '; String data = vx1 +"D5" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '6' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = ' '; strzx[6] = ' '; strzx[7] = ' '; String data = vx1 +"D6" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '7' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = strx[7]; String data = vx1 +"D7" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } if (strx[0] == 'D' && strx[1] == '8' ) { strzx[0] = strx[2]; strzx[1] = strx[3]; strzx[2] = strx[4]; strzx[3] = strx[5]; strzx[4] = strx[6]; strzx[5] = strx[7]; String data = vx1+"D8" + strzx; data.toCharArray(msg, (data.length() + 1)); client.publish(vtopic, msg); } // Serial.println("sak "); ii = 0; } } }