#include <DHT.h>
// 引脚定义
const int lll = 10; // 红灯控制引脚
const int ttt = 6; // 绿灯控制引脚
const int buttonPin = 9; // 微动按钮引脚(接9号引脚)
#define DHTPIN 2 // DHT传感器引脚
#define DHTTYPE DHT22 // 传感器型号
DHT dht(DHTPIN, DHTTYPE);
// 系统变量
bool manualOverride = false; // 手动覆盖标志
bool redLightState = false; // 红灯当前状态
unsigned long lastButtonTime = 0; // 最后一次按钮操作时间
const unsigned long DEBOUNCE_DELAY = 50; // 按钮消抖时间(ms)
void setup() {
Serial.begin(115200);
Serial.println(F("系统启动 - 自动模式"));
// 初始化引脚
pinMode(lll, OUTPUT);
digitalWrite(lll, LOW);
pinMode(ttt, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // 使用内部上拉电阻
dht.begin();
}
void loop() {
// 1. 处理按钮输入(带消抖)
bool buttonState = digitalRead(buttonPin);
if (buttonState == LOW && (millis() - lastButtonTime > DEBOUNCE_DELAY)) {
handleButtonPress();
lastButtonTime = millis();
}
// 2. 读取传感器数据
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("传感器数据读取失败!"));
delay(1000);
return;
}
// 3. LED控制逻辑
if (manualOverride) {
// 手动覆盖模式:保持当前红灯状态
digitalWrite(lll, redLightState ? HIGH : LOW);
} else {
// 自动模式:温度>30度时亮灯
digitalWrite(lll, t > 30 ? HIGH : LOW);
}
// 绿灯始终自动控制
digitalWrite(ttt, h > 60 ? HIGH : LOW);
// 4. 系统状态输出
Serial.print(F("湿度: "));
Serial.print(h);
Serial.print(F("% 温度: "));
Serial.print(t);
Serial.print(F("°C 模式: "));
Serial.print(manualOverride ? "手动" : "自动");
Serial.print(F(" 红灯: "));
Serial.print(digitalRead(lll) ? "开" : "关");
Serial.print(F(" 绿灯: "));
Serial.println(digitalRead(ttt) ? "开" : "关");
delay(1000); // 适当延时
}
void handleButtonPress() {
manualOverride = !manualOverride; // 切换手动/自动模式
if (manualOverride) {
redLightState = !redLightState; // 切换红灯状态
Serial.print(F("进入手动模式,红灯"));
Serial.println(redLightState ? "开启" : "关闭");
} else {
Serial.println(F("返回自动模式"));
}
// 立即更新红灯状态
digitalWrite(lll, manualOverride ? redLightState : (dht.readTemperature() > 30));
}