#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 定义引脚
#define DHTPIN 12 // DHT22数据引脚连接到ESP32的GPIO12
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define LCD_ADDR 0x27 // I2C地址,根据你的LCD模块可能有所不同
#define LED_BLUE 23 // 蓝色LED引脚
#define LED_RED 22 // 红色LED引脚
#define RELAY_PIN 21 // 继电器引脚
// WiFi和MQTT设置
const char* ssid = "1";
const char* password = "1234567890";
const char* mqtt_server = "broker.emqx.io";
const char* topic = "esp32/qm";
const int mqtt_port = 1883;
const char* mqtt_username = "lq196";
const char* mqtt_password = "lq196";
// 创建DHT实例
DHT dht(DHTPIN, DHTTYPE);
// 创建LCD实例
LiquidCrystal_I2C lcd(LCD_ADDR, 16, 2);
// 创建PubSubClient实例
WiFiClient espClient;
PubSubClient client(espClient);
// 温湿度阈值
const float temp_low_threshold = 25.0;
const float temp_high_threshold = 38.0;
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
// 打印主题和负载
Serial.print("Received message on topic: ");
Serial.println(topic);
Serial.print("Payload: ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "esp32-client-";
clientId += WiFi.macAddress();
if (client.connect(clientId.c_str(), mqtt_username, mqtt_password)) {
Serial.println("connected");
client.publish(topic, "ESP32 connected");
client.subscribe(topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
// 初始化串口通信
Serial.begin(115200);
// 初始化DHT传感器
dht.begin();
// 初始化LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Initializing...");
// 初始化LED和继电器
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
// 初始化WiFi
setup_wifi();
// 初始化MQTT客户端
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
// 检查WiFi连接
if (!WiFi.isConnected()) {
setup_wifi();
}
// 检查MQTT连接
if (!client.connected()) {
reconnect();
}
client.loop();
// 读取DHT传感器数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查是否读取失败,并显示错误信息
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 更新LCD显示
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature);
lcd.print("C H:");
lcd.print(humidity);
lcd.println("%");
// 更新LED和继电器状态
digitalWrite(LED_BLUE, temperature < temp_low_threshold ? HIGH : LOW);
digitalWrite(LED_RED, temperature > temp_high_threshold ? HIGH : LOW);
digitalWrite(RELAY_PIN, temperature < temp_low_threshold ? HIGH : LOW);
// 发布温湿度数据到MQTT
char msg[50];
snprintf(msg, sizeof(msg), "temp=%.1f&humidity=%.1f", temperature, humidity);
client.publish(topic, msg);
// 延时1秒
delay(1000);
}