#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#include <ESP32Servo.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define THINGSPEAK_API_KEY "SX9MOXHZLJASIDHW"
#define THINGSPEAK_CHANNEL_ID 2391807
#define RED_LED_PIN 27 // GPIO pin for the red LED
#define GREEN_LED_PIN 13 // GPIO pin for the green LED
#define SERVO_PIN 26 // GPIO pin for the servo
#define BUTTON_PIN 2 // GPIO pin for the push button
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
DHT dht(14, DHT22);
Servo myservo;
const long updateInterval = 1 * 1000;
unsigned long lastUpdate = 0;
bool servoManualControl = false; // Flag for manual control via the push button
WiFiClient client;
void setup() {
Serial.begin(115200);
LCD.init();
delay(1000);
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Initializing...");
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
myservo.attach(SERVO_PIN); // Attach servo to the specified pin
pinMode(BUTTON_PIN, INPUT_PULLUP); // Configure push button pin with pull-up resistor
dht.begin();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
ThingSpeak.begin(client);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - lastUpdate >= updateInterval) {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
delay(2000);
return;
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("NEM DEGERI=");
LCD.setCursor(11, 0);
LCD.print(humidity);
LCD.setCursor(16, 0);
LCD.print("C");
if (!servoManualControl) {
// Automatically control the servo based on humidity level
if (humidity < 30.0) {
myservo.write(180); // Open the servo
digitalWrite(RED_LED_PIN, HIGH); // Red LED on
digitalWrite(GREEN_LED_PIN, LOW); // Green LED off
LCD.setCursor(0, 1);
LCD.print("DURUM= SU ACIK");
} else {
myservo.write(90); // Close the servo
digitalWrite(RED_LED_PIN, LOW); // Red LED off
digitalWrite(GREEN_LED_PIN, HIGH); // Green LED on
LCD.setCursor(0, 1);
LCD.print("DURUM= SU KAPALI");
}
} else {
// Manual control via the push button
if (digitalRead(BUTTON_PIN) == LOW) {
myservo.write(180); // Open the servo
digitalWrite(RED_LED_PIN, HIGH); // Red LED on
digitalWrite(GREEN_LED_PIN, LOW); // Green LED off
LCD.setCursor(0, 1);
LCD.print("DURUM= SU ACIK (MANUAL)");
} else {
myservo.write(90); // Close the servo
digitalWrite(RED_LED_PIN, LOW); // Red LED off
digitalWrite(GREEN_LED_PIN, HIGH); // Green LED on
LCD.setCursor(0, 1);
LCD.print("DURUM= SU KAPALI (MANUAL)");
}
}
ThingSpeak.writeField(THINGSPEAK_CHANNEL_ID, 1, temperature, THINGSPEAK_API_KEY);
ThingSpeak.writeField(THINGSPEAK_CHANNEL_ID, 2, humidity, THINGSPEAK_API_KEY);
lastUpdate = currentMillis;
}
}