作品思路
主板: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仿真图:
顶视图
底视图
注:底视图的文字没有翻转过来,是镜像的,下次要多注意
程序代码:
// 定义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