#include <DHT.h>
/*
DHT22 Sensor with RGB LED, Buzzer, and Switch Control
This program reads temperature and humidity, controls an RGB LED based on humidity,
triggers a buzzer for high humidity, and allows switch override for LED color.
*/
// Pin Definitions
#define DHT_PIN 4 // Data pin for DHT22 sensor
#define DHT_TYPE DHT22 // Sensor type
#define RGB_RED 16 // Red LED pin (PWM capable)
#define RGB_GREEN 17 // Green LED pin (PWM capable)
#define RGB_BLUE 18 // Blue LED pin (PWM capable)
#define BUZZER 19 // Buzzer control pin
#define SWITCH 26 // Toggle switch pin
// Initialize DHT sensor
DHT dht(DHT_PIN, DHT_TYPE);
// Interrupt Variables (volatile because used in interrupt)
volatile bool switchState = false; // Stores current switch position
volatile bool overrideLED = false; // Flag for LED override mode
volatile unsigned long lastSwitchTime = 0; // Tracks last switch activation time
// INTERRUPT SERVICE ROUTINE (Triggered on switch change)
void IRAM_ATTR handleSwitch() {
switchState = digitalRead(SWITCH); // Read current switch state
overrideLED = true; // Activate LED override
lastSwitchTime = millis(); // Record activation time
}
void setup() {
Serial.begin(115200);
Serial.println("Initializing system...");
// Sensor and Device Setup
dht.begin();
pinMode(RGB_RED, OUTPUT);
pinMode(RGB_GREEN, OUTPUT);
pinMode(RGB_BLUE, OUTPUT);
// Buzzer Setup (start turned off)
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, LOW);
// Switch Setup with Interrupt
pinMode(SWITCH, INPUT);
attachInterrupt(digitalPinToInterrupt(SWITCH), handleSwitch, CHANGE);
// Initialize LED to off
analogWrite(RGB_RED, 0);
analogWrite(RGB_GREEN, 0);
analogWrite(RGB_BLUE, 0);
Serial.println("System Ready!");
Serial.println("DHT22 Sensor Test with RGB LED, Buzzer, and Switch");
Serial.println("Humidity (%)\tTemperature (C)");
delay(2000); // Initial stabilization delay
}
void loop() {
static bool prevOverride = false; // Track previous override state
// Check if override should expire after 2 seconds
if (overrideLED && (millis() - lastSwitchTime >= 2000)) {
overrideLED = false;
Serial.println("LED override timed out. Returning to humidity mode.");
}
// Detect override state changes
if (overrideLED != prevOverride) {
if (overrideLED) {
Serial.print("Switch override activated. Position: ");
Serial.println(switchState ? "LEFT (Pink)" : "RIGHT (Cyan)");
}
prevOverride = overrideLED;
}
// Read sensor data
float humidity = 85;// dht.readHumidity();
float temperature = dht.readTemperature();
// Check if readings failed
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Error: Failed to read from DHT sensor!");
} else {
// Print sensor values
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("%\tTemperature: ");
Serial.print(temperature);
Serial.println("°C");
// LED Control Logic
if (overrideLED) {
// Switch override colors
if (switchState) { // LEFT position
analogWrite(RGB_RED, 255); // Pink
analogWrite(RGB_GREEN, 192);
analogWrite(RGB_BLUE, 203);
Serial.println("LED override: Pink (LEFT position)");
} else { // RIGHT position
analogWrite(RGB_RED, 0); // Cyan
analogWrite(RGB_GREEN, 255);
analogWrite(RGB_BLUE, 255);
Serial.println("LED override: Cyan (RIGHT position)");
}
} else {
// Normal humidity-based colors
setRGBColor(humidity);
}
// Buzzer activation for high humidity
if (humidity > 80) {
tone(BUZZER, 1000, 500);
Serial.println("Warning! High humidity detected - Buzzer activated");
}
}
delay(2000); // Wait 2 seconds between readings
}
void setRGBColor(float humidity) {
int red = 0, green = 0, blue = 0;
String colorName = "Off"; // Default color name
// Determine color based on humidity ranges
if (humidity >= 30 && humidity < 40) {
red = 255; green = 255; blue = 255; // White
colorName = "White";
} else if (humidity >= 40 && humidity < 50) {
red = 0; green = 0; blue = 255; // Blue
colorName = "Blue";
} else if (humidity >= 50 && humidity < 60) {
red = 0; green = 255; blue = 0; // Green
colorName = "Green";
} else if (humidity >= 60 && humidity < 70) {
red = 255; green = 255; blue = 0; // Yellow
colorName = "Yellow";
} else if (humidity >= 70 && humidity < 80) {
red = 255; green = 165; blue = 0; // Orange
colorName = "Orange";
} else if (humidity >= 80 && humidity < 90) {
red = 255; green = 0; blue = 0; // Red
colorName = "Red";
} else if (humidity >= 90 && humidity <= 100) {
red = 128; green = 0; blue = 128; // Purple
colorName = "Purple";
}
// Apply colors and send debug info
analogWrite(RGB_RED, red);
analogWrite(RGB_GREEN, green);
analogWrite(RGB_BLUE, blue);
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print("% - Setting LED to: ");
Serial.println(colorName);
}