Untitled

 avatar
unknown
plain_text
12 days ago
3.0 kB
3
Indexable
#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