#define BLINKER_WIFI
#include <WiFi.h>
#include <Blinker.h>
#include <ESP32Servo.h>
#include <SimpleTimer.h>
#include <DHT.h>
#include <ESP32Tone.h>
// 设备配置
char auth[] = "edd92b7514b9";
char ssid[] = "Wokwi-GUEST";
char pswd[] = "";
// 引脚定义
#define DHT_PIN 15
#define DHT_TYPE DHT22
#define AC_PIN 26
#define DOOR_PIN 27
#define LIGHT_PIN 18
#define BUZZER_PIN 19
#define BRIGHTNESS_PIN 34
#define GAS_PIN 33
// 全局变量
volatile float temp = 0;
volatile float humidity = 0;
volatile int brightness = 0;
volatile int gas = 0;
volatile bool autoMode = true;
// Blinker组件
BlinkerButton Button1("btn-ktkg");
BlinkerButton Button2("btn-mckg");
BlinkerButton Button3("btn-zmkg");
BlinkerButton Button4("btn-mode");
BlinkerNumber Number1("num-wd");
BlinkerNumber Number2("num-sd");
BlinkerNumber Number3("num-lux");
BlinkerNumber Number4("num-mq2");
Servo doorServo;
DHT dht(DHT_PIN, DHT_TYPE);
SimpleTimer timer;
// 按钮回调
void Button1_callback(const String &state) {
if (autoMode) return;
if (state == "on") {
digitalWrite(AC_PIN, HIGH);
Button1.color("#ff0000");
Button1.text("空调已打开");
} else {
digitalWrite(AC_PIN, LOW);
Button1.color("#666666");
Button1.text("空调已关闭");
}
Button1.print(state);
}
void Button2_callback(const String &state) {
if (autoMode) return;
if (state == "on") {
doorServo.write(90);
Button2.color("#ff0000");
Button2.text("门窗已打开");
} else {
doorServo.write(0);
Button2.color("#666666");
Button2.text("门窗已关闭");
}
Button2.print(state);
}
void Button3_callback(const String &state) {
if (autoMode) return;
if (state == "on") {
digitalWrite(LIGHT_PIN, HIGH);
Button3.color("#ff0000");
Button3.text("照明已打开");
} else {
digitalWrite(LIGHT_PIN, LOW);
Button3.color("#666666");
Button3.text("照明已关闭");
}
Button3.print(state);
}
void Button4_callback(const String &state) {
if (state == "on") {
autoMode = true;
Button4.color("#ff0000");
Button4.text("自动模式");
runAutoControl();
} else {
autoMode = false;
Button4.color("#666666");
Button4.text("手动模式");
digitalWrite(AC_PIN, LOW);
doorServo.write(0);
digitalWrite(LIGHT_PIN, LOW);
noTone(BUZZER_PIN);
}
Button4.print(state);
}
// 数据上传
void uploadSensorData() {
Number1.print(temp);
Number2.print(humidity);
Number3.print(brightness);
Number4.print(gas);
}
//自动控制
void runAutoControl() {
if (!autoMode) return;
if (temp > 30) {
digitalWrite(AC_PIN, HIGH);
} else {
digitalWrite(AC_PIN, LOW);
}
if (gas > 200) {
doorServo.write(90);
tone(BUZZER_PIN, 850);
} else {
doorServo.write(0);
noTone(BUZZER_PIN);
}
if (brightness < 1000) {
digitalWrite(LIGHT_PIN, HIGH);
} else {
digitalWrite(LIGHT_PIN, LOW);
}
}
// 读取传感器
void readSensors() {
temp = dht.readTemperature();
humidity = dht.readHumidity();
if (isnan(temp) || isnan(humidity)) {
Serial.println("DHT 读取失败");
return;
}
int analogLight = analogRead(BRIGHTNESS_PIN);
brightness = map(analogLight, 0, 4095, 4095, 0);
gas = map(analogRead(GAS_PIN), 843, 4041, 0, 1000);
gas = constrain(gas, 0, 1000);
}
// 初始化
void setup() {
Serial.begin(9600);
pinMode(AC_PIN, OUTPUT);
pinMode(LIGHT_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
doorServo.attach(DOOR_PIN);
Button1.attach(Button1_callback);
Button2.attach(Button2_callback);
Button3.attach(Button3_callback);
Button4.attach(Button4_callback);
Blinker.begin(auth, ssid, pswd);
dht.begin();
timer.setInterval(3000L, uploadSensorData);
//自动模式 + 执行一次自动逻辑
autoMode = true;
digitalWrite(AC_PIN, LOW);
doorServo.write(0);
digitalWrite(LIGHT_PIN, LOW);
Serial.println("系统启动完成 → 默认【自动模式】");
}
// 主循环
void loop() {
Blinker.run();
timer.run();
static unsigned long lastRead = 0;
if (millis() - lastRead >= 1000) {
lastRead = millis();
readSensors();
runAutoControl();
Serial.print("温度:");
Serial.print(temp);
Serial.print(" 湿度:");
Serial.print(humidity);
Serial.print(" 亮度:");
Serial.print(brightness);
Serial.print(" 有害气体:");
Serial.println(gas);
}
}