Untitled
unknown
plain_text
10 months ago
2.2 kB
5
Indexable
#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Ệ
}Editor is loading...
Leave a Comment