#include <Wire.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
// Configuram la direccio de LCD (I2C) i dimensions (20x4)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Definim el pin i tipus del sensor DHT
#define DHTPIN 32
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Dades de la xarxa Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak Config
const char* server = "http://api.thingspeak.com/update";
String writeAPIKey = ""; // Es demanarà per la consola per seguretat
// Variables globals per compartir les dades entre intervals
float humitat = 0.0;
float temperatura = 0.0;
// Variables per el temps actual, el temps anterior i l'interval
unsigned long Temps_Actual = 0;
unsigned long Temps_Anterior_Interval_1 = 0;
const unsigned long Interval_1 = 1000; // milisegons per llegir sensor i LCD
unsigned long Temps_Anterior_Interval_2 = 0;
const unsigned long Interval_2 = 15000; // milisegons per enviar a ThingSpeak
void setup() {
Serial.begin(115200);
// Iniciam el sensor DHT
dht.begin();
// Inciam la pantalla LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Mesures sensor");
// Connexió Wi-Fi inicial
WiFi.begin(ssid, password);
lcd.setCursor(0, 1);
lcd.print("Connectant WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.setCursor(0, 1);
lcd.print("WiFi Connectat! ");
delay(1500);
lcd.setCursor(0, 1);
lcd.print(" "); // Neteja línia
// Demanar la clau d'escriptura de ThingSpeak per seguretat
Serial.println("\nIntrodueix la ThingSpeak Write API Key:");
while (writeAPIKey == "") {
if (Serial.available() > 0) {
writeAPIKey = Serial.readStringUntil('\n');
writeAPIKey.trim();
}
}
Serial.println("Clau rebuda correctament.");
// Deixem la primera fila amb el títol fix
lcd.setCursor(0, 0);
lcd.print("Mesures sensor ");
}
void loop() {
// Empram millis() per veure el temps real transcurrit
Temps_Actual = millis();
// --- INTERVAL 1: Lectura de sensor i actualització de l'LCD (cada 1s) ---
if (Temps_Actual - Temps_Anterior_Interval_1 >= Interval_1) {
Temps_Anterior_Interval_1 = Temps_Actual;
// Guardam les dades a les variables globals
humitat = dht.readHumidity();
temperatura = dht.readTemperature();
// Comprobam si hi ha error de lectura al sensor
if (isnan(humitat) || isnan(temperatura)) {
lcd.setCursor(0, 3);
lcd.print("Error lectura sensor");
return;
}
// Comprovació d'alertes independents
bool alertaTemp = (temperatura >= 28.0 || temperatura <= 0.0);
bool alertaHum = (humitat >= 70.0 || humitat <= 10.0);
// Fila 2 (index 1): Temperatura
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperatura, 1);
lcd.print(" C ");
// Fila 3 (index 2): Humitat
lcd.setCursor(0, 2);
lcd.print("Hum: ");
lcd.print(humitat, 1);
lcd.print(" % ");
// Fila 4 (index 3): Tipus d'alarma (temperatura, humitat o ambes)
lcd.setCursor(0, 3);
if (alertaTemp && alertaHum) {
lcd.print("AMBES ALARMES ");
} else if (alertaTemp) {
lcd.print("ALERTA TEMP ");
} else if (alertaHum) {
lcd.print("ALERTA HUM ");
} else {
lcd.print("NORMAL ");
}
}
// --- INTERVAL 2: Enviament de dades a ThingSpeak (cada 15s) ---
if (Temps_Actual - Temps_Anterior_Interval_2 >= Interval_2) {
Temps_Anterior_Interval_2 = Temps_Actual;
// Verifiquem que no hi hagi errors de lectura abans d'enviar
if (!isnan(humitat) && !isnan(temperatura) && writeAPIKey != "") {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Valors numèrics per enviar a ThingSpeak (0 = Normal, 1 = Alerta)
int codiAlertaTemp = (temperatura >= 28.0 || temperatura <= 0.0) ? 1 : 0;
int codiAlertaHum = (humitat >= 70.0 || humitat <= 10.0) ? 1 : 0;
int codiAlertaAmbes = (codiAlertaTemp && codiAlertaHum) ? 1 : 0;
// Construïm la URL amb field3 (Temp), field4 (Hum) i field5 (Ambes alhora)
String serverPath = String(server) + "?api_key=" + writeAPIKey +
"&field1=" + String(temperatura) +
"&field2=" + String(humitat) +
"&field3=" + String(codiAlertaTemp) +
"&field4=" + String(codiAlertaHum) +
"&field5=" + String(codiAlertaAmbes);
http.begin(serverPath.c_str());
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("Dades enviades a ThingSpeak. Codi HTTP: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error en l'enviament HTTP: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("Error: WiFi desconnectat");
}
}
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4