#include <DHTesp.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include "ThingSpeak.h"
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 5
const int DHTPin = 32;
const int LDRPin = 34;
const int SoilSensorPin = 35;
const int WaterPumpPin = 4;
const int FanPin = 5;
const int GLightPin = 15;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const float GAMMA = 0.7;
const float RL10 = 50;
unsigned long myChannelNumber = 2553175;
const char* myWriteAPIKey = "U23F6MXJEZFE8H14";
Adafruit_SSD1306 display(128, 64, &Wire, -1);
WiFiClient client;
DHTesp dht;
void setup() {
Serial.begin(115200);
dht.setup(DHTPin, DHTesp::DHT22);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(2000);
display.clearDisplay();
pinMode(WaterPumpPin, OUTPUT);
pinMode(FanPin, OUTPUT);
pinMode(GLightPin, OUTPUT);
ThingSpeak.begin(client);
}
void loop() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
float temperature = dht.getTemperature();
float humidity = dht.getHumidity();
int analogValue = analogRead(LDRPin);
float voltage = analogValue / 4096.0 * 3.3;
float resistance = (10000.0 * voltage) / (3.3 - voltage);
float lux = pow((RL10 * 1000.0 * pow(10, GAMMA)) / resistance, (1 / GAMMA));
int soilMoisture = analogRead(SoilSensorPin);
bool isHappy = (humidity >= 40 && temperature >= 18 && temperature <= 24 &&
soilMoisture >= 2165 && soilMoisture <= 3135 && lux > 10000);
digitalWrite(WaterPumpPin, soilMoisture < 2165 ? HIGH : LOW);
digitalWrite(FanPin, temperature > 24 ? HIGH : LOW);
digitalWrite(GLightPin, lux < 10000 ? HIGH : LOW);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Aloe Vera Plant");
display.println("==================");
display.print("Humidity: ");
display.print(humidity);
display.println("%");
display.print("Temp: ");
display.print(temperature);
display.println("C");
display.print("Light: ");
display.println(lux);
display.print("Soil: ");
display.println(soilMoisture < 2165 ? "Dry" : "Moist");
display.print("Emotion: ");
display.println(isHappy ? "Happy" : "Unhappy");
display.display();
delay(5000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Sending data to");
display.println("ThingSpeak...");
display.display();
ThingSpeak.setField(1, humidity);
ThingSpeak.setField(2, temperature);
ThingSpeak.setField(3, lux);
ThingSpeak.setField(4, soilMoisture);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Going to sleep");
display.println("now...");
display.display();
delay(1000);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Going to sleep now");
esp_deep_sleep_start();
}
//lux level reference
// https://beringar.co.uk/what-are-lux-levels-everything-you-need-to-know/