0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于HMI-Board的智能宿舍空调管理系统设计案例

冬至子 来源:qianmo 作者:qianmo 2023-07-31 14:57 次阅读

概述

为解决寝室空调总是忘关的问题,基于HMI-Board设计了一款智能空调管理器,可通过onenet指令下发实现远程关闭空调。

设计思路

HMI-Board使用板载RW-007WiFi模块,通过MQTT协议连接Onenet平台,上报当前状态信息,接收并解析Onenet平台的下发指令。客户端进入Onenet云平台,可查阅HMI-Board上报数据流,也可通过MQTT指令下发,远程控制空调和其他设备。

开发环境

  • RT-Thread Studio
  • RA Smart Configurator
  • HMI-Board开发板
    设计过程
    本次设计的主要功能可分为两个部分。

1.红外数据的编解码:

为获取红外指令的编码数据并解析,临时自制了一款示波器,通过该示波器采集了如下波形数据:

1.jpg

通过该波形数据,分析遥控器红外编码协议,并通过红外发射管将红外遥控数据复现。

最初使用的正点原子的F407开发板,搭配RT-Thread Studio的infrared软件包进行红外遥控数据的复现工作,通过修改NEC相关代码,使之适配RTT的HWTIMER和PWM设备驱动框架。并最终调试通过。

在移植到HMI-Board开发板时,发现Renesas的底层设备驱动代码与RTT设备驱动框架的对接工作任务量有点儿大。时间有限,为尽快完成设计,使用了Renesas的PWM的底层驱动函数搭配阻塞延时的方式,最终实现红外数据的复现。

2.Onenet下发指令的接收与解析

Onenet下发指令的接收,使用了RTT提供的命令接受回调函数”onenet_set_cmd_rsp_cb”,在该函数内通过查询的方式将接收的字符数据与本地指令库进行比对,并执行相应操作。

工程代码

上电自动连接网络

#define WLAN_SSID "test_ssid"
#define WLAN_PASSWORD "12345678"
rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD);//连接WiFi热点
初始化MQTT,并连接Onenet平台
onenet_mqtt_init();//MQTT初始化
onenet_upload_cycle();//开启MQTT定时上传
onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb);//开启命令接收回调
红外遥控数据编码
//红外发送数据装载
static rt_size_t infrared_send(struct ir_raw_data* data, rt_size_t size)
{
rt_size_t send_size;
for (send_size = 0; send_size < size; send_size++)
{
infrared_send_buf[send_size] = (data[send_size].level<<28) + (data[send_size].us);
}
infrared_send_buf[size] = 0x5A5A5A5A;
return send_size;
}
#define CARRIER_WAVE 0xA
#define IDLE_SIGNAL 0xB
#define NO_SIGNAL 0x0
//红外遥控数据编码
static rt_err_t ir_decoder_write(void)
{
rt_uint32_t data_buff_1,data_buff_2;
data_buff_1 = (0x8050040A);
/* guidance code /
write_raw_data[0].level = CARRIER_WAVE;
write_raw_data[0].us = 9000;
write_raw_data[1].level = IDLE_SIGNAL;
write_raw_data[1].us = 4500;
for (rt_uint8_t index = 0; index < 64; index += 2)
{
if (((data_buff_1 << (index / 2)) & 0x80000000)) /
Logic 1 /
{
write_raw_data[2 + index].level = CARRIER_WAVE;
write_raw_data[2 + index].us = 646;
write_raw_data[2 + index + 1].level = IDLE_SIGNAL;
write_raw_data[2 + index + 1].us = 1643;
}
else /
Logic 0 /
{
write_raw_data[2 + index].level = CARRIER_WAVE;
write_raw_data[2 + index].us = 646;
write_raw_data[2 + index + 1].level = IDLE_SIGNAL;
write_raw_data[2 + index + 1].us = 516;
}
}
write_raw_data[66+0].level = CARRIER_WAVE;
write_raw_data[66+0].us = 646;
write_raw_data[66+1].level = IDLE_SIGNAL;
write_raw_data[66+1].us = 516;
write_raw_data[66+2].level = CARRIER_WAVE;
write_raw_data[66+2].us = 646;
write_raw_data[66+3].level = IDLE_SIGNAL;
write_raw_data[66+3].us = 1643;
write_raw_data[66+4].level = CARRIER_WAVE;
write_raw_data[66+4].us = 646;
write_raw_data[66+5].level = IDLE_SIGNAL;
write_raw_data[66+5].us = 516;
/
connect code /
write_raw_data[72].level = CARRIER_WAVE;
write_raw_data[72].us = 646;
write_raw_data[73].level = IDLE_SIGNAL;
write_raw_data[73].us = 20000;
data_buff_2 = (0x0004000E);
for (rt_uint8_t index = 0; index < 64; index += 2)
{
if (((data_buff_2 << (index / 2)) & 0x80000000)) /
Logic 1 /
{
write_raw_data[74 + index].level = CARRIER_WAVE;
write_raw_data[74 + index].us = 560;
write_raw_data[74 + index + 1].level = IDLE_SIGNAL;
write_raw_data[74 + index + 1].us = 1690;
}
else /
Logic 0 /
{
write_raw_data[74 + index].level = CARRIER_WAVE;
write_raw_data[74 + index].us = 560;
write_raw_data[74 + index + 1].level = IDLE_SIGNAL;
write_raw_data[74 + index + 1].us = 560;
}
}
/
epilog code /
write_raw_data[138].level = CARRIER_WAVE;
write_raw_data[138].us = 646;
write_raw_data[139].level = IDLE_SIGNAL;
write_raw_data[139].us = 43580;
infrared_send(write_raw_data, 140);
LOG_D("data_buff_1:0x8050040A data_buff_2:0x0004000En");
// rt_kprintf("data_buff_1:0x8050040A data_buff_2:0x0004000En");
// rt_thread_mdelay(200);
return RT_EOK;
}
红外编码数据发送
//红外编码数据发送
rt_err_t ir_send_data(void)
{
LOG_D("ir_send_startn");
for (rt_size_t i = 0;i<210;i++)
{
if ((infrared_send_buf[i] != 0x5A5A5A5A))/
Determine if it is a stop bit /
{
R_GPT_Stop(&g_timer2_ctrl);
if ((infrared_send_buf[i] & 0xF0000000) == 0xA0000000) /
Determine if it is a carrier signal /
{
R_GPT_Start(&g_timer2_ctrl);
}
rt_hw_us_delay(infrared_send_buf[i] & 0x0FFFFFFF);
}
else
{
R_GPT_Stop(&g_timer2_ctrl);
rt_kprintf("nir_send_ok!n");
return RT_EOK;
}
}
rt_kprintf("nir_send_error!n");
return RT_ERROR;
}
Onenet指令接收与解析
/
onenet mqtt command response callback function */
//static void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
//#define LED_PIN BSP_IO_PORT_02_PIN_09
void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
{
char res_buf[] = { "cmd is received!n" };
char my_res_buf[] = { "���������" };//接收指令数据
LOG_D("recv data is %.*sn", recv_size, recv_data);
// LOG_D("%sn",recv_data);
// LOG_D("recv_size:%d,strlen:%dn",recv_size,strlen(recv_data));
strncpy(my_res_buf,recv_data,recv_size);
LOG_D("my_res_buf:%sn",my_res_buf);
const char *led0_on = "led0_on";
const char *led0_off = "led0_off";
const char *led1_on = "led1_on";
const char *led1_off = "led1_off";
const char *air_on = "air_on";
const char air_off = "air_off";
if(!strcmp(my_res_buf,led0_on)){rt_pin_write(0x0209, PIN_LOW);}
if(!strcmp(my_res_buf,led0_off)){rt_pin_write(0x0209, PIN_HIGH);}
if(!strcmp(my_res_buf,led1_on)){rt_pin_write(0x020A, PIN_LOW);}
if(!strcmp(my_res_buf,led1_off)){rt_pin_write(0x020A, PIN_HIGH);}
if(!strcmp(my_res_buf,air_on)){rt_pin_write(0x020A, PIN_LOW);}
if(!strcmp(my_res_buf,air_off)){ir_send_data();rt_pin_write(0x020A, PIN_LOW);}
/
user have to malloc memory for response data */
*resp_data = (uint8_t *) ONENET_MALLOC(strlen(res_buf));
strncpy((char *)*resp_data, res_buf, strlen(res_buf));
*resp_size = strlen(res_buf);
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接收机
    +关注

    关注

    8

    文章

    1122

    浏览量

    52654
  • RT-Thread
    +关注

    关注

    31

    文章

    1150

    浏览量

    38909
  • 红外编解码
    +关注

    关注

    0

    文章

    3

    浏览量

    4739
  • MQTT协议
    +关注

    关注

    0

    文章

    90

    浏览量

    5224
  • HMI系统
    +关注

    关注

    0

    文章

    20

    浏览量

    987
收藏 人收藏

    评论

    相关推荐

    HMI-Board开发板工程在添加新组件时LVGL组件会报错的解决办法

    在使用HMI-Board开发板开发lvgl的GUI界面设计时,可以直接在官方提供的lvgl的demo中开发,这样就可以省去lvgl最初的繁琐配置步骤,这里真的要感谢官方,将最繁琐的一步帮我们省去了,可以更加专注于LVGL的开发。
    的头像 发表于 09-13 16:17 990次阅读
    <b class='flag-5'>HMI-Board</b>开发板工程在添加新组件时LVGL组件会报错的解决办法

    Renesas HMI Board挑战赛—FSP工具使用

    RT-Thread和瑞萨推出的HMI-Board上的主控芯片型号为R7FA6M3AH3CFB。
    的头像 发表于 11-22 11:32 709次阅读
    Renesas <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b>挑战赛—FSP工具使用

    宿舍娘_可以调情的宿舍管理系统

    ``在其他论坛看到的一个宿舍管理系统,做得挺暧昧,很有意思,创意不错。{:soso_e113:}亮点是语音对话,把宿舍YY成一个萌妹子来对待。``
    发表于 08-14 12:46

    【MiCOKit申请】智能宿舍学生管理系统

    申请理由:我是一名大三学生 现在的学校里边硬件资源比较差 但坚持学习了51stn32 现在正在研究一个宿舍管理系统 我在这个项目里边需要用到 安卓的系统 而且我们的开发板还有WiFi
    发表于 08-10 01:09

    基于机智云的智能宿舍系统设计

    摘 要:为了满足大学生对智能宿舍的需求,设计了基于机智云的智能宿舍管理系统。该
    发表于 09-01 20:34

    一种新型中央空调管道机器人的设计

    论文根据集中空调管道清扫的特点,设计了一种新型的空调管道机器人,并以自行研发的集中空调管道机器人样机为例,介绍了其传动机构、运动机构的设计,系统功能的实现以
    发表于 01-25 15:37 33次下载

    基于DES加密算法的预付费空调管理系统设计

    针对目前空调管理性、智能化较差的问题设计了一种基于DES加密算法的预付费空调管理系统。该系统以AT89S52为主控芯片,通过RC522读写器
    发表于 11-23 10:49 1次下载
    基于DES加密算法的预付费<b class='flag-5'>空调管理</b><b class='flag-5'>系统</b>设计

    基于PLC的宿舍管理系统设计与实现

    为解决学生逃课滞留宿舍,仅靠人力难以监督的问题,文章提出一种以学生课表为中心,基于PLC的宿舍管理系统。每间宿舍配备
    发表于 05-31 10:04 20次下载

    限量预售|2D加速、JPEG硬解、超高性价比M4芯片,您的图形评估利器——HMI-Board来啦!

    能力。依托于瑞萨高性能芯片 RA6M3 及 RT-Thread 软件生态,HMI Board 不仅硬件性能强劲,同时软件生态丰富,助力开发者快速开发出 GUI 智能硬件产品。 HMI-Boar
    的头像 发表于 05-16 05:45 899次阅读
    限量预售|2D加速、JPEG硬解、超高性价比M4芯片,您的图形评估利器——<b class='flag-5'>HMI-Board</b>来啦!

    联合发布 | 2D加速、JPEG硬解、超高性价比M4芯片,您的图形评估利器——HMI-Board来啦!

    MCU RA6M3 及RT-Thread软件生态,HMI Board不仅硬件性能强劲,同时软件生态丰富,助力开发者快速开发出GUI智能硬件产品。 HMI-Board搭载2M Flash
    的头像 发表于 05-19 15:15 967次阅读
    联合发布 | 2D加速、JPEG硬解、超高性价比M4芯片,您的图形评估利器——<b class='flag-5'>HMI-Board</b>来啦!

    怎么解决HMI-Board在调试4bitSDHI挂载文件系统失败的问题呢?

    这两天在学习使用HMI-Board的SDHI功能,在挂载文件系统时遇到了开发实践指南中提到挂载文件系统失败的问题,根据开发实践指南中的方法能够解决1bit位SDHI挂载文件系统失败的问
    的头像 发表于 08-07 14:53 462次阅读
    怎么解决<b class='flag-5'>HMI-Board</b>在调试4bitSDHI挂载文件<b class='flag-5'>系统</b>失败的问题呢?

    瑞萨RA6M3 HMI-Board Video Demo 上手指南

    于瑞萨高性能芯片 RA6M3 及 RT-Thread 和 LVGL 软件生态,HMI Board 不仅硬件性能强劲,同时软件生态丰富,助力开发者快速开发出 GUI 智能硬件产品。 本示例开源链接: https
    的头像 发表于 09-15 18:25 804次阅读
    瑞萨RA6M3 <b class='flag-5'>HMI-Board</b> Video Demo 上手指南

    【直播预告】HMI-Board Windows32

    三晚,我们有幸邀请到了本次大赛的一等奖得主,他将与我们分享他的作品——HMI-Board智能终端桌面。 直播信息 直播主题 HMI-Board Windows32 直播时间 11月15日 2030 直播
    的头像 发表于 11-14 18:20 237次阅读
    【直播预告】<b class='flag-5'>HMI-Board</b> Windows32

    空调管温传感器坏了的表现有哪些

    空调管温传感器是用来监测空调系统的冷凝器和蒸发器的温度的重要组件。当空调管温传感器出现故障时,会影响空调的运行效果,并可能导致
    的头像 发表于 01-16 14:58 744次阅读

    空调管系统可解决的问题有哪些?

    空调管系统概览是对全局的数据情况进行统览,包括接入设备统计、运行时长统计、用电统计等、右侧可以灵活配置,嵌入3D场景,以实际场景标注空调位置,展示具体数据 。
    的头像 发表于 03-05 10:57 210次阅读
    <b class='flag-5'>空调管</b>控<b class='flag-5'>系统</b>可解决的问题有哪些?