#include <DHT.h>
#include <WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
// Khai báo chân cảm biến
#define DHTPIN 14
#define DHTTYPE DHT22
#define RAIN_PIN 5
#define LDR_PIN 12 // Thay bằng chân analog thích hợp của ESP32
DHT dht(DHTPIN, DHTTYPE);
// Tài khoản Adafruit IO
#define IO_USERNAME "sunnytran"
#define IO_KEY "aio_HbXo75xPUhQ43F7hwSnLl3iEjTKO"
// Cấu hình WiFi
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, "io.adafruit.com", 1883, IO_USERNAME, IO_KEY);
// Khai báo các feed
Adafruit_MQTT_Publish tempFeed = Adafruit_MQTT_Publish(&mqtt, "sunnytran/feeds/temperature");
Adafruit_MQTT_Publish humidityFeed = Adafruit_MQTT_Publish(&mqtt, "sunnytran/feeds/humidity");
Adafruit_MQTT_Publish lightFeed = Adafruit_MQTT_Publish(&mqtt, "sunnytran/feeds/lightLevel");
Adafruit_MQTT_Publish rainStatusFeed = Adafruit_MQTT_Publish(&mqtt, "sunnytran/feeds/rainStatus");
// Biến đo lường
float temperature, humidity;
int lightLevel, rainStatus;
void setup() {
Serial.begin(115200);
// Kết nối WiFi
connectToWiFi();
// Khởi động cảm biến
dht.begin();
Serial.println("Setup completed!");
}
void loop() {
// Kết nối MQTT
connectToMQTT();
// Đọc dữ liệu cảm biến
readSensors();
// Gửi dữ liệu lên Adafruit IO
sendDataToAdafruit();
delay(5000); // Chờ 5 giây trước khi lặp lại
}
void connectToWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
}
void connectToMQTT() {
if (mqtt.connected())
return;
Serial.print("Connecting to MQTT...");
while (mqtt.connect() != 0) {
Serial.print(".");
delay(500);
}
Serial.println("\nConnected to MQTT!");
}
void readSensors() {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
lightLevel = analogRead(LDR_PIN); // Đọc giá trị ánh sáng từ LDR (chân analog)
rainStatus = digitalRead(RAIN_PIN);
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Error reading DHT22 data!");
} else {
Serial.printf("Temperature: %.2f °C, Humidity: %.2f %%\n", temperature, humidity);
}
Serial.printf("Light Level (Analog): %d\n", lightLevel); // Giá trị ánh sáng
Serial.printf("Rain Status: %d\n", rainStatus); // Trạng thái mưa
}
void sendDataToAdafruit() {
// Gửi dữ liệu lên Adafruit IO
if (!tempFeed.publish(temperature)) {
Serial.println("Failed to publish temperature");
}
if (!humidityFeed.publish(humidity)) {
Serial.println("Failed to publish humidity");
}
if (!lightFeed.publish((int32_t)lightLevel)) { // Ép kiểu int32_t cho dữ liệu ánh sáng
Serial.println("Failed to publish light level");
}
if (!rainStatusFeed.publish((int32_t)rainStatus)) {
Serial.println("Failed to publish rain status");
}
}