#include <DHT.h>

// Pin Definitions
#define DHTPIN 14             // DHT22 data pin
#define DHTTYPE DHT22         // DHT sensor type
#define RED_PIN 15            // RGB LED - Red
#define GREEN_PIN 16          // RGB LED - Green
#define BLUE_PIN 17           // RGB LED - Blue
#define BUZZER_PIN 18         // Buzzer
#define SLIDE_RIGHT_PIN 4     // Slide switch (Right)
#define SLIDE_LEFT_PIN 5      // Slide switch (Left)

const int HUMIDITY_THRESHOLD = 80; // Buzzer alert threshold
volatile bool sleepMode = false;   // Sleep mode status
DHT dht(DHTPIN, DHTTYPE);

// Interrupt Functions
void IRAM_ATTR rightSwitchInterrupt() {
    sleepMode = false;
    setRGBColor(0, 255, 255);  // Cyan
}

void IRAM_ATTR leftSwitchInterrupt() {
    sleepMode = true;
    setRGBColor(0, 0, 0);  // Black (OFF)
}

void setup() {
    Serial.begin(115200);
    dht.begin();
  
    // Pin Setup
    pinMode(RED_PIN, OUTPUT);
    pinMode(GREEN_PIN, OUTPUT);
    pinMode(BLUE_PIN, OUTPUT);
    pinMode(BUZZER_PIN, OUTPUT);
    pinMode(SLIDE_RIGHT_PIN, INPUT_PULLUP);
    pinMode(SLIDE_LEFT_PIN, INPUT_PULLUP);
  
    // Attach interrupts to the slide switch
    attachInterrupt(digitalPinToInterrupt(SLIDE_RIGHT_PIN), rightSwitchInterrupt, FALLING);
    attachInterrupt(digitalPinToInterrupt(SLIDE_LEFT_PIN), leftSwitchInterrupt, FALLING);
  
    Serial.println("System Initialized...");
}

void loop() {
    if (sleepMode) {
        Serial.println("System in Sleep Mode...");
        delay(1000);
        return;
    }

    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();

    if (isnan(humidity) || isnan(temperature)) {
        Serial.println("Failed to read from DHT sensor.");
        return;
    }

    // Display Data on Serial Monitor
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.print(" °C  |  Humidity: ");
    Serial.print(humidity);
    Serial.println(" %");

    // Update RGB LED based on Humidity
    updateRGBLED(humidity);

    // Trigger Buzzer if humidity is high
    if (humidity >= HUMIDITY_THRESHOLD) {
        tone(BUZZER_PIN, 1000);
        delay(500);
        noTone(BUZZER_PIN);
    }

    delay(2000);
}

// Function to Set RGB LED Color
void setRGBColor(int red, int green, int blue) {
    analogWrite(RED_PIN, red);
    analogWrite(GREEN_PIN, green);
    analogWrite(BLUE_PIN, blue);
}

// Function to Update RGB LED Based on Humidity Levels
void updateRGBLED(float humidity) {
    if (humidity >= 30 && humidity < 40) {
        setRGBColor(255, 255, 255);  // White
    } else if (humidity >= 40 && humidity < 50) {
        setRGBColor(0, 0, 255);  // Blue
    } else if (humidity >= 50 && humidity < 60) {
        setRGBColor(0, 255, 0);  // Green
    } else if (humidity >= 60 && humidity < 70) {
        setRGBColor(255, 255, 0);  // Yellow
    } else if (humidity >= 70 && humidity < 80) {
        setRGBColor(255, 165, 0);  // Orange
    } else if (humidity >= 80 && humidity < 90) {
        setRGBColor(255, 0, 0);  // Red
    } else if (humidity >= 90) {
        setRGBColor(128, 0, 128);  // Purple
    }
}
$abcdeabcde151015202530fghijfghij