#include <AdafruitIO_WiFi.h> // Thư viện Adafruit IO
#include <DHT.h> // Thư viện DHT
#include <Adafruit_Sensor.h> // Thư viện Adafruit Sensor
#define IO_USERNAME "thaisonlt42" // Lấy mã Key từ server Adafruit.io
#define IO_KEY "aio_klcb68dTyvIKMVQrsvy4BQx78AY6"
#define WIFI_SSID "Wokwi-GUEST" // Tên wifi để ESP 32 kết nối vào và truy cập đến server.
#define WIFI_PASS "" // Pass wifi (để trống vì không cần mật khẩu)
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS); // Gọi hàm kết nối đến server.
#define LED_PIN 2 // LED on Board là GPIO 2.
#define DHTPIN 4 // Chân DATA của cảm biến DHT
#define DHTPIN1 5 // Phòng khách
#define DHTPIN2 18 // Phòng ngủ
#define DHTPIN3 19 // Nhà bếp
#define DHTTYPE DHT22 // Loại cảm biến DHT (DHT11 hoặc DHT22)
DHT dht(DHTPIN, DHTTYPE); // Khởi tạo cảm biến DHT
DHT dht1(DHTPIN1, DHTTYPE); // Cảm biến 1
DHT dht2(DHTPIN2, DHTTYPE); // Cảm biến 2
DHT dht3(DHTPIN3, DHTTYPE); // Cảm biến 3
// set up the 'digital' feed
AdafruitIO_Feed *digital = io.feed("Digital"); // khai báo con trỏ digital để chứa dữ liệu lấy từ feed của server.
AdafruitIO_Feed *temperature = io.feed("Temperature"); // Khai báo feed cho nhiệt độ
AdafruitIO_Feed *humidity = io.feed("Humidity"); // Khai báo feed cho độ ẩm
AdafruitIO_Feed *livingRoomTemp = io.feed("LivingRoomTemp"); // Phòng khách
AdafruitIO_Feed *bedroomTemp = io.feed("BedroomTemp"); // Phòng ngủ
AdafruitIO_Feed *kitchenTemp = io.feed("KitchenTemp"); // Nhà bếp
void setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
while(! Serial);
Serial.print("Connecting to Adafruit IO");
io.connect();
// wait for a connection
while(io.status() < AIO_CONNECTED) {
Serial.print("."); // Nếu chưa kết nối được đến server sẽ tiến hành xuất ra màn hình dấu "."
delay(500);
}
// we are connected
Serial.println();
Serial.println(io.statusText()); // Nếu đã kết nối thành công tiến hành xuất ra màn hình trạng thái.
// set up a message handler for the 'digital' feed.
// the handleMessage function (defined below)
// will be called whenever a message is
// received from adafruit io.
digital->get(); // lấy dữ liệu từ feed 'Digital' của server.
digital->onMessage(handleMessage); // Gọi hàm đọc dữ liệu và tiến hành điều khiển led và xuất ra trạng thái trên màn hình.
// Khởi động cảm biến DHT
dht.begin();
dht1.begin();
dht2.begin();
dht3.begin();
}
void loop() {
io.run(); // gọi hàm Run.
// Đọc dữ liệu từ cảm biến DHT
float h = dht.readHumidity();
float t = dht.readTemperature();
float livingRoomTemperature = dht1.readTemperature();
float bedroomTemperature = dht2.readTemperature();
float kitchenTemperature = dht3.readTemperature();
// Kiểm tra nếu đọc dữ liệu thất bại
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Gửi dữ liệu nhiệt độ và độ ẩm lên Adafruit IO
temperature->save(t);
humidity->save(h);
livingRoomTemp->save(livingRoomTemperature);
bedroomTemp->save(bedroomTemperature);
kitchenTemp->save(kitchenTemperature);
// In dữ liệu ra Serial Monitor
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" °C, Humidity: ");
Serial.print(h);
Serial.println(" %");
Serial.print("Living Room Temperature: ");
Serial.print(livingRoomTemperature);
Serial.print(" °C, Bedroom Temperature: ");
Serial.print(bedroomTemperature);
Serial.print(" °C, Kitchen Temperature: ");
Serial.print(kitchenTemperature);
Serial.println(" °C");
// Delay giây trước khi đọc lại
delay(500);
}
// this function is called whenever an 'Digital' feed message
// is received from Adafruit IO. it was attached to
// the 'Digital' feed in the setup() function above.
void handleMessage(AdafruitIO_Data *data) { // hàm handleMessage để đọc dữ liệu.
// xuất ra màn hình trạng thái của nút nhấn trên feed vừa đọc được.
Serial.print("received <- ");
if(data->toPinLevel() == HIGH) {
Serial.println("HIGH");
digitalWrite(LED_PIN, HIGH); // Bật LED
} else {
Serial.println("LOW");
digitalWrite(LED_PIN, LOW); // Tắt LED
}
}