// Identificatorul șablonului Blynk
#define BLYNK_TEMPLATE_ID "TMPL4aSa5mihe"
// Numele șablonului Blynk
#define BLYNK_TEMPLATE_NAME "Virtual test"
// Token-ul de autorizare Blynk
#define BLYNK_AUTH_TOKEN "ksl83yNcpAwsA88fdf3ITtIxydbdpFdI"
// Includerea bibliotecilor necesare
#include <DHTesp.h>
#include <BlynkSimpleEsp32.h>
// Definirea pinului pentru senzorul DHT22 și releu
#define DHTPIN 13
#define PIN_RELEU 21
// Crearea obiectului pentru senzorul DHT22
DHTesp dht;
// Declararea variabilelor pentru autentificare și rețea WiFi
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Inițializarea obiectului timer pentru gestionarea intervalurilor de timp
BlynkTimer timer;
// Variabila pentru temperatura target
int temperatureTarget = 25; // Temperatura target implicită
// Pragul de temperatură pentru declanșarea acțiunilor (în acest caz, 0.5 grade Celsius)
const int TEMPERATURE_THRESHOLD = 0.5;
// Configurarea inițială a componentelor și începutul programului
void setup() {
// Setarea pinului pentru releu ca ieșire
pinMode(PIN_RELEU, OUTPUT);
// Inițializarea portului serial pentru comunicarea cu computerul
Serial.begin(115200);
// Inițializarea senzorului DHT22
dht.setup(DHTPIN, DHTesp::DHT22);
// Conectarea la serverul Blynk cu ajutorul datelor de autentificare și rețea WiFi
Blynk.begin(auth, ssid, pass);
// Configurarea intervalurilor de timp pentru funcțiile periodice
timer.setInterval(2000L, sendDHTData); // Trimiterea datelor de la senzor la fiecare 2 secunde
timer.setInterval(2000L, controlRelay); // Verificarea și controlul releului la fiecare 2 secunde
// Setarea stării inițiale a releului (închis)
digitalWrite(PIN_RELEU, HIGH);
}
// Funcție apelată când valoarea slider-ului se schimbă în aplicația Blynk
BLYNK_WRITE(V3) {
temperatureTarget = param.asInt();
Serial.print("Temperatura target setată la: ");
Serial.println(temperatureTarget);
controlRelay(); // Actualizarea stării releului imediat ce slider-ul este ajustat
}
// Funcție pentru trimiterea datelor de la senzor către aplicația Blynk
void sendDHTData() {
float t = dht.getTemperature();
float h = dht.getHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Eroare la citirea datelor de la senzorul DHT!");
return;
}
// Trimiterea datelor către aplicația Blynk
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
// Afișarea datelor în consola serială
Serial.print("Umiditate: ");
Serial.print(h);
Serial.print("%\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" °C");
}
// Funcție pentru controlul stării releului în funcție de temperatură
void controlRelay() {
float currentTemperature = dht.getTemperature();
if (!isnan(currentTemperature)) {
Serial.print("Temperatura curentă: ");
Serial.println(currentTemperature);
if (currentTemperature > (temperatureTarget + TEMPERATURE_THRESHOLD)) {
// Temperatura depășește pragul superior - opriți releul
digitalWrite(PIN_RELEU, LOW);
Serial.println("Releu oprit");
} else if (currentTemperature < (temperatureTarget - TEMPERATURE_THRESHOLD)) {
// Temperatura scade sub pragul inferior - porniți releul
digitalWrite(PIN_RELEU, HIGH);
Serial.println("Releu pornit");
}
} else {
Serial.println("Eroare la citirea temperaturii curente!");
}
}
// Funcție principală pentru executarea ciclică a programului
void loop() {
// Executarea codului Blynk și gestionarea timerelor
Blynk.run();
timer.run();
}