#include <AdafruitIO.h>
#include <AdafruitIO_WiFi.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Khai báo thông tin Adafruit IO
#define IO_USERNAME "minhhphuongg"
#define IO_KEY "aio_VpxL67ympi2cjDRyoXx6cQnvJ5yj"
// Cảm biến DHT
#define DHTPIN 19
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Kết nối WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// LED
#define LED_PIN1 26
#define LED_PIN2 25
// Cảm biến ánh sáng
#define LIGHT_SENSOR_AO_PIN 34
#define LIGHT_SENSOR_DO_PIN 32
// Buzzer
#define BUZZER_PIN 27
// HC-SR04
#define TRIG_PIN 14
#define ECHO_PIN 12
// Feed Adafruit IO
AdafruitIO_Feed *temperature = io.feed("temperature");
AdafruitIO_Feed *humidity = io.feed("humidity");
AdafruitIO_Feed *khoangcach = io.feed("khoangcach");
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
// Khởi tạo các thiết bị
xTaskCreate(ledTask1, "LED1 Task", 2048, NULL, 1, NULL);
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LIGHT_SENSOR_AO_PIN, INPUT);
pinMode(LIGHT_SENSOR_DO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(115200);
while (!Serial);
// Kết nối Adafruit IO
Serial.print("Connecting to Adafruit IO");
io.connect();
while (io.status() < AIO_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.println(io.statusText());
// Khởi tạo cảm biến DHT và LCD
dht.begin();
lcd.init();
lcd.backlight();
}
void loop() {
io.run();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int lightAnalog = analogRead(LIGHT_SENSOR_AO_PIN);
float brightness = ((4095 - lightAnalog) / 4095.0) * 100;
int distance = getDistance(); // Đọc khoảng cách từ HC-SR04
if (!isnan(temp) && !isnan(hum)) {
temperature->save(temp);
humidity->save(hum);
khoangcach->save(distance);
Serial.print("Nhiệt độ: ");
Serial.print(temp);
Serial.print(" °C, Độ ẩm: ");
Serial.print(hum);
Serial.print(" %, Khoảng cách: ");
Serial.print(distance);
Serial.print(" cm, Ánh sáng: ");
Serial.print(brightness);
Serial.println("%");
lcd.clear(); // Xoá màn hình LCD
lcd.setCursor(0, 0); // Di chuyển con trỏ về góc trên bên trái
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1); // Di chuyển con trỏ xuống dòng thứ 2
lcd.print("Hum: ");
lcd.print(hum);
lcd.print(" %");
if (temp > 15 && temp <60 && hum <60) {
digitalWrite(LED_PIN2, HIGH); // Bật LED2 nếu nhiệt độ cao
} else {
digitalWrite(LED_PIN2, LOW); // Tắt LED2
}
} else {
Serial.println("Lỗi khi đọc cảm biến!");
}
delay(5000);
}
// Hàm tính khoảng cách từ HC-SR04
int getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, HIGH);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2; // Tính khoảng cách (cm)
return distance;
}
void ledTask1(void *pvParameters) { // Task nhấp nháy LED
while(1){
float temp = dht.readTemperature(); // Đọc nhiệt độ từ cảm biến DHT
int localDistance = getDistance(); // Lấy khoảng cách đã chuyển đổi từ func getDistance
if(temp > 60 && localDistance < 5) {
digitalWrite(LED_PIN1, HIGH); // Bật LED1, Buzzer
digitalWrite(BUZZER_PIN, HIGH);
vTaskDelay(250 / portTICK_PERIOD_MS); // Đợi 250ms
digitalWrite(LED_PIN1, LOW); // Tắt LED1, Buzzer
digitalWrite(BUZZER_PIN, LOW);
vTaskDelay(250 / portTICK_PERIOD_MS); // Đợi 250ms
}
else {
digitalWrite(LED_PIN1, LOW); // Tắt LED1, Buzzer
digitalWrite(BUZZER_PIN, LOW);
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Đợi 500ms trước khi lặp lại
}
}