作品思路
主板:ESP32 DEVKIT V1
元器件:SSD1306、双色LED、无源蜂鸣器、温湿度传感器DHT11、红外接收器、继电器
物联网平台:Blynk
1.blynk信息:
#define BLYNK_TEMPLATE_ID “TMPL6WOGKAWRm”
#define BLYNK_TEMPLATE_NAME “Quickstart Device”
#define BLYNK_AUTH_TOKEN “Ohi-g35zgiLx3QocVYeG8orr1NQV588x”
2.wifi信息:
char ssid[] = “bofanlegao1”;
char pass[] = “bflg5105”
3.服务器信息:
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass, “https://blynk.jinaisun.cn”, 8099);
引脚连接:
SSD1306(I²C 通信)—-SDA:21, SCL:22
双色 LED—-绿色 LED :15,红色 LED:5
无源蜂鸣器—-18
温湿度传感器 DHT11 —-4
红外接收器—-23
继电器—-19
5v:继电器、温湿度传感器
3v3:SSD1306、无源蜂鸣器、红外接收器、双色LED
程序目的:
一、红外接收器:
1.可以启动或者关闭继电器(空调)
①空调开关键码:FF629D
2.继电器(空调)打开后后可以调节变量(空调温度)增加或者减小
① 温度增加键码:FFE21D
②温度降低键码:FFA25D
二、无源蜂鸣器:
1.红外接收器收到信号或者blynk远程控制会有提示音
三、双色LED
1.显示继电器(空调)的开关,开机绿色,关机红色
四、温湿度传感器DHT11
1.监测温湿度
五、继电器
1.红外接收器或者blynk控制开关
六、SSD1306
1.第一行显示—-当前日期和时间(格式:xxxx/xx/xx/xx:xx)
2.第二行显示—-温湿度:xx°/xx%
3.第三行显示—-空调状态:ON/OFF
4第四行显示—–空调设置温度:xx°(每次开机默认18°)
七、blynk手机端
1.显示:
①当前日期和时间(格式:xxxx/xx/xx/xx:xx)
②实时温度:xx°
③实时湿度:xx%
④空调状态:ON/OFF
⑤空调设置温度:xx°(每次开机默认18°)
2.控制:
①可以启动或者关闭继电器(空调)
②继电器(空调)打开后后可以调节变量(空调温度)增加或者减小
pcb仿真图:
顶视图
-300x300.png)
底视图

注:底视图的文字没有翻转过来,是镜像的,下次要多注意
程序代码:
// 定义Blynk模板ID、名称和认证令牌
#define BLYNK_TEMPLATE_ID           "TMPL6WOGKAWRm"
#define BLYNK_TEMPLATE_NAME         "Quickstart Device"
#define BLYNK_AUTH_TOKEN            "Ohi-g35zgiLx3QocVYeG8orr1NQV588x"
#include <Arduino.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>
#include <Adafruit_Sensor.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
// 定义星期的中文名称
const char* weekdays[] = {"周日", "周一", "周二", "周三", "周四", "周五", "周六"};
// SSD1306 显示屏相关定义
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(
    U8G2_R0, 
    /* clock=*/ 22,
    /* data=*/ 21,
    /* reset=*/ U8X8_PIN_NONE); 
// DHT11 传感器相关定义
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// 红外接收器相关定义
IRrecv irrecv(23);
decode_results results;
// 双色 LED 引脚定义
#define LED_GREEN 15
#define LED_RED 5
// 无源蜂鸣器引脚定义
#define BUZZER_PIN 18
// 继电器引脚定义
#define RELAY_PIN 19
// 温度、湿度、空调状态等变量
float temperature = 0;
float humidity = 0;
bool airConditionerOn = false;
int setTemperature = 18;
bool airConditionerOn_increase= false;
bool airConditionerOn_decrease = false;
// 蜂鸣器提示音函数
void playBuzzer() {
    tone(BUZZER_PIN, 1000, 100);
}
// 双色 LED 状态设置
void setLEDColor(bool isOn) {
    if (isOn) {
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_RED, LOW);
    } else {
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, HIGH);
    }
}
// WiFi 配置
char ssid[] = "bofanlegao1";
char pass[] = "bflg5105";
// Blynk 虚拟引脚定义
WidgetLED button(V6);
WidgetLCD lcd(V0);
// 限制温度范围
void limitTemperature() {
    if (setTemperature > 30) {
        setTemperature = 30;
    } else if (setTemperature < 16) {
        setTemperature = 16;
    }
}
void setup() {
    // 初始化串口
    Serial.begin(115200);
    // 初始化 WiFi 和 Blynk
    WiFi.begin(ssid, pass);
    Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass, "https://blynk.jinaisun.cn", 8099);
    // 初始化 DHT11 传感器
    dht.begin();
    // 初始化红外接收器
    irrecv.enableIRIn();
    // 初始化双色 LED
    pinMode(LED_GREEN, OUTPUT);
    pinMode(LED_RED, OUTPUT);
    digitalWrite(LED_RED, HIGH);
    digitalWrite(LED_GREEN, LOW);
    // 初始化无源蜂鸣器
    pinMode(BUZZER_PIN, OUTPUT);
    // 初始化继电器
    pinMode(RELAY_PIN, OUTPUT);
    // 初始化 SSD1306 显示屏
    u8g2.begin();
    // 启用 UTF-8 编码以支持中文字符
    u8g2.enableUTF8Print();
    // 设置字体(确保字体包含中文字符)
    u8g2.setFont(u8g2_font_wqy12_t_gb2312);
    // 设置时间同步和时区(东八区偏移量为 8 * 3600 秒)
    configTime(8 * 3600, 0, "pool.ntp.org");
}
// 控制空调开关的按钮
BLYNK_WRITE(V6) {
    int buttonValue = param.asInt();
    if (buttonValue == 1) {
        airConditionerOn = true;
        setLEDColor(true);
        digitalWrite(RELAY_PIN, HIGH);
        playBuzzer();
    } else if (buttonValue == 0) {
        airConditionerOn = false;
        setLEDColor(false);
        digitalWrite(RELAY_PIN, LOW);
        setTemperature = 18;
        playBuzzer();
    }
}
// 控制温度增加的按钮
BLYNK_WRITE(V7) {
    if (airConditionerOn) {
        airConditionerOn_increase = !airConditionerOn_increase;
        if (!airConditionerOn_increase){
            setTemperature++;
            limitTemperature();
            playBuzzer();
        }
    }
}
// 控制温度减少的按钮
BLYNK_WRITE(V8) {
    if (airConditionerOn) {
        airConditionerOn_decrease = !airConditionerOn_decrease;
        if (!airConditionerOn_decrease){
            setTemperature--;
            limitTemperature();
            playBuzzer();
        }
    }
}
void loop() {
    Blynk.run();
    // 读取 DHT11 传感器数据
    humidity = dht.readHumidity();
    temperature = dht.readTemperature();
    // 处理红外接收器事件
    if (irrecv.decode(&results)) {
        if (results.value == 0xFF629D) {
            airConditionerOn =!airConditionerOn;
            setLEDColor(airConditionerOn);
            digitalWrite(RELAY_PIN, airConditionerOn? HIGH : LOW);
            setTemperature = 18;
            playBuzzer();
        } else if (results.value == 0xFFE21D && airConditionerOn) {
            setTemperature++;
            limitTemperature();
            playBuzzer();
        } else if (results.value == 0xFFA25D && airConditionerOn) {
            setTemperature--;
            limitTemperature();
            playBuzzer();
        }
        irrecv.resume();
    }
    // 获取当前时间
    time_t now;
    time(&now);
    struct tm* timeinfo = localtime(&now);
    char timeStr[20];
    strftime(timeStr, sizeof(timeStr), "%Y/%m/%d/%H:%M", timeinfo);  
    // 更新 SSD1306 显示屏
    u8g2.firstPage();
    do {
        u8g2.setCursor(0, 10);
        u8g2.print(timeStr);
        u8g2.print(" ");
        u8g2.print(weekdays[timeinfo->tm_wday]);
        u8g2.setCursor(0, 33);
        u8g2.print("温湿度: ");
        u8g2.print(temperature);
        u8g2.print("°/");
        u8g2.print(humidity);
        u8g2.print("%");
        u8g2.setCursor(0, 48);
        u8g2.print("空调状态: ");
        u8g2.print(airConditionerOn? "ON" : "OFF");
        u8g2.setCursor(0, 63);
        u8g2.print("空调温度: ");
        u8g2.print(setTemperature);
    } while (u8g2.nextPage());
    // 更新 Blynk 虚拟引脚数据
    lcd.clear(); 
    lcd.print(6, 0, "智能空调"); 
    lcd.print(0, 1, timeStr);
    Blynk.virtualWrite(V1, temperature);
    Blynk.virtualWrite(V2, humidity);
    Blynk.virtualWrite(V3, airConditionerOn? "ON" : "OFF");
    Blynk.virtualWrite(V4, setTemperature);
    // 更新 Blynk 虚拟引脚状态
    if (airConditionerOn) {
        button.setValue(true);
    } else {
        button.setValue(false);
    }
    // 延迟200ms
    delay(200);
}环境配置
- platform: 对应于主板使用的SoC的平台
- board: 开发板
- 框架将运行项目代码的软件环境
- 添加开源库和自己的开发库
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
  blynkkk/Blynk @ ^1.3.2
  adafruit/DHT sensor library @ ^1.4.6
  crankyoldgit/IRremoteESP8266 @ ^2.8.6
  olikraus/U8g2 @ ^2.35.19
 
				    