Untitled

 avatar
unknown
plain_text
a month ago
2.2 kB
3
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Ệ
}
Leave a Comment