#include <DHT11.h>
#include <Adafruit_NeoPixel.h>

#define DHT_PIN 33           // DHT11 sensor connected to digital pin 33
#define RELAY1_PIN 16        // Relay 1 connected to digital pin 16
#define RELAY2_PIN 17        // Relay 2 connected to digital pin 17
#define TOUCH_BUTTON_PIN 12   // Touch button connected to digital pin 12
#define NEOPIXEL_PIN 25       // NeoPixel data pin connected to digital pin 25
#define NUM_NEOPIXELS 5       // Number of NeoPixels
#define HUMIDITY_THRESHOLD 70 // Humidity threshold to activate the relays
#define HUMI_LOW_THRESHOLD 40    // Lower humidity threshold for green LEDs
#define HUMI_MEDIUM_THRESHOLD 50 // Medium humidity threshold for purple LEDs
#define HUMI_HIGH_THRESHOLD 60   // Higher humidity threshold for red LEDs

DHT11 dht11(DHT_PIN);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_NEOPIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  pinMode(RELAY1_PIN, OUTPUT);
  pinMode(RELAY2_PIN, OUTPUT);
  pinMode(TOUCH_BUTTON_PIN, INPUT);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  int humidity = dht11.readHumidity();

  if (humidity != DHT11::ERROR_CHECKSUM && humidity != DHT11::ERROR_TIMEOUT) {
    Serial.print("Humidity: ");
    Serial.print(humidity);
    Serial.println(" %");

    // Control NeoPixels based on humidity range
    if (humidity >= HUMI_LOW_THRESHOLD && humidity <= HUMI_MEDIUM_THRESHOLD) {
      // Green LEDs
      setColor(strip.Color(0, 255, 0));
    } else if (humidity >= HUMI_MEDIUM_THRESHOLD && humidity <= HUMI_HIGH_THRESHOLD) {
      // Purple LEDs
      setColor(strip.Color(128, 0, 128));
    } else if (humidity > HUMI_HIGH_THRESHOLD) {
      // Red LEDs
      setColor(strip.Color(255, 0, 0));
    } else {
      // Humidity is below the low threshold, turn off NeoPixels
      setColor(strip.Color(0, 0, 0));
    }

    // Control relays based on temperature
    if (humidity > HUMIDITY_THRESHOLD) {
      // Activate Relay 1 and Relay 2
      digitalWrite(RELAY1_PIN, HIGH);
      digitalWrite(RELAY2_PIN, HIGH);
    } else {
      // Deactivate Relay 1 and Relay 2
      digitalWrite(RELAY1_PIN, LOW);
      digitalWrite(RELAY2_PIN, LOW);
    }
  } else {
    Serial.print("Humidity Reading Error: ");
    Serial.println(DHT11::getErrorString(humidity));
  }

  // Check touch button state
  if (touchRead(TOUCH_BUTTON_PIN) < 100) {
    // Touch button is pressed, deactivate Relay 1 and Relay 2
    digitalWrite(RELAY1_PIN, LOW);
    digitalWrite(RELAY2_PIN, LOW);
    delay(1000); // Delay to debounce the touch button
  }

  // Wait for 1 second before the next reading.
  delay(1000);
  Serial.print("Touch Button: ");
  Serial.println(touchRead(TOUCH_BUTTON_PIN));
  Serial.println(" ");
}

void setColor(uint32_t color) {
  for (int i = 0; i < NUM_NEOPIXELS; i++) {
    strip.setPixelColor(i, color);
  }
  strip.show();
}