#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// 1. DHT22 引脚定义(和你接的PA1对应)
#define DHTPIN PA1
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// 2. I2C-LCD1602 初始化(地址0x27,Wokwi通用)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 3. 实验参数
#define COLLECT_TIME 1200 // 20分钟=1200秒,快速测试改12即可
#define TEMP_THRESHOLD 30.0
#define HUMI_THRESHOLD 60.0
unsigned long sys_time = 0;
bool collect_finish = false;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight(); // 打开LCD背光
pinMode(LED_BUILTIN, OUTPUT);
// LCD开机欢迎界面
lcd.print("STM32温湿度系统");
lcd.setCursor(0, 1);
lcd.print("System Ready");
delay(2000);
lcd.clear();
Serial.println("===== 带I2C-LCD的温湿度检测系统 =====");
}
void loop() {
float humi = dht.readHumidity();
float temp = dht.readTemperature();
// 1. LCD显示(两行数据,稳定不闪)
lcd.setCursor(0, 0);
lcd.print("T:");
if (isnan(temp)) {
lcd.print("---.-C");
} else {
lcd.print(temp, 1);
lcd.print("C ");
}
lcd.setCursor(8, 0);
lcd.print("H:");
if (isnan(humi)) {
lcd.print("---.-%");
} else {
lcd.print(humi, 1);
lcd.print("% ");
}
lcd.setCursor(0, 1);
lcd.print("Time:");
lcd.print(sys_time);
lcd.print("s");
// 2. 串口输出(解决读取失败问题)
if(sys_time < COLLECT_TIME && !collect_finish) {
Serial.print("时间:");
Serial.print(sys_time);
Serial.print("s | ");
if(isnan(temp) || isnan(humi)) {
Serial.println("温湿度读取失败!");
digitalWrite(LED_BUILTIN, LOW);
} else {
Serial.print("温度:");
Serial.print(temp, 1);
Serial.print("℃ | 湿度:");
Serial.print(humi, 1);
Serial.print("% ");
if(temp >= TEMP_THRESHOLD || humi >= HUMI_THRESHOLD) {
Serial.println("★超限报警!LED亮★");
digitalWrite(LED_BUILTIN, HIGH);
} else {
Serial.println("LED灭");
digitalWrite(LED_BUILTIN, LOW);
}
}
Serial.println();
if(sys_time >= COLLECT_TIME && !collect_finish) {
collect_finish = true;
Serial.println("★采集完成!★");
lcd.clear();
lcd.print("Collect Done!");
}
}
sys_time += 2;
delay(2000);
}Loading
st-nucleo-c031c6
st-nucleo-c031c6