#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
// Pin Definitions
#define AIRQUALITY_SENSOR_PIN 23 // Pin for Air Quality Sensor (e.g., MQ-135 or Wokwi Custom Sensor)
#define PMLEVEL_SENSOR_PIN 19 // Pin for PM Level Sensor (Custom Wokwi Sensor)
#define SPRINKLER_RELAY_PIN 14 // Relay pin for sprinkler
#define AIR_CLEANER_RELAY_PIN 12 // Relay pin for air cleaner
// OLED Display Definitions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Dust Sensor Thresholds (Adjust based on your needs)
#define PM_THRESHOLD 100 // PM level threshold for turning on the Air Cleaner
#define DUST_LEVEL_THRESHOLD 150 // Dust level threshold for turning on the Sprinkler
#define SPRINKLER_ON_TIME 5000 // Time in milliseconds to keep the sprinkler on (5 seconds)
#define AIR_CLEANER_ON_TIME 5000 // Time in milliseconds to keep the air cleaner on (5 seconds)
// Variables for sensor readings
int airQuality = 0; // Value from Air Quality Sensor (Raw Analog)
int dustLevel = 0; // Value from PM sensor (PM2.5 level)
int pmLevel = 0; // PM level value from PM sensor (PM2.5)
// Timing Variables
unsigned long sprinklerStartTime = 0; // To store the time when the sprinkler turns on
unsigned long airCleanerStartTime = 0; // To store the time when the air cleaner turns on
// Software Serial for PMS5003 (PM Sensor)
SoftwareSerial pmSerial(16, 17); // RX, TX pins for PMS5003 sensor (example)
void setup() {
// Start Serial Monitor for Debugging
Serial.begin(115200);
// Initialize OLED
if (!display.begin(SSD1306_I2C_ADDRESS, OLED_RESET)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Stay here if OLED initialization fails
}
display.display();
delay(2000); // Pause for 2 seconds
// Set pin modes
pinMode(AIRQUALITY_SENSOR_PIN, INPUT);
pinMode(SPRINKLER_RELAY_PIN, OUTPUT);
pinMode(AIR_CLEANER_RELAY_PIN, OUTPUT);
// Start SoftwareSerial for PM Sensor
pmSerial.begin(9600);
// Initially turn off the relay modules
digitalWrite(SPRINKLER_RELAY_PIN, LOW);
digitalWrite(AIR_CLEANER_RELAY_PIN, LOW);
}
void loop() {
// Read Air Quality (MQ-135 or custom sensor in Wokwi)
airQuality = analogRead(AIRQUALITY_SENSOR_PIN); // Raw analog value from custom air quality sensor
// Read PM sensor (Custom PM sensor in Wokwi for PM2.5)
dustLevel = analogRead(PMLEVEL_SENSOR_PIN); // Assuming PM level sensor provides analog data
pmLevel = dustLevel; // For simplicity, use the same value for dust level
// Debugging: Print values to the Serial Monitor
Serial.print("Air Quality (Raw): ");
Serial.println(airQuality);
Serial.print("PM Level (Raw): ");
Serial.println(dustLevel);
// Display Air Quality and PM Level on OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Air Quality: ");
display.print(airQuality); // Display the raw value from MQ-135 sensor
display.setCursor(0, 10);
display.print("PM Level: ");
display.print(dustLevel); // Display PM level (PM2.5)
display.print(" ug/m3");
// Control Sprinkler based on air quality (if air quality exceeds threshold)
if (airQuality > DUST_LEVEL_THRESHOLD && (millis() - sprinklerStartTime >= SPRINKLER_ON_TIME)) {
digitalWrite(SPRINKLER_RELAY_PIN, HIGH); // Turn on sprinkler
sprinklerStartTime = millis(); // Record the start time
display.setCursor(0, 30);
display.print("Sprinkler ON");
}
// Control Air Cleaner based on PM level (if PM level exceeds threshold)
if (dustLevel > PM_THRESHOLD && (millis() - airCleanerStartTime >= AIR_CLEANER_ON_TIME)) {
digitalWrite(AIR_CLEANER_RELAY_PIN, HIGH); // Turn on air cleaner
airCleanerStartTime = millis(); // Record the start time
display.setCursor(0, 40);
display.print("Air Cleaner ON");
}
// Turn off Sprinkler after a certain period
if (millis() - sprinklerStartTime >= SPRINKLER_ON_TIME) {
digitalWrite(SPRINKLER_RELAY_PIN, LOW); // Turn off sprinkler
display.setCursor(0, 30);
display.print("Sprinkler OFF");
}
// Turn off Air Cleaner after a certain period
if (millis() - airCleanerStartTime >= AIR_CLEANER_ON_TIME) {
digitalWrite(AIR_CLEANER_RELAY_PIN, LOW); // Turn off air cleaner
display.setCursor(0, 40);
display.print("Air Cleaner OFF");
}
// Update OLED display
display.display();
// Add delay to reduce flickering
delay(1000); // Update every 1 second
}