#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
// =====================================================
// DHT22 SENZORI
// =====================================================
#define DHTTYPE DHT22
#define DHT1_PIN 17 // Hala 1
#define DHT2_PIN 5 // Hala 2
#define DHT3_PIN 18 // Hala 3 - Hladnjača
DHT dht1(DHT1_PIN, DHTTYPE);
DHT dht2(DHT2_PIN, DHTTYPE);
DHT dht3(DHT3_PIN, DHTTYPE);
// =====================================================
// WIFI I THINGSBOARD
// =====================================================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* server = "http://eu.thingsboard.cloud";
const char* token = "osEDozgOv9GvD6zDwl6L";
// =====================================================
// STRUKTURA ZA STATUS HALE
// =====================================================
struct StatusHale {
String status;
String alarmTekst;
bool alarm;
String prioritet;
};
// =====================================================
// PRAVILA ZA HALU 1 I HALU 2
// Proizvodne hale
// =====================================================
StatusHale provjeriProizvodnuHalu(float temperatura, float vlaznost) {
StatusHale rezultat;
rezultat.status = "Normalno stanje";
rezultat.alarmTekst = "Nema alarma";
rezultat.alarm = false;
rezultat.prioritet = "Nizak";
if (temperatura > 34 && vlaznost > 84) {
rezultat.status = "Kriticno stanje";
rezultat.alarmTekst = "Visoka temperatura i visoka vlaznost";
rezultat.alarm = true;
rezultat.prioritet = "Kritican";
}
else if (temperatura > 34) {
rezultat.status = "Alarm temperature";
rezultat.alarmTekst = "Visoka temperatura";
rezultat.alarm = true;
rezultat.prioritet = "Visok";
}
else if (vlaznost > 84) {
rezultat.status = "Alarm vlaznosti";
rezultat.alarmTekst = "Visoka vlaznost";
rezultat.alarm = true;
rezultat.prioritet = "Visok";
}
else if (temperatura > 28) {
rezultat.status = "Upozorenje temperature";
rezultat.alarmTekst = "Povisena temperatura";
rezultat.alarm = false;
rezultat.prioritet = "Srednji";
}
else if (vlaznost > 70) {
rezultat.status = "Upozorenje vlaznosti";
rezultat.alarmTekst = "Povisena vlaznost";
rezultat.alarm = false;
rezultat.prioritet = "Srednji";
}
return rezultat;
}
// =====================================================
// PRAVILA ZA HALU 3
// Hala 3 je hladnjača za osjetljive materijale
// Ciljna temperatura: oko 10 °C
// =====================================================
StatusHale provjeriHladnjacu(float temperatura, float vlaznost) {
StatusHale rezultat;
rezultat.status = "Normalno stanje hladnjace";
rezultat.alarmTekst = "Nema alarma";
rezultat.alarm = false;
rezultat.prioritet = "Nizak";
// Normalno stanje: 8 do 12 °C
// Upozorenje: 6 do 8 °C ili 12 do 15 °C
// Alarm: ispod 6 °C ili iznad 15 °C
// Vlažnost u hladnjači: poželjno do 65%, alarm iznad 75%
if (temperatura > 15 && vlaznost > 75) {
rezultat.status = "Kriticno stanje hladnjace";
rezultat.alarmTekst = "Previsoka temperatura i previsoka vlaznost";
rezultat.alarm = true;
rezultat.prioritet = "Kritican";
}
else if (temperatura > 15) {
rezultat.status = "Alarm hladnjace";
rezultat.alarmTekst = "Previsoka temperatura u hladnjaci";
rezultat.alarm = true;
rezultat.prioritet = "Kritican";
}
else if (temperatura < 6) {
rezultat.status = "Alarm hladnjace";
rezultat.alarmTekst = "Preniska temperatura u hladnjaci";
rezultat.alarm = true;
rezultat.prioritet = "Visok";
}
else if (vlaznost > 75) {
rezultat.status = "Alarm vlaznosti hladnjace";
rezultat.alarmTekst = "Previsoka vlaznost u hladnjaci";
rezultat.alarm = true;
rezultat.prioritet = "Visok";
}
else if ((temperatura >= 12 && temperatura <= 15) || (temperatura >= 6 && temperatura < 8)) {
rezultat.status = "Upozorenje hladnjace";
rezultat.alarmTekst = "Temperatura blizu dozvoljene granice";
rezultat.alarm = false;
rezultat.prioritet = "Srednji";
}
else if (vlaznost > 65) {
rezultat.status = "Upozorenje vlaznosti hladnjace";
rezultat.alarmTekst = "Povisena vlaznost u hladnjaci";
rezultat.alarm = false;
rezultat.prioritet = "Srednji";
}
return rezultat;
}
// =====================================================
// POMOĆNA FUNKCIJA ZA BOOLEAN JSON VRIJEDNOST
// =====================================================
String boolToJson(bool vrijednost) {
return vrijednost ? "true" : "false";
}
// =====================================================
// SETUP
// =====================================================
void setup() {
Serial.begin(115200);
dht1.begin();
dht2.begin();
dht3.begin();
Serial.println();
Serial.println("Pokretanje sistema za nadzor 3 hale...");
Serial.println("Hala 1: proizvodna hala");
Serial.println("Hala 2: proizvodna hala");
Serial.println("Hala 3: hladnjaca za osjetljive materijale");
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// =====================================================
// LOOP
// =====================================================
void loop() {
float hala1Temperatura = dht1.readTemperature();
float hala1Vlaznost = dht1.readHumidity();
float hala2Temperatura = dht2.readTemperature();
float hala2Vlaznost = dht2.readHumidity();
float hala3Temperatura = dht3.readTemperature();
float hala3Vlaznost = dht3.readHumidity();
if (
isnan(hala1Temperatura) || isnan(hala1Vlaznost) ||
isnan(hala2Temperatura) || isnan(hala2Vlaznost) ||
isnan(hala3Temperatura) || isnan(hala3Vlaznost)
) {
Serial.println("GRESKA: Nije moguce ocitati jedan ili vise DHT22 senzora.");
delay(2000);
return;
}
StatusHale hala1 = provjeriProizvodnuHalu(hala1Temperatura, hala1Vlaznost);
StatusHale hala2 = provjeriProizvodnuHalu(hala2Temperatura, hala2Vlaznost);
StatusHale hala3 = provjeriHladnjacu(hala3Temperatura, hala3Vlaznost);
bool sistemAlarm = hala1.alarm || hala2.alarm || hala3.alarm;
// =====================================================
// SERIAL MONITOR ISPIS
// =====================================================
Serial.println();
Serial.println("========== OCITANJA SENZORA ==========");
Serial.print("Hala 1 - Temperatura: ");
Serial.print(hala1Temperatura);
Serial.print(" C, Vlaznost: ");
Serial.print(hala1Vlaznost);
Serial.print(" %, Status: ");
Serial.print(hala1.status);
Serial.print(", Alarm: ");
Serial.println(hala1.alarm ? "DA" : "NE");
Serial.print("Hala 2 - Temperatura: ");
Serial.print(hala2Temperatura);
Serial.print(" C, Vlaznost: ");
Serial.print(hala2Vlaznost);
Serial.print(" %, Status: ");
Serial.print(hala2.status);
Serial.print(", Alarm: ");
Serial.println(hala2.alarm ? "DA" : "NE");
Serial.print("Hala 3 - Hladnjaca - Temperatura: ");
Serial.print(hala3Temperatura);
Serial.print(" C, Vlaznost: ");
Serial.print(hala3Vlaznost);
Serial.print(" %, Status: ");
Serial.print(hala3.status);
Serial.print(", Alarm: ");
Serial.println(hala3.alarm ? "DA" : "NE");
Serial.print("Sistem alarm: ");
Serial.println(sistemAlarm ? "AKTIVAN" : "NIJE AKTIVAN");
// =====================================================
// SLANJE TELEMETRIJE NA THINGSBOARD
// =====================================================
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(server) + "/api/v1/" + token + "/telemetry";
String payload = "{";
// -------------------------
// HALA 1
// -------------------------
payload += "\"Hala1-Temperatura\":";
payload += String(hala1Temperatura, 2);
payload += ",";
payload += "\"Hala1-Vlaznost\":";
payload += String(hala1Vlaznost, 2);
payload += ",";
payload += "\"Hala1-Status\":\"";
payload += hala1.status;
payload += "\",";
payload += "\"Hala1-Alarm\":";
payload += boolToJson(hala1.alarm);
payload += ",";
payload += "\"Hala1-AlarmTekst\":\"";
payload += hala1.alarmTekst;
payload += "\",";
payload += "\"Hala1-Prioritet\":\"";
payload += hala1.prioritet;
payload += "\",";
// -------------------------
// HALA 2
// -------------------------
payload += "\"Hala2-Temperatura\":";
payload += String(hala2Temperatura, 2);
payload += ",";
payload += "\"Hala2-Vlaznost\":";
payload += String(hala2Vlaznost, 2);
payload += ",";
payload += "\"Hala2-Status\":\"";
payload += hala2.status;
payload += "\",";
payload += "\"Hala2-Alarm\":";
payload += boolToJson(hala2.alarm);
payload += ",";
payload += "\"Hala2-AlarmTekst\":\"";
payload += hala2.alarmTekst;
payload += "\",";
payload += "\"Hala2-Prioritet\":\"";
payload += hala2.prioritet;
payload += "\",";
// -------------------------
// HALA 3 - HLADNJAČA
// -------------------------
payload += "\"Hala3-Temperatura\":";
payload += String(hala3Temperatura, 2);
payload += ",";
payload += "\"Hala3-Vlaznost\":";
payload += String(hala3Vlaznost, 2);
payload += ",";
payload += "\"Hala3-Status\":\"";
payload += hala3.status;
payload += "\",";
payload += "\"Hala3-Alarm\":";
payload += boolToJson(hala3.alarm);
payload += ",";
payload += "\"Hala3-AlarmTekst\":\"";
payload += hala3.alarmTekst;
payload += "\",";
payload += "\"Hala3-Prioritet\":\"";
payload += hala3.prioritet;
payload += "\",";
// -------------------------
// SISTEMSKI STATUS
// -------------------------
payload += "\"Sistem-Alarm\":";
payload += boolToJson(sistemAlarm);
payload += ",";
payload += "\"Sistem-Status\":\"";
payload += sistemAlarm ? "Postoji aktivan alarm" : "Sistem radi normalno";
payload += "\",";
payload += "\"Sistem-Poruka\":\"";
payload += sistemAlarm ? "Potrebna je provjera jedne ili vise hala" : "Nema aktivnih alarma";
payload += "\"";
payload += "}";
http.begin(url);
http.addHeader("Content-Type", "application/json");
int responseCode = http.POST(payload);
Serial.println();
Serial.println("Payload sent:");
Serial.println(payload);
Serial.print("ThingsBoard response: ");
Serial.println(responseCode);
http.end();
}
else {
Serial.println("WiFi nije povezan. Telemetrija nije poslana.");
}
Serial.println("--------------------------------------");
delay(5000);
}