Untitled
#include <Wire.h> #include <Adafruit_SSD1306.h> #include <Adafruit_GFX.h> #include <HardwareSerial.h> // PMS5003 Commands uint8_t wakeCmd[] = {0x42, 0x4D, 0xE4, 0x00, 0x01, 0x72}; // Wake Up uint8_t activeModeCmd[] = {0x42, 0x4D, 0xE1, 0x00, 0x01, 0x71}; // Active Mode // Initialize PMS5003 sensor HardwareSerial pmsSerial(2); // OLED Display Setup #define OLED_I2C_ADDRESS 0x3C // I2C address for the OLED display Adafruit_SSD1306 display(128, 64, &Wire, -1); // OLED with I2C void wakePMS5003() { Serial.println("🔄 Sending wake-up command..."); pmsSerial.write(wakeCmd, sizeof(wakeCmd)); delay(1000); } void activatePMS5003() { Serial.println("🔄 Setting PMS5003 to active mode..."); pmsSerial.write(activeModeCmd, sizeof(activeModeCmd)); delay(1000); } void setup() { Serial.begin(115200); pmsSerial.begin(9600, SERIAL_8N1, 16, 17); // RX, TX pins // Initialize OLED display if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); while (true); // Halt if display initialization fails } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.print("Initializing..."); display.display(); // Show the text on the OLED wakePMS5003(); // Wake up sensor activatePMS5003(); // Set to active mode } void loop() { if (pmsSerial.available() >= 32) { // Ensure we have a full 32-byte packet uint8_t buffer[32]; int index = 0; while (index < 32) { buffer[index++] = pmsSerial.read(); } // Validate the data frame if (buffer[0] == 0x42 && buffer[1] == 0x4D) { int pm1_0 = (buffer[10] << 8) | buffer[11]; int pm2_5 = (buffer[12] << 8) | buffer[13]; int pm10 = (buffer[14] << 8) | buffer[15]; // Display readings on OLED display.clearDisplay(); display.setCursor(0, 0); display.setTextSize(1); display.print("🌫️ Air Quality Readings:"); display.setCursor(0, 20); display.print("PM1.0: "); display.print(pm1_0); display.print(" µg/m³"); display.setCursor(0, 30); display.print("PM2.5: "); display.print(pm2_5); display.print(" µg/m³"); display.setCursor(0, 40); display.print("PM10: "); display.print(pm10); display.print(" µg/m³"); display.display(); // Show updated values on the OLED Serial.println("🌫️ Air Quality Readings:"); Serial.print("PM1.0: "); Serial.print(pm1_0); Serial.println(" µg/m³"); Serial.print("PM2.5: "); Serial.print(pm2_5); Serial.println(" µg/m³"); Serial.print("PM10: "); Serial.print(pm10); Serial.println(" µg/m³"); Serial.println("---------------------------"); } } delay(1000); // Keep reading every second }
Leave a Comment