#include <ESP32Servo.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "ThingSpeak.h"
#include <WiFi.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int esp_id = 1;
const int sprinkerPin1 = 18;
const int sprinkerPin2 = 19;
const int ldrPin = 12;
const int dhtPin = 15;
const int buzzPin = 13;
DHTesp dhtSensor;
Servo sprinkler1, sprinkler2;
unsigned long lastTime = 0;
unsigned long sprinkerFreq = 5000;
int pos = 0;
const float GAMMA = 0.7;
const float RL10 = 50;
const char* myWriteAPIKey = "R839LJWPBAK87L9B";
const char* server = "api.thingspeak.com";
unsigned long myChannelNumber = 1;
const char* ssid = "Wokwi-GUEST";
const char* pass = "";
WiFiClient client;
void setup() {
// put your setup code here, to run once:
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(2000);
Serial.begin(115200);
sprinkler1.attach(sprinkerPin1, 500, 2400);
sprinkler2.attach(sprinkerPin2, 500, 2400);
sprinkler1.write(90);
sprinkler2.write(90);
dhtSensor.setup(dhtPin, DHTesp::DHT22);
pinMode(buzzPin, OUTPUT);
pinMode(ldrPin, INPUT);
WiFi.begin(ssid, pass);
Serial.println("WiFi Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("WiFi Connected!");
Serial.println(WiFi.localIP());
ThingSpeak.begin(client);
WiFi.mode(WIFI_STA);
}
void loop() {
int analogValue = analogRead(ldrPin);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
if(lux > 230) {
if ((millis() - lastTime) > sprinkerFreq) {
sprinklerActivate();
lastTime = millis();
}
}
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("Lux:" + String(lux, 2));
ThingSpeak.setField(1, data.temperature);
ThingSpeak.setField(2, data.humidity);
ThingSpeak.setField(3, lux);
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (x == 200) {
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
if(data.temperature > 50 && data.humidity < 30) {
sprinklerActivate();
lastTime = millis();
}
delay(100);
oled_display("");
}
void sprinklerActivate() {
oled_display("Sprinkler running");
tone(buzzPin, 500, 500);
for (pos = 0; pos <= 180; pos += 1) {
sprinkler1.write(pos);
sprinkler2.write(pos);
delay(15);
}
sprinkler1.write(90);
sprinkler2.write(90);
}
void oled_display(String msg) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 10);
display.println(msg);
display.display();
}