用微信小程序通过瑞萨 RA4E2 控制空调完整系统教程
系统概述
本系统实现了一个基于MQTT协议的空调远程控制系统,由三个主要部分组成:
- 微信小程序作为用户界面
- ESP32作为MQTT客户端和通信桥梁
- 瑞萨RA4E2微控制器作为红外信号发生器
系统工作流程:
- 用户通过微信小程序发送温度设置指令
- 指令通过MQTT协议发送到EMQX消息代理
- ESP32订阅MQTT主题并接收指令
- ESP32通过串口(UART)将指令转发给RA4E2
- RA4E2解析指令并生成相应的红外信号
- 红外信号控制空调调整温度
硬件连接
ESP32 设置
- 使用Serial1(UART1)与RA4E2通信
- RX引脚: GPIO16
- TX引脚: GPIO17
- 波特率: 9600
RA4E2 设置
- 使用P109和P110与ESP32通信
- 红外发射器连接至P815引脚
- LED状态指示连接至引脚207

代码详解
ESP32 代码分析
1. 网络与MQTT配置
const char *ssid = "123";
const char *password = "12341234";
const char *mqtt_broker = "broker.emqx.io";
const char *mqtt_topic = "aircon/temperature";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
const int mqtt_port = 1883;
2. 初始化设置
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, 16, 17);
connectToWiFi();
mqtt_client.setServer(mqtt_broker, mqtt_port);
mqtt_client.setKeepAlive(60);
mqtt_client.setCallback(mqttCallback);
connectToMQTT();
}
3. MQTT消息处理
void mqttCallback(char *mqtt_topic, byte *payload, unsigned int length) {
Serial.print("Message received on mqtt_topic: ");
Serial.println(mqtt_topic);
Serial.print("Message: ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
}
int i = (int)payload[1];
if(i == 54)
{
Serial1.print("22");
delay(10);
Serial.println("\n-----------26 ok----------");
}
if(i == 56)
{
Serial1.print("33");
delay(10);
Serial.println("\n------------28 ok--------");
}
}
RA4E2 部分代码
1. 主要功能定义
#define PWM_CHANNEL_0 0
#define PWM_PERIOD_COUNTS 2630
#define PWM_DEFAULT_DUTY 1315
#define PWM_PIN_P815 BSP_IO_PORT_08_PIN_15
#define PWM_START_CMD "PWM_START"
#define PWM_STOP_CMD "PWM_STOP"
#define PWM_DUTY_CMD "PWM_DUTY="
#define LED_ON_CMD "LED_ON"
#define LED_OFF_CMD "LED_OFF"
#define LED_TOGGLE_CMD "LED_TOGGLE"
#define LED_ON_DIGITAL "22"
#define LED_OFF_DIGITAL "33"
2. 主循环
void hal_entry(void)
{
uart_init();
led_init();
pwm_init();
pwm_start();
uart_send_string("=== RA4E2 UART Communication Test ===\r\n");
while (1)
{
if (g_led_action == 1)
{
send_data_26();
uart_send_string("The air conditioner temperature is set to '26'\r\n");
g_led_action = 0;
}
else if (g_led_action == 2)
{
send_data_28();
uart_send_string("The air conditioner temperature is set to '28'\r\n");
g_led_action = 0;
}
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
}
}
3. 红外信号生成
void send_data_26(void)
{
uint64_t data1 = 0x482802052;
uint64_t data2 = 0x20008;
uint64_t data3 = 0x482802072;
uint64_t data4 = 0xB;
send_start();
for(int i = 35; i > 0; i--)
{
pwm_start();
Delay_us(560);
pwm_stop();
if((data1 >> (i-1)) & 0x01) {
Delay_us(1690);
} else {
Delay_us(560);
}
}
pwm_start();
Delay_us(560);
pwm_stop();
}
void send_start(void)
{
pwm_start();
Delay_us(9600);
pwm_stop();
Delay_us(4500);
}
4. UART回调处理
void uart9_callback(uart_callback_args_t * p_args)
{
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
uint8_t rx_byte = (uint8_t)p_args->data;
if (g_rx_count < sizeof(g_rx_buffer) - 1)
{
g_rx_buffer[g_rx_count] = rx_byte;
g_rx_count++;
if (g_rx_count >= 2)
{
if (g_rx_buffer[g_rx_count - 2] == '2' &&
g_rx_buffer[g_rx_count - 1] == '2')
{
g_led_action = 1;
memset(g_rx_buffer, 0, sizeof(g_rx_buffer));
g_rx_count = 0;
break;
}
else if (g_rx_buffer[g_rx_count - 2] == '3' &&
g_rx_buffer[g_rx_count - 1] == '3')
{
g_led_action = 2;
memset(g_rx_buffer, 0, sizeof(g_rx_buffer));
g_rx_count = 0;
break;
}
}
}
break;
}
}
系统调试与测试
1. 硬件连接检查
- 确认ESP32与RA4E2之间的串口连接正确
- 确认红外发射器连接到RA4E2的P815引脚
- 确认电源供应稳定
2. 软件调试步骤
ESP32端:
- 打开串口监视器,查看WiFi连接状态
- 确认MQTT连接成功
- 使用MQTT客户端工具向
aircon/temperature主题发送消息测试
- 观察ESP32是否正确接收并转发指令
RA4E2端:
- 通过串口监视器查看系统启动信息
- 测试直接发送"22"和"33"命令
- 使用红外接收器验证生成的红外信号是否正确
- 测试空调是否响应红外信号
3. 常见问题解决
- WiFi连接失败 :检查SSID和密码是否正确,网络是否可用
- MQTT连接失败 :检查网络连接,确认MQTT服务器地址和端口正确
- 串口通信失败 :检查波特率设置(9600),确认TX/RX交叉连接
- 红外信号无效 :检查红外发射器连接,确认PWM配置正确
扩展功能
本系统可以进一步扩展以下功能:
- 支持更多温度设置选项
- 添加状态反馈机制,让小程序显示当前空调状态
- 增加定时任务功能,支持预约开关机
- 添加多个设备支持,实现多房间空调控制
- 增加安全认证机制,提高系统安全性