#include <WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// WiFi配置
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// UDP配置
const char* udpServer = "112.125.89.8";
const int udpPort = 445875;
// 引脚定义
#define DHTPIN 4 // DHT22数据引脚
#define DHTTYPE DHT22
#define LED_PIN 2 // LED引脚
#define RELAY_PIN 14 // 继电器引脚
// 温度阈值设置
const float TEMP_LOW = 23.0; // 低温阈值
const float TEMP_HIGH = 50.0; // 高温阈值
const float HUMID_HIGH = 80.0;
// 初始化对象
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD地址0x27,16列2行
WiFiUDP udp;
unsigned long lastUpdateTime = 0;
const long updateInterval = 2000;
void setup() {
Serial.begin(115200);
// 初始化LCD
Wire.begin();
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Initializing...");
// 初始化引脚
pinMode(LED_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // 继电器默认关闭
// LED的初始状态将由温度决定,不需要在这里设置
// 启动DHT传感器
dht.begin();
// 连接WiFi
connectWiFi();
}
void connectWiFi() {
Serial.print("\nConnecting to WiFi");
lcd.clear();
lcd.print("WiFi connecting");
WiFi.begin(ssid, password);
int dots = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.setCursor(dots % 13, 1);
lcd.print(".");
dots++;
}
Serial.println("\nWiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.print("WiFi Connected!");
delay(1000);
}
void checkThresholds(float temp, float humid) {
if (temp < TEMP_LOW) {
// 低温状态(<25°C):LED亮起,继电器打开(加热)
digitalWrite(LED_PIN, HIGH);
digitalWrite(RELAY_PIN, LOW); // 继电器开启(低电平触发)
}
else if (temp > TEMP_HIGH) {
// 高温状态(>38°C):LED亮起,继电器关闭
digitalWrite(LED_PIN, HIGH);
digitalWrite(RELAY_PIN, HIGH);
}
else {
// 正常温度范围(25-38°C):LED关闭,继电器关闭
digitalWrite(LED_PIN, LOW);
digitalWrite(RELAY_PIN, HIGH);
}
}
void sendUDPData(float temp, float humid) {
char buffer[100];
snprintf(buffer, sizeof(buffer),
"{\"temperature\":%.1f,\"humidity\":%.1f,\"device\":\"ESP32\"}",
temp, humid);
udp.beginPacket(udpServer, udpPort);
udp.print(buffer);
udp.endPacket();
Serial.print("UDP data sent: ");
Serial.println(buffer);
}
void updateDisplay(float temp, float humid) {
lcd.clear();
// 第一行显示温度
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp, 1);
lcd.print("C");
// 第二行显示湿度
lcd.setCursor(0, 1);
lcd.print("Humi: ");
lcd.print(humid, 1);
lcd.print("%");
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime >= updateInterval) {
lastUpdateTime = currentTime;
// 读取传感器数据
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// 检查读取是否成功
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
lcd.clear();
lcd.print("Sensor Error!");
return;
}
// 更新显示
updateDisplay(temperature, humidity);
// 检查阈值并控制输出
checkThresholds(temperature, humidity);
// 发送数据到UDP服务器
sendUDPData(temperature, humidity);
// 串口输出
Serial.printf("Temperature: %.1f°C, Humidity: %.1f%%\n",
temperature, humidity);
}
}