Untitled
unknown
plain_text
a year ago
3.0 kB
7
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
}
Editor is loading...
Leave a Comment