#include <TridentTD_LineNotify.h> // ไลบรารีสำหรับ Line Notify
#define LINE_TOKEN "HyLyeiNusIoVDn4ktzE1uBlvxxrlNf8kpaf4hqTkyIt"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#define BLYNK_TEMPLATE_ID "TMPLHfmhNBgM"
#define BLYNK_DEVICE_NAME "Dust Sensor PMS5003"
#define BLYNK_AUTH_TOKEN "R1JEtPUVfDFGrDWNH-EeZ_ih3p7uoWLI" // Blynk Token
#define WiFiSSID "Wokwi-GUEST"
#define WiFiPASSWORD ""
const int BuzzerPin = 15; // ขาลำโพง Buzzer
// Serial interface สำหรับ PMS5003
#define PMS5003_RX_PIN 16 // ขา RX ของ ESP32 ต่อกับ TX ของ PMS5003
#define PMS5003_TX_PIN 17 // ขา TX ของ ESP32 ต่อกับ RX ของ PMS5003
HardwareSerial PMS5003Serial(2); // สร้าง Software Serial สำหรับ PMS5003
int pm1_0 = 0; // ค่า PM1.0
int pm2_5 = 0; // ค่า PM2.5
int pm10 = 0; // ค่า PM10
void setup()
{
pinMode(BuzzerPin, OUTPUT); // ตั้งขาลำโพง Buzzer เป็น Output
Serial.begin(115200); // เริ่มต้น Serial Monitor
PMS5003Serial.begin(9600, SERIAL_8N1, PMS5003_RX_PIN, PMS5003_TX_PIN); // เริ่มต้น Serial PMS5003
Serial.println("ESP32 PMS5003 Dust Sensor Starting...");
// การเชื่อมต่อ Wi-Fi
WiFi.begin(WiFiSSID, WiFiPASSWORD);
Serial.printf("WiFi connecting to %s\n", WiFiSSID);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(400);
}
Serial.printf("\nWiFi connected\nIP: ");
Serial.println(WiFi.localIP());
// เชื่อมต่อ Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, WiFiSSID, WiFiPASSWORD, "blynk.cloud", 80);
int mytimeout = millis() / 1000;
while (Blynk.connect() == false)
{
if ((millis() / 1000) > mytimeout + 8)
{
Serial.println("Cannot connect to Blynk...");
break;
}
}
// ตั้งค่า Line Notify
Serial.println(LINE.getVersion());
LINE.setToken(LINE_TOKEN);
LINE.notify("PMS5003 Dust Sensor System Started.");
Serial.println("System Ready.");
}
void loop()
{
Blynk.run();
if (readPMS5003Data())
{
// แสดงค่าฝุ่นใน Serial Monitor
Serial.print("PM1.0: ");
Serial.print(pm1_0);
Serial.print(" µg/m³, PM2.5: ");
Serial.print(pm2_5);
Serial.print(" µg/m³, PM10: ");
Serial.print(pm10);
Serial.println(" µg/m³");
// ส่งค่าไปยัง Blynk
Blynk.virtualWrite(V0, pm2_5); // ส่งค่า PM2.5
Blynk.virtualWrite(V1, pm10); // ส่งค่า PM10
String alertMessage;
// การแจ้งเตือนผ่าน LINE และ Blynk
if (pm2_5 > 150) // PM2.5 ระดับอันตราย
{
alertMessage = "PM2.5: " + String(pm2_5) + " µg/m³\n\t\tDangerous Air Quality!";
LINE.notify(alertMessage); // แจ้งเตือนผ่าน LINE
Blynk.virtualWrite(V2, "Dangerous!");
}
else if (pm2_5 > 75) // PM2.5 ระดับเตือน
{
alertMessage = "PM2.5: " + String(pm2_5) + " µg/m³\n\t\tModerate Air Quality";
LINE.notify(alertMessage); // แจ้งเตือนผ่าน LINE
Blynk.virtualWrite(V2, "Warning!");
}
else // PM2.5 ระดับปกติ
{
Blynk.virtualWrite(V2, "Normal");
}
// ควบคุม Buzzer
if (pm2_5 > 100)
{
digitalWrite(BuzzerPin, HIGH); // เปิดเสียง Buzzer
}
else
{
digitalWrite(BuzzerPin, LOW); // ปิดเสียง Buzzer
}
}
delay(1000); // เว้นช่วงเวลา 1 วินาที
}
bool readPMS5003Data()
{
if (PMS5003Serial.available() >= 32)
{
uint8_t buffer[32];
PMS5003Serial.readBytes(buffer, 32);
// ตรวจสอบค่าเริ่มต้นของแพ็กเก็ต
if (buffer[0] == 0x42 && buffer[1] == 0x4D)
{
// ดึงค่าฝุ่น PM1.0, PM2.5, PM10
pm1_0 = (buffer[10] << 8) | buffer[11];
pm2_5 = (buffer[12] << 8) | buffer[13];
pm10 = (buffer[14] << 8) | buffer[15];
return true; // อ่านค่าฝุ่นสำเร็จ
}
}
return false; // ไม่สามารถอ่านค่าฝุ่นได้
}