#include "DHTesp.h"
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <time.h>
#include <ESPping.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#define RELE 2
unsigned long tempo_atual;
unsigned long tempo_intervalo;
#define dht_pin 15
DHTesp dhtSensor;
#define COLUNAS 20
#define LINHAS 4
LiquidCrystal_I2C lcd(0x27, COLUNAS, LINHAS);
const char *ssid = "Wokwi-GUEST";
const char *password = "";
unsigned long contador_intervalWater;
unsigned long contador_activeWater;
unsigned long interval_water = 1;
unsigned long activeTime_water = 1;
bool flag_water = false;
bool flag_inicializacao = false;
void setup() {
pinMode(RELE, OUTPUT);
digitalWrite(RELE, LOW);
Serial.begin(115200);
dhtSensor.setup(dht_pin, DHTesp::DHT22);
lcd.init();
lcd.backlight();
tempo_intervalo = millis();
contador_intervalWater = millis();
contador_activeWater = 0;
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
lcd.setCursor(0, 0);
lcd.print("Conectando... ");
Serial.print(".");
flag_inicializacao = !flag_inicializacao;
WiFi.reconnect();
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("WiFi conectado!");
lcd.setCursor(0,1);
lcd.print("Configurando hora...");
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
WiFiClientSecure client;
client.setInsecure();
http.begin(client,"https://projetofinal-iot.onrender.com/status");
http.addHeader("Content-Type","application/json");
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
StaticJsonDocument<512> doc;
DeserializationError err = deserializeJson(doc, response);
if (!err) {
interval_water = (unsigned long) doc["content"]["interval"];
activeTime_water = (unsigned long) doc["content"]["activeTime"];
int timezone = doc["content"]["timezone"];
configTime(timezone * 3600, 0, "pool.ntp.org", "time.nist.gov");
delay(1000);
} else {
Serial.println("Erro parse JSON");
}
} else {
Serial.print("Erro HTTP status: ");
Serial.println(httpResponseCode);
}
http.end();
}
}
void loop() {
tempo_atual = millis();
struct tm timeinfo;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (WiFi.status() != WL_CONNECTED) {
lcd.setCursor(0,0);
lcd.print("Sistema offline. ");
WiFi.reconnect();
} else {
lcd.setCursor(0,0);
lcd.print("Sistema online. ");
}
if ((tempo_atual - tempo_intervalo) >= 1000) {
tempo_intervalo = tempo_atual;
if (getLocalTime(&timeinfo)) {
char hora[9];
strftime(hora, sizeof(hora), "%H:%M:%S", &timeinfo);
lcd.setCursor(0,1);
lcd.print("Hora: ");
lcd.print(hora);
lcd.print(" ");
} else {
lcd.setCursor(0,1);
lcd.print("Hora: --:--:-- ");
}
if (isnan(data.temperature) || isnan(data.humidity)) {
lcd.setCursor(0,2);
lcd.print("TEMP: --.- C ");
lcd.setCursor(0,3);
lcd.print("UMD: --.-% ");
} else {
lcd.setCursor(0,2);
lcd.print("TEMP: ");
lcd.print(String(data.temperature, 1));
lcd.print(" C ");
lcd.setCursor(0,3);
lcd.print("UMD: ");
lcd.print(String(data.humidity,1));
lcd.print("% ");
}
}
unsigned long interval_ms = interval_water * 60UL * 1000UL;
unsigned long active_ms = activeTime_water * 60UL * 1000UL;
if (!flag_water && (tempo_atual - contador_intervalWater >= interval_ms)) {
flag_water = true;
contador_activeWater = tempo_atual;
digitalWrite(RELE, HIGH);
Serial.println("Irrigação ativada.");
Serial.print("tempo_atual: "); Serial.println(tempo_atual);
Serial.print("contador_activeWater: "); Serial.println(contador_activeWater);
}
if (flag_water && (tempo_atual - contador_activeWater >= active_ms)) {
flag_water = false;
contador_intervalWater = tempo_atual;
digitalWrite(RELE, LOW);
Serial.println("Irrigação desativada.");
Serial.print("tempo_atual: "); Serial.println(tempo_atual);
Serial.print("contador_intervalWater (novo): "); Serial.println(contador_intervalWater);
}
}