#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <DHT.h>
#include <WiFi.h>
#include "ThingSpeak.h"
#define DHTPIN 32
#define DHTTYPE DHT22
#define LED_FAN 33
#define LED_WATER_PUMP 27
#define LED_GROW_LIGHT 25
#define MOISTURE_PIN 4
#define LDR_PIN 26
DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
const int myChannelNumber = 2533769;
const char* tskey = "PHYSAGFIAHDRWGQK";
void setup() {
Serial.begin(9600);
Serial.println("Booting...");
pinMode(LED_WATER_PUMP, OUTPUT);
pinMode(LED_FAN, OUTPUT);
pinMode(LED_GROW_LIGHT, OUTPUT);
dht.begin();
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.println("Wifi not connected");
}
Serial.println("Wifi connected !");
Serial.println("Local IP: " + String(WiFi.localIP()));
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
int moisture = analogRead(MOISTURE_PIN);
const float GAMMA = 0.7;
const float RL10 = 50;
int analogValue = analogRead(LDR_PIN);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lightIntensity = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.println(moisture);
Serial.println(lightIntensity);
bool waterPumpOn = false;
bool fanOn = false;
bool growLightOn = false;
if (moisture < 500)
{
digitalWrite(LED_WATER_PUMP, HIGH);
waterPumpOn = true;
}
else
{
digitalWrite(LED_WATER_PUMP, LOW);
}
if (humidity > 70 || temperature > 24 )
{
digitalWrite(LED_FAN, HIGH);
fanOn = true;
}
else
{
digitalWrite(LED_FAN, LOW);
}
if (lightIntensity < 1000)
{
digitalWrite(LED_GROW_LIGHT, HIGH);
growLightOn = true;
}
else
{
digitalWrite(LED_GROW_LIGHT, LOW);
}
displayData(humidity, temperature, moisture, lightIntensity, waterPumpOn, fanOn, growLightOn);
sendDataToThingSpeak(temperature, humidity, moisture, lightIntensity);
WiFi.disconnect(true);
delay(1000); // Give some time to display before sleeping
esp_sleep_enable_timer_wakeup(5000);
esp_deep_sleep_start();
}
void displayData(float humidity, float temperature, int moisture, float lightIntensity, bool waterPumpOn, bool fanOn, bool growLightOn) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Humidity: ");
display.print(humidity);
display.println(" %");
display.print("Temp: ");
display.print(temperature);
display.println(" C");
display.print("Moisture: ");
display.println(moisture);
display.print("Light: ");
display.println(lightIntensity);
String emotion = "Happy";
if (waterPumpOn || fanOn || growLightOn) {
int conditionsMet = (waterPumpOn ? 1 : 0) + (fanOn ? 1 : 0) + (growLightOn ? 1 : 0);
if (conditionsMet == 1) {
emotion = "Neutral";
} else if (conditionsMet == 2) {
emotion = "Unhappy";
} else {
emotion = "Miserable";
}
}
display.print("Emotion: ");
display.println(emotion);
display.display();
}
void sendDataToThingSpeak(float temperature, float humidity, int moisture, int lightIntensity) {
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, moisture);
ThingSpeak.setField(4, lightIntensity);
int status = ThingSpeak.writeFields(myChannelNumber, tskey);
if(status == 200)
{
Serial.println("Data sent successfully.");
}
else
{
Serial.println("Push error " + String(status));
}
Serial.println("---");
delay(10000);
}