#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(21, 22); // RX, TX
unsigned int pm1 = 0;
unsigned int pm2_5 = 0;
unsigned int pm10 = 0;
const int relayPin = 32; // ขาที่จะควบคุม
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 คือที่อยู่ I2C ของ LCD และ 16x2 คือขนาดของ LCD
void setup() {
Serial.begin(9600);
while (!Serial);
mySerial.begin(9600);
// เริ่มต้น LCD
lcd.init();
lcd.backlight(); // สามารถเปิดหรือปิดไฟพื้นหลังของ LCD ได้ตามความต้องการ
lcd.setCursor(0, 0); // ตั้งตำแหน่งของเคอร์เซอร์ LCD
lcd.print("PM1: ");
lcd.setCursor(0, 1); // ตั้งตำแหน่งของเคอร์เซอร์ LCD
lcd.print("PM2.5: ");
lcd.setCursor(0, 2); // ตั้งตำแหน่งของเคอร์เซอร์ LCD
lcd.print("PM10: ");
pinMode(relayPin, OUTPUT); // กำหนดขาที่จะควบคุมเป็น OUTPUT
}
void loop() {
int index = 0;
char value;
char previousValue;
while (mySerial.available()) {
value = mySerial.read();
if ((index == 0 && value != 0x42) || (index == 1 && value != 0x4d)) {
Serial.println("Cannot find the data header.");
break;
}
if (index == 4 || index == 6 || index == 8 || index == 10 || index == 12 || index == 14) {
previousValue = value;
}
else if (index == 5) {
pm1 = 256 * previousValue + value;
lcd.setCursor(5, 0); // ตำแหน่งที่จะแสดง PM1
lcd.print(pm1);
lcd.print(" ug/m3");
}
else if (index == 7) {
pm2_5 = 256 * previousValue + value;
lcd.setCursor(7, 1); // ตำแหน่งที่จะแสดง PM2.5
lcd.print(pm2_5);
lcd.print(" ug/m3");
}
else if (index == 9) {
pm10 = 256 * previousValue + value;
lcd.setCursor(6, 2); // ตำแหน่งที่จะแสดง PM10
lcd.print(pm10);
lcd.print(" ug/m3");
if (pm10 > 100) {
Serial.println(" - PM10 is greater than 100!");
digitalWrite(relayPin, HIGH); // เปิดใช้งานขาที่จะควบคุม
} else {
Serial.println();
digitalWrite(relayPin, LOW); // ปิดใช้งานขาที่จะควบคุม
}
}
else if (index > 15) {
break;
}
index++;
}
while (mySerial.available()) mySerial.read();
delay(1000);
}