#include <WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <DHT.h>
// Cấu hình WiFi
#define WIFI_SSID "Wokwi-GUEST" // WiFi mặc định trên Wokwi
#define WIFI_PASS ""
// Cấu hình MQTT - Adafruit IO
#define IO_USERNAME "Vqueen_10904"
#define IO_KEY "aio_efaV33CzyvbJAFnJJ3MRWYFuBwdw"
// MQTT Client
WiFiClient wifiClient;
Adafruit_MQTT_Client mqtt(&wifiClient, "io.adafruit.com", 1883);
// MQTT Feeds
Adafruit_MQTT_Publish temperatureFeed = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/temperature");
Adafruit_MQTT_Publish humidityFeed = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/humidity");
Adafruit_MQTT_Publish distanceFeed = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/distance");
// Cấu hình cảm biến DHT22
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Cấu hình LED
#define LED_RED 26
#define LED_GREEN 27
// Cấu hình cảm biến siêu âm
#define TRIG_PIN 4
#define ECHO_PIN 5
void setupUltrasonic() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
float readDistance() {
// Gửi xung
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Đo thời gian xung phản hồi
long duration = pulseIn(ECHO_PIN, HIGH);
// Tính khoảng cách (cm)
float distance = duration * 0.034 / 2; // Tốc độ âm thanh: 0.034 cm/µs
return distance;
}
// Hàm kết nối WiFi
void connectWiFi() {
Serial.print("Kết nối WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Đã kết nối WiFi!");
}
// Hàm kết nối MQTT
void connectMQTT() {
while (!mqtt.connected()) {
Serial.print("Kết nối MQTT...");
// Kết nối với MQTT, chỉ sử dụng username và key
if (mqtt.connect(IO_USERNAME, IO_KEY)) {
Serial.println(" Đã kết nối MQTT!");
} else {
// In lỗi khi kết nối không thành công
Serial.println(" Lỗi kết nối MQTT! Đang thử lại...");
delay(5000); // Đợi 5 giây trước khi thử lại
}
}
}
void setup() {
Serial.begin(115200);
// Kết nối WiFi
connectWiFi();
// Kết nối MQTT
connectMQTT();
// Khởi tạo DHT22
dht.begin();
// Khởi tạo cảm biến siêu âm
setupUltrasonic();
// Cài đặt LED
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
Serial.println("Hệ thống đã sẵn sàng!");
}
void loop() {
// Kết nối lại nếu mất kết nối MQTT
if (!mqtt.connected()) {
connectMQTT();
}
mqtt.processPackets(10); // Giải quyết các gói MQTT trong 10ms
// Đọc dữ liệu từ DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Không đọc được dữ liệu từ cảm biến DHT22!");
delay(2000);
return;
}
// Đọc dữ liệu từ cảm biến siêu âm
float distance = readDistance();
// In dữ liệu ra Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" *C, Humidity: ");
Serial.print(humidity);
Serial.print(" %, Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Gửi dữ liệu lên MQTT
temperatureFeed.publish(temperature);
humidityFeed.publish(humidity);
distanceFeed.publish(distance);
// Điều kiện điều khiển LED
if (temperature > 70) {
digitalWrite(LED_RED, HIGH);
delay(250);
digitalWrite(LED_RED, LOW);
delay(250);
} else if (temperature >= 15 && temperature <= 55 && humidity < 60) {
digitalWrite(LED_GREEN, HIGH);
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
}
// Điều kiện LED dựa trên khoảng cách
if (distance < 10) {
digitalWrite(LED_RED, HIGH);
delay(250);
digitalWrite(LED_RED, LOW);
delay(250);
}
delay(5000); // Đọc và kiểm tra mỗi 2 giây
}