#include <WiFi.h>
#include <PubSubClient.h>
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// Chân kết nối
const int PIR_PIN = 13;
const int RED_LED_PIN = 14;
const int RELAY_PIN = 18; // Điều khiển máy bơm (relay)
const int GREEN_LED_PIN = 253; // LED2 (mô phỏng máy bơm)
const int TRIG_PIN = 37;
const int ECHO_PIN = 38;
// Các biến
bool motionDetected = false;
// Hàm đo khoảng cách siêu âm
long readUltrasonicCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // timeout 30ms
long distance = duration * 0.034 / 2;
return distance;
}
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
}
void reconnect() {
while (!client.connected()) {
if (client.connect("room1_device")) {
client.publish("campus/room1/led", "offline"); // khởi tạo trạng thái
} else {
delay(1000);
}
}
}
void setup() {
Serial.begin(115200);
// Cấu hình chân
pinMode(PIR_PIN, INPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Khởi tạo trạng thái
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
//wifi
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(RED_LED_PIN, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
bool motion = digitalRead(PIR_PIN);
if (motion) digitalWrite(RED_LED_PIN, HIGH);
else digitalWrite(RED_LED_PIN, LOW);
// Publish trạng thái PIR & đèn
client.publish("campus/room1/pir", motion ? "1" : "0");
client.publish("campus/room1/led", motion ? "1" : "0");
delay(500);
// --- 1. Đọc PIR ---
motionDetected = digitalRead(PIR_PIN);
if (motionDetected) {
digitalWrite(RED_LED_PIN, HIGH); // Bật đèn đỏ
} else {
digitalWrite(RED_LED_PIN, LOW); // Tắt đèn đỏ
}
// --- 2. Đọc siêu âm để điều khiển máy bơm ---
long distanceCM = readUltrasonicCM();
Serial.print("Distance: "); Serial.print(distanceCM); Serial.println(" cm");
if (distanceCM >= 200) {
digitalWrite(RELAY_PIN, HIGH); // Relay bật → bật LED xanh (mô phỏng máy bơm)
digitalWrite(GREEN_LED_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW); // Relay tắt → tắt LED xanh
digitalWrite(GREEN_LED_PIN, LOW);
}
delay(500); // Delay 0.5s để ổn định đọc cảm biến
}