#include <WiFi.h>
#include "AdafruitIO_WiFi.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ---------- Cấu hình Adafruit IO ----------
#define ADAFRUIT_IO_USERNAME "ThienAn0210"
#define ADAFRUIT_IO_KEY "aio_CoFF45jJ5eDq37VeFaWoJt7hnV20"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
// ---------- Khai báo IO ----------
AdafruitIO_WiFi io(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY, WIFI_SSID, WIFI_PASS);
AdafruitIO_Feed *temperatureFeed = io.feed("temperature");
AdafruitIO_Feed *humidityFeed = io.feed("humidity");
AdafruitIO_Feed *gasFeed = io.feed("gass");
AdafruitIO_Feed *ledStatusFeed = io.feed("led-state");
AdafruitIO_Feed *ledControl = io.feed("led");
// ---------- Cấu hình cảm biến ----------
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define GAS_PIN A0
// ---------- LCD ----------
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ---------- Thiết bị cảnh báo ----------
#define LED_PIN 2
#define BUZZER_PIN 17
bool ledStateFromCloud = false;
// ---------- Biến lưu giá trị cũ ----------
float lastTemp = -1000, lastHum = -1000;
int lastGas = -1;
int lastLedStatus = -1;
unsigned long lastSend = 0;
const unsigned long sendInterval = 5000; // 5 giây
// ---------- Xử lý LED từ dashboard ----------
void handleLedControl(AdafruitIO_Data *data) {
int value = data->toInt();
ledStateFromCloud = (value == 1);
Serial.print("Received LED control: ");
Serial.println(ledStateFromCloud);
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
lcd.init();
lcd.backlight();
// Kết nối Adafruit IO
Serial.print("Connecting to Adafruit IO...");
io.connect();
ledControl->onMessage(handleLedControl);
while (io.status() < AIO_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println(" Connected!");
ledControl->get(); // Lấy trạng thái ban đầu
}
void loop() {
io.run();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int gas = analogRead(GAS_PIN);
// Hiển thị LCD
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp);
lcd.print((char)223);
lcd.print("C ");
lcd.print("H:");
lcd.print((int)hum);
lcd.print("% ");
lcd.setCursor(0, 1);
lcd.print("Gas:");
lcd.print(gas);
lcd.print("ppm ");
// Cảnh báo
bool warning = (temp > 60.0) || (hum > 50.0) || (gas > 3000);
if (warning) {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, ledStateFromCloud);
}
// Gửi dữ liệu nếu có thay đổi và sau mỗi 5 giây
unsigned long now = millis();
if (now - lastSend >= sendInterval) {
if (abs(temp - lastTemp) > 0.5) {
temperatureFeed->save(temp);
lastTemp = temp;
}
if (abs(hum - lastHum) > 1.0) {
humidityFeed->save(hum);
lastHum = hum;
}
if (abs(gas - lastGas) > 50) {
gasFeed->save(gas);
lastGas = gas;
}
int ledStatus = digitalRead(LED_PIN);
if (ledStatus != lastLedStatus) {
ledStatusFeed->save(ledStatus);
lastLedStatus = ledStatus;
}
lastSend = now;
}
delay(100); // delay nhỏ để không block
}