#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHTesp.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void getWeatherForecast();
void startWatering();
void stopWatering();
const char* ssid = "Wokwi-GUEST"; // Giữ cho Wokwi
const char* password = "";
String openWeatherMapApiKey = "46328d5e41a51298cb2e9fac499dbf1e"; // Thay bằng API key thật
String city = "Thanh pho Ho Chi Minh";
String countryCode = "VN";
const int DHT_PIN = 33;
const int relayPin = 2;
int moistureThreshold = 30;
int rainThreshold = 20;
DHTesp dhtSensor;
unsigned long lastUpdate = 0;
unsigned long wateringStart = 0;
bool isWatering = false;
String weatherTemp = "N/A";
String rainChance = "N/A";
void setup() {
Serial.begin(115200);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String tmp=String(data.humidity, 1);
getWeatherForecast();
float rainProb = rainChance.toFloat();
// if (data.humidity < moistureThreshold && rainProb < rainThreshold && !isWatering) {
// startWatering();
// } else if (isWatering && (millis() - wateringStart > 5000)) {
// stopWatering();
// }
if(rainProb < rainThreshold){
while(data.humidity < moistureThreshold )
{
if(!isWatering){
startWatering();
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print(F("Do am: "));
display.print(tmp);
display.println(F("%"));
display.print(F("Nhiet do: "));
display.print(weatherTemp);
display.println(F("C"));
display.print(F("Xac suat mua: "));
display.print(rainChance);
display.println(F("%"));
display.print(F("Trang thai: "));
display.println(isWatering ? F("Dang tuoi") : F("Khong tuoi"));
display.display();
}
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if(data.humidity > moistureThreshold){
break;
}
}
}
if(isWatering){
stopWatering();
}
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print(F("Do am: "));
display.print(tmp);
display.println(F("%"));
display.print(F("Nhiet do: "));
display.print(weatherTemp);
display.println(F("C"));
display.print(F("Xac suat mua: "));
display.print(rainChance);
display.println(F("%"));
display.print(F("Trang thai: "));
display.println(isWatering ? F("Dang tuoi") : F("Khong tuoi"));
display.display();
Serial.print(F("Moisture: "));
Serial.print(tmp);
Serial.print(F("% | Temp: "));
Serial.print(weatherTemp);
Serial.print(F(" | Rain: "));
Serial.print(rainChance);
Serial.print(F("% | Watering: "));
Serial.println(isWatering ? F("Yes") : F("No"));
delay(5000);
}
void getWeatherForecast() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=Hanoi,VN&APPID=46328d5e41a51298cb2e9fac499dbf1e&units=metric";
http.begin(serverPath);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
JsonDocument doc;
deserializeJson(doc, payload);
weatherTemp = String(doc["main"]["temp"].as<float>(), 1);
if (doc["rain"]["1h"].is<float>()) {
rainChance = String(doc["rain"]["1h"].as<float>());
} else {
rainChance = "0";
}
} else {
Serial.print(F("Error on HTTP request: "));
Serial.println(httpCode);
}
http.end();
}
}
void startWatering() {
digitalWrite(relayPin, HIGH);
isWatering = true;
wateringStart = millis();
Serial.println(F("Bat dau tuoi!"));
}
void stopWatering() {
digitalWrite(relayPin, LOW);
isWatering = false;
Serial.println(F("Dung tuoi!"));
}