#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
bool LoaStatus = true;
bool LEDStatus = true;
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("20CLC01/Group8/NhietDo");
client.subscribe("20CLC01/Group8/DoAm");
client.subscribe("20CLC01/Group8/KhiGas");
client.subscribe("20CLC01/Group8/BaoChay");
client.subscribe("20CLC01/Group8/Led");
client.subscribe("20CLC01/Group8/LEDStatus");
client.subscribe("20CLC01/Group8/LoaStatus");
}
else {
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
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 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***
if (msg == "offLED") {
LEDStatus = false;
}
else if (msg == "onLED") {
LEDStatus = true;
}
if (msg == "offLoa") {
LoaStatus = false;
}
else if (msg == "onLoa") {
LoaStatus = true;
}
Serial.println("-------------------");
}
void loop() {
if(!client.connected()) {
mqttReconnect();
}
client.loop();
char buffer[50];
float h = dht.readHumidity();
float t = dht.readTemperature();
if (LEDStatus == false) {
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
}
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");
if (LoaStatus == true)
tone(12,523,250);
if (LEDStatus == true) {
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
delay(50);
digitalWrite(greenLED, LOW);
}
}
else
if ((flamelevel >= firingLow) && (flamelevel < firingHigh) && (t > 50.00)) {
lcd.print("Firing ");
if (LoaStatus == true)
tone(12,523,250);
delay(50);
if(LEDStatus == true) {
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
}
}
else
if ((flamelevel < firingLow) && (flamelevel > idleLow) && (t > 50.00) ) {
lcd.print("Idle fire ");
if (LoaStatus == true)
tone(12,523,250);
if (LEDStatus == true) {
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, HIGH);
}
delay(500);
}
else
if ((flamelevel <= idleLow) && (flamelevel >= minSurvive) && (t > 50.00) ) {
lcd.print("Low fire ");
if(LEDStatus == true) {
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
}
if (LoaStatus == true)
tone(12,523,250);
delay(500);
}
else
if ((flamelevel < minSurvive) || (t<50.00)) {
lcd.print("FIRE OUT! ");
if( LEDStatus == true) {
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
delay(300);
digitalWrite(redLED, LOW);
}
// send alert
}
lcd.setCursor(0, 1);
lcd.print("Temp:");
lcd.print(t, 0);
if (msg == "get") {
sprintf(buffer, "%f", t);
client.publish("20CLC01/Group8/NhietDoOut",buffer);
sprintf(buffer, "%f", h);
client.publish("20CLC01/Group8/DoAmOut", buffer);
int chay = 0;
if (t > 50 || h < 30 || flamelevel > 80)
chay = 1;
sprintf(buffer, "%d", chay);
client.publish("20CLC01/Group8/BaoChayOut", buffer);
sprintf(buffer, "%f", flamelevel);
client.publish("20CLC01/Group8/KhiGasOut", buffer);
}
delay(1000);
}