#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Adafruit_MPU6050 acceleration_module;
// sensors_event_t event;
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 = "140.116.86.204";
int port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
String msg;
void wifiConnect() {
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// 等待 WiFi 連接
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// 重連 MQTT 服務器
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.publish("/flame/Publish", "Welcome");
client.subscribe("/flame/Subscribe");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
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() {
if (!client.connected()) {
reconnect();
}
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
// 地震
// acceleration_module.getAccelerometerSensor()->getEvent(&event);
// 檢查DHT感測器讀數是否有效
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String temperature = String(t, 1);
String humidity = String(h, 2);
// 發布溫度和濕度數據
client.publish("SmartDisasterPrevention/temperature/temperature1234", temperature.c_str()); // 轉換為const char*
client.publish("SmartDisasterPrevention/humidity/humidity1234", humidity.c_str()); // 轉換為const char*
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);
client.publish("SmartDisasterPrevention/flameAlarm/flameAlarm1234", "true");
}
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
client.publish("SmartDisasterPrevention/flameAlarm/flameAlarm1234", "false");
}
lcd.setCursor(0, 1);
lcd.print("Temp:");
lcd.print(t, 0);
int ac_temperature;
if (h > 60 && t > 25) {
ac_temperature = 22; // 涼爽乾燥
} else if (h < 60 && t > 25) {
ac_temperature = 24; // 清涼潮濕
} else if (t < 20) {
ac_temperature = 28; // 溫暖舒適
} else {
ac_temperature = 25; // 中等溫度乾燥
}
client.publish("SmartDisasterPrevention/airConditionerTemperature/airConditionerTemperature1234", String(ac_temperature).c_str());
delay(200);
}