#include <Arduino.h>
#include <AdafruitIO.h>
#include <AdafruitIO_WiFi.h> // Thư viện kết nối WiFi cho Adafruit IO
#include <DHT.h> // Thư viện để làm việc với cảm biến DHT
#define IO_USERNAME "NTQ3000"
#define IO_KEY "aio_lvCu553jVwCxoA95kgKnMQf6DAnF"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
// Khai báo đối tượng Adafruit IO
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// Khai báo chân kết nối cảm biến DHT
#define DHT_PIN 4
#define DHT_TYPE DHT22 // Loại cảm biến DHT
DHT dht(DHT_PIN, DHT_TYPE);
// Khai báo các feed
AdafruitIO_Feed *digital = io.feed("Digital");
AdafruitIO_Feed *temperature = io.feed("Temperature");
AdafruitIO_Feed *humidity = io.feed("Humidity");
AdafruitIO_Feed *distance= io.feed("distance");
AdafruitIO_Feed *LED1= io.feed("LED1");
AdafruitIO_Feed *LED2= io.feed("LED2");
// Khai báo chân LED
#define LED_PIN1 2
#define LED_PIN2 14
#define trg 33
#define echo 32
// Hàm callback xử lý khi nhận được dữ liệu từ feed 'DIGITAL'
void handleMessage(AdafruitIO_Data *data) {
Serial.print("Received <- ");
if (data->toPinLevel() == HIGH) {
Serial.println("HIGH");
} else {
Serial.println("LOW");
}
// Điều khiển LED on-board theo trạng thái nhận được
digitalWrite(LED_PIN1, data->toPinLevel());
digitalWrite(LED_PIN2, data->toPinLevel());
}
void setup() {
pinMode(LED_PIN1, OUTPUT); // Cài đặt LED_PIN là output
pinMode(LED_PIN2, OUTPUT); // Cài đặt LED_PIN là output
pinMode(trg, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600); // Khởi động kết nối Serial
// Đợi kết nối Serial
while (!Serial);
// Khởi tạo cảm biến DHT
dht.begin();
// Kết nối WiFi
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
// Kết nối đến Adafruit IO
Serial.print("Connecting to Adafruit IO...");
io.connect(); // Kết nối đến Adafruit IO
// Đợi kết nối thành công
while (io.status() < AIO_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println(io.statusText()); // Hiển thị trạng thái kết nối
// Đăng ký hàm callback cho feed 'DIGITAL'
digital->onMessage(handleMessage);
}
void loop() {
io.run(); // Duy trì kết nối và xử lý dữ liệu
digitalWrite(trg, LOW);
delayMicroseconds(2);
digitalWrite(trg, HIGH);
delayMicroseconds(10);
digitalWrite(trg, LOW);
int time;
float dis;
int kt1=0;
int kt2=0;
time=pulseIn(echo,HIGH);
dis=time*0.034/2;
// Đọc nhiệt độ và độ ẩm từ cảm biến DHT11
float temp = dht.readTemperature(); // Đọc nhiệt độ (Celsius)
float hum = dht.readHumidity(); // Đọc độ ẩm
bool led=false;
// Kiểm tra xem có lỗi trong quá trình đọc cảm biến không
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Hiển thị giá trị đọc được
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print(" °C, Humidity: ");
Serial.print(hum);
Serial.println(" %");
Serial.print("khoangcach: ");
Serial.print(dis);
Serial.println(" cm");
if(temp>70){
digitalWrite(LED_PIN1, HIGH);
delay(500);
digitalWrite(LED_PIN1, LOW);
delay(500);
kt1=2;
}
else {
digitalWrite(LED_PIN1, LOW);
kt1=0;
}
if(temp>10 && temp<50 && hum<70){
digitalWrite(LED_PIN2, HIGH);
kt2=2;
}
else {
digitalWrite(LED_PIN2, LOW);
kt2=0;
}
// Gửi giá trị nhiệt độ và độ ẩm lên Adafruit IO
temperature->save(temp); // Gửi giá trị nhiệt độ
humidity->save(hum); // Gửi giá trị độ ẩm
distance->save(dis);
LED1->save(kt1);
LED2->save(kt2);
// Kiểm tra điều kiện nhiệt độ và độ ẩm để kích hoạt còi và đèn báo hiệu
// Chờ một chút trước khi đọc lại cảm biến (2 giây)
delay(2000);
}