Untitled
#INCLUDE <SOFTWARESERIAL.H> #INCLUDE <ADAFRUIT_GFX.H> #INCLUDE <ADAFRUIT_SH1106.H> #DEFINE RS485_RX 10 #DEFINE RS485_TX 11 #DEFINE RS485_DE 2 #DEFINE RS485_RE 3 #DEFINE RELAY_PIN 7 #DEFINE OLED_RESET -1 ADAFRUIT_SH1106 DISPLAY(OLED_RESET); SOFTWARESERIAL RS485(RS485_RX, RS485_TX); VOID SETUP() { PINMODE(RS485_DE, OUTPUT); PINMODE(RS485_RE, OUTPUT); PINMODE(RELAY_PIN, OUTPUT); DIGITALWRITE(RELAY_PIN, LOW); DIGITALWRITE(RS485_DE, LOW); DIGITALWRITE(RS485_RE, LOW); RS485.BEGIN(9600); DISPLAY.BEGIN(SH1106_I2C_ADDRESS, 0X3C); DISPLAY.CLEARDISPLAY(); } VOID LOOP() { STRING RECEIVEDDATA = ""; WHILE (RS485.AVAILABLE()) { RECEIVEDDATA += (CHAR)RS485.READ(); // ĐỌC DỮ LIỆU TỪ RS485 } FLOAT TEMPERATURE, HUMIDITY; IF (PARSESENSORDATA(RECEIVEDDATA, TEMPERATURE, HUMIDITY)) { // ĐIỀU KHIỂN RELAY DIGITALWRITE(RELAY_PIN, (TEMPERATURE > 30.0 || HUMIDITY > 70.0) ? HIGH : LOW); // HIỂN THỊ DỮ LIỆU LÊN OLED DISPLAY.CLEARDISPLAY(); DISPLAY.SETTEXTSIZE(1); DISPLAY.SETCURSOR(0, 0); DISPLAY.PRINT("TEMP: "); DISPLAY.PRINT(TEMPERATURE); DISPLAY.PRINTLN(" C"); DISPLAY.PRINT("HUM: "); DISPLAY.PRINT(HUMIDITY); DISPLAY.PRINTLN(" %"); DISPLAY.PRINT("RELAY: "); DISPLAY.PRINTLN(DIGITALREAD(RELAY_PIN) ? "ON" : "OFF"); DISPLAY.DISPLAY(); } ELSE { // HIỂN THỊ LỖI NẾU DỮ LIỆU KHÔNG HỢP LỆ DISPLAY.CLEARDISPLAY(); DISPLAY.SETTEXTSIZE(1); DISPLAY.SETCURSOR(0, 0); DISPLAY.PRINTLN("INVALID DATA!"); DISPLAY.DISPLAY(); } DELAY(1000); // CHU KỲ CẬP NHẬT } // HÀM GIẢI MÃ DỮ LIỆU NHẬN ĐƯỢC TỪ RS485 BOOL PARSESENSORDATA(STRING DATA, FLOAT &TEMPERATURE, FLOAT &HUMIDITY) { INT TEMPINDEX = DATA.INDEXOF("T:"); INT HUMINDEX = DATA.INDEXOF("H:"); IF (TEMPINDEX != -1 && HUMINDEX != -1) { TEMPERATURE = DATA.SUBSTRING(TEMPINDEX + 2, DATA.INDEXOF(";", TEMPINDEX)).TOFLOAT(); HUMIDITY = DATA.SUBSTRING(HUMINDEX + 2, DATA.INDEXOF(";", HUMINDEX)).TOFLOAT(); RETURN TRUE; } RETURN FALSE; // DỮ LIỆU KHÔNG HỢP LỆ }
Leave a Comment