智能空调

作品思路

主板: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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注