#include <WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.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");
Adafruit_MQTT_Publish lightFeed = Adafruit_MQTT_Publish(&mqtt, IO_USERNAME "/feeds/light");
// 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
// Cấu hình cảm biến LDR
#define LDR_PIN 34
// Cấu hình buzzer
#define BUZZER_PIN 25 // Chân GPIO cho buzzer
// Cấu hình LCD
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
void setupUltrasonic() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
float readDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
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!");
}
void connectMQTT() {
while (!mqtt.connected()) {
Serial.print("Kết nối MQTT...");
if (mqtt.connect(IO_USERNAME, IO_KEY)) {
Serial.println(" Đã kết nối MQTT!");
} else {
Serial.println(" Lỗi kết nối MQTT! Đang thử lại...");
delay(5000);
}
}
}
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);
// Cài đặt buzzer
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
// Khởi tạo LCD
lcd.init();
lcd.backlight();
lcd.print("System Ready!");
delay(2000);
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);
// Đọ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();
// Đọc dữ liệu từ cảm biến LDR
int analogValue = analogRead(LDR_PIN);
float voltage = analogValue * (3.3 / 4095.0); // Chuyển đổi giá trị ADC sang điện áp
float lux = voltage * 500; // Công thức quy đổi điện áp sang Lux (giả định)
// 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.print(" cm, Light: ");
Serial.println(lux);
Serial.print(" lumen ");
// Gửi dữ liệu lên MQTT
temperatureFeed.publish(temperature);
humidityFeed.publish(humidity);
distanceFeed.publish(distance);
lightFeed.publish(lux);
// Hiển thị dữ liệu lên LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature);
lcd.print("C H:");
lcd.print(humidity);
lcd.setCursor(0, 1);
lcd.print("D:");
lcd.print(distance);
lcd.print("cm L:");
lcd.print((int)lux);
// Điều kiện điều khiển LED và buzzer
if (temperature > 70) {
digitalWrite(LED_RED, HIGH);
for (int i = 0; i < 5; i++) { // Buzzer kêu 5 lần
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(200);
}
digitalWrite(LED_RED, LOW);
} 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);
}