#include <WiFi.h>
#include "PubSubClient.h"
#include <ESP32Servo.h> // Không sử dụng servo trong mã này nhưng giữ lại nếu cần mở rộng
// Thông tin kết nối MQTT
const char *MQTTServer = "broker.emqx.io";
const char *MQTT_Topic = "IoT/display";
const char *MQTT_ID = "c5afa5ae-d3a0-48b7-b850-92015a281909";
int Port = 1883;
// Chân kết nối phần cứng
const int buzzer = 27;
#define led1 2
#define button 0
const int pirPin = 14;
const int ldrPin = 32;
// Các biến trạng thái
unsigned long buttonPressedTime = 0;
unsigned long lastSwitchOnTime = 0;
bool motorRunning = false;
int buttonState;
int lastButtonState;
// Biến ngưỡng (threshold) cho cảm biến khí gas
const int threshold = 2000;
// WiFi và MQTT client
WiFiClient espClient;
PubSubClient client(espClient);
void WIFIConnect() {
Serial.println("Connecting to SSID: Wokwi-GUEST");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected");
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
}
void MQTT_Reconnect() {
while (!client.connected()) {
if (client.connect(MQTT_ID)) {
Serial.println("MQTT connected");
} else {
Serial.print("MQTT connect failed, rc=");
Serial.println(client.state());
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message: ");
String stMessage;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
Serial.println();
}
void setup() {
Serial.begin(115200);
WIFIConnect();
client.setServer(MQTTServer, Port);
client.setCallback(callback);
pinMode(led1, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(ldrPin, INPUT);
pinMode(button, INPUT);
pinMode(pirPin, INPUT);
}
void ManualControl() {
if (digitalRead(button) == HIGH) {
buttonPressedTime = millis();
while (digitalRead(button) == HIGH) {
if (millis() - buttonPressedTime > 5000) { // Nhấn nút trên 5 giây để bật đèn
digitalWrite(led1, HIGH);
lastSwitchOnTime = millis();
client.publish(MQTT_Topic, "Manual: ON");
}
}
}
}
void AutomaticControl() {
int lightValue = analogRead(ldrPin); // Đọc giá trị từ cảm biến ánh sáng
if (lightValue <= 1000 || lightValue >= 2000) {
digitalWrite(led1, HIGH);
lastSwitchOnTime = millis();
client.publish(MQTT_Topic, "Auto: Light ON");
} else {
digitalWrite(led1, LOW);
client.publish(MQTT_Topic, "Auto: Light OFF");
}
if (digitalRead(pirPin) == HIGH) { // Phát hiện chuyển động
digitalWrite(led1, HIGH);
lastSwitchOnTime = millis();
client.publish(MQTT_Topic, "Auto: Motion ON");
}
}
void SafetyMode() {
int gasValue = analogRead(ldrPin); // Đọc giá trị từ cảm biến khí
if (gasValue > threshold) { // Nếu giá trị khí vượt ngưỡng
digitalWrite(led1, HIGH);
digitalWrite(buzzer, HIGH);
lastSwitchOnTime = millis();
client.publish(MQTT_Topic, "Safety: Gas Detected");
} else {
digitalWrite(led1, LOW);
digitalWrite(buzzer, LOW);
}
}
void loop() {
delay(10);
if (!client.connected()) {
MQTT_Reconnect();
}
client.loop();
ManualControl(); // Điều khiển thủ công
AutomaticControl(); // Điều khiển tự động
SafetyMode(); // Chế độ an toàn
}