#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);
float flamelevel = 0;
#define greenLED 5
#define redLED 2
#define DHTPIN 13
#define DHTTYPE DHT22
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const int minSurvive = 15;
const int idleLow = 20;
const int idleTarget = 30;
const int firingLow = 70;
const int firingHigh = 90;
const int DHT_PIN = 13;
DHT dht(DHTPIN, DHTTYPE);
const char* mqttServer = "broker.mqtt-dashboard.com";
int port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
String msg;
void wifiConnect() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
}
void mqttReconnect() {
while(!client.connected()) {
Serial.println("Attemping MQTT connection...");
//***Change "123456789" by your student id***
if(client.connect("20127474")) {
Serial.println("connected");
//***Subscribe all topic you need***
client.subscribe("20127474/checkname");
}
else {
Serial.println("try again in 5 seconds");
delay(5000);
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.println(topic);
String strMsg = "";
for(int i=0; i<length; i++) {
strMsg += (char)message[i];
}
Serial.println(strMsg);
msg = strMsg;
//***Insert code here to control other devices***
Serial.println("-------------------");
}
void setup() {
lcd.init();
lcd.clear();
lcd.backlight();
Serial.begin(115200);
dht.begin();
pinMode(greenLED, OUTPUT);
digitalWrite(greenLED, LOW);
pinMode(redLED, OUTPUT);
digitalWrite(redLED, LOW);
pinMode(10, OUTPUT);
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float analogValue = analogRead(A0);
analogValue=analogValue/4;
Serial.print("Sensor RAW: ");
Serial.println(analogValue, 0);
flamelevel = map(analogValue, 0, 1024, 100, 0);
Serial.print(flamelevel, 0);
Serial.println("%");
lcd.setCursor(0, 0);
lcd.print(F("Flame: "));
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(F("°C "));
if (flamelevel >= firingHigh && (t > 50.00)) {
lcd.print("Full Fire");
tone(12,523,250);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
delay(50);
digitalWrite(greenLED, LOW);
}
else
if ((flamelevel >= firingLow) && (flamelevel < firingHigh) && (t > 50.00)) {
lcd.print("Firing ");
tone(12,523,250);
delay(50);
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
}
else
if ((flamelevel < firingLow) && (flamelevel > idleLow) && (t > 50.00) ) {
lcd.print("Idle fire ");
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
tone(12,523,250);
delay(500);
}
else
if ((flamelevel <= idleLow) && (flamelevel >= minSurvive) && (t > 50.00) ) {
lcd.print("Low fire ");
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
tone(12,523,250);
delay(500);
}
else
if ((flamelevel < minSurvive) || (t<50.00)) {
lcd.print("FIRE OUT! ");
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
delay(300);
digitalWrite(redLED, LOW);
// send alert
}
lcd.setCursor(0, 1);
lcd.print("Temp:");
lcd.print(t, 0);
delay(200);
}