0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于HMI-Board的智能宿舍空調(diào)管理系統(tǒng)設(shè)計(jì)案例

冬至子 ? 來源:qianmo ? 作者:qianmo ? 2023-07-31 14:57 ? 次閱讀

概述

為解決寢室空調(diào)總是忘關(guān)的問題,基于HMI-Board設(shè)計(jì)了一款智能空調(diào)管理器,可通過onenet指令下發(fā)實(shí)現(xiàn)遠(yuǎn)程關(guān)閉空調(diào)。

設(shè)計(jì)思路

HMI-Board使用板載RW-007WiFi模塊,通過MQTT協(xié)議連接Onenet平臺,上報(bào)當(dāng)前狀態(tài)信息,接收并解析Onenet平臺的下發(fā)指令??蛻舳诉M(jìn)入Onenet云平臺,可查閱HMI-Board上報(bào)數(shù)據(jù)流,也可通過MQTT指令下發(fā),遠(yuǎn)程控制空調(diào)和其他設(shè)備。

開發(fā)環(huán)境

  • RT-Thread Studio
  • RA Smart Configurator
  • HMI-Board開發(fā)板
    設(shè)計(jì)過程
    本次設(shè)計(jì)的主要功能可分為兩個(gè)部分。

1.紅外數(shù)據(jù)的編解碼:

為獲取紅外指令的編碼數(shù)據(jù)并解析,臨時(shí)自制了一款示波器,通過該示波器采集了如下波形數(shù)據(jù):

1.jpg

通過該波形數(shù)據(jù),分析遙控器紅外編碼協(xié)議,并通過紅外發(fā)射管將紅外遙控?cái)?shù)據(jù)復(fù)現(xiàn)。

最初使用的正點(diǎn)原子的F407開發(fā)板,搭配RT-Thread Studio的infrared軟件包進(jìn)行紅外遙控?cái)?shù)據(jù)的復(fù)現(xiàn)工作,通過修改NEC相關(guān)代碼,使之適配RTT的HWTIMER和PWM設(shè)備驅(qū)動(dòng)框架。并最終調(diào)試通過。

在移植到HMI-Board開發(fā)板時(shí),發(fā)現(xiàn)Renesas的底層設(shè)備驅(qū)動(dòng)代碼與RTT設(shè)備驅(qū)動(dòng)框架的對接工作任務(wù)量有點(diǎn)兒大。時(shí)間有限,為盡快完成設(shè)計(jì),使用了Renesas的PWM的底層驅(qū)動(dòng)函數(shù)搭配阻塞延時(shí)的方式,最終實(shí)現(xiàn)紅外數(shù)據(jù)的復(fù)現(xiàn)。

2.Onenet下發(fā)指令的接收與解析

Onenet下發(fā)指令的接收,使用了RTT提供的命令接受回調(diào)函數(shù)”onenet_set_cmd_rsp_cb”,在該函數(shù)內(nèi)通過查詢的方式將接收的字符數(shù)據(jù)與本地指令庫進(jìn)行比對,并執(zhí)行相應(yīng)操作。

工程代碼

上電自動(dòng)連接網(wǎng)絡(luò)

#define WLAN_SSID "test_ssid"
#define WLAN_PASSWORD "12345678"
rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD);//連接WiFi熱點(diǎn)
初始化MQTT,并連接Onenet平臺
onenet_mqtt_init();//MQTT初始化
onenet_upload_cycle();//開啟MQTT定時(shí)上傳
onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb);//開啟命令接收回調(diào)
紅外遙控?cái)?shù)據(jù)編碼
//紅外發(fā)送數(shù)據(jù)裝載
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
//紅外遙控?cái)?shù)據(jù)編碼
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;
}
紅外編碼數(shù)據(jù)發(fā)送
//紅外編碼數(shù)據(jù)發(fā)送
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[] = { "?????????" };//接收指令數(shù)據(jù)
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);
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1181

    瀏覽量

    53474
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1289

    瀏覽量

    40129
  • 紅外編解碼
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    4756
  • MQTT協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    97

    瀏覽量

    5374
  • HMI系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    1027
收藏 人收藏

    評論

    相關(guān)推薦

    HMI-Board開發(fā)板工程在添加新組件時(shí)LVGL組件會(huì)報(bào)錯(cuò)的解決辦法

    在使用HMI-Board開發(fā)板開發(fā)lvgl的GUI界面設(shè)計(jì)時(shí),可以直接在官方提供的lvgl的demo中開發(fā),這樣就可以省去lvgl最初的繁瑣配置步驟,這里真的要感謝官方,將最繁瑣的一步幫我們省去了,可以更加專注于LVGL的開發(fā)。
    的頭像 發(fā)表于 09-13 16:17 ?1539次閱讀
    <b class='flag-5'>HMI-Board</b>開發(fā)板工程在添加新組件時(shí)LVGL組件會(huì)報(bào)錯(cuò)的解決辦法

    Renesas HMI Board挑戰(zhàn)賽—FSP工具使用

    RT-Thread和瑞薩推出的HMI-Board上的主控芯片型號為R7FA6M3AH3CFB。
    的頭像 發(fā)表于 11-22 11:32 ?1232次閱讀
    Renesas <b class='flag-5'>HMI</b> <b class='flag-5'>Board</b>挑戰(zhàn)賽—FSP工具使用

    使用DAPLink在對HMI-Board進(jìn)行固件燒錄,棧溢出如何解決?

    使用DAPLink在對HMI-Board進(jìn)行固件燒錄時(shí),最初使用bin固件從0x000000處進(jìn)行燒錄,但是燒錄到一半發(fā)現(xiàn)燒錯(cuò)程序就將DAPLink拔出。但是隨后再使用之前可以成功燒錄的elf/hex等文件就報(bào)了棧溢出的錯(cuò)誤。
    發(fā)表于 09-27 08:29

    宿舍娘_可以調(diào)情的宿舍管理系統(tǒng)

    ``在其他論壇看到的一個(gè)宿舍管理系統(tǒng),做得挺曖昧,很有意思,創(chuàng)意不錯(cuò)。{:soso_e113:}亮點(diǎn)是語音對話,把宿舍YY成一個(gè)萌妹子來對待。``
    發(fā)表于 08-14 12:46

    【MiCOKit申請】智能宿舍學(xué)生管理系統(tǒng)

    申請理由:我是一名大三學(xué)生 現(xiàn)在的學(xué)校里邊硬件資源比較差 但堅(jiān)持學(xué)習(xí)了51stn32 現(xiàn)在正在研究一個(gè)宿舍管理系統(tǒng) 我在這個(gè)項(xiàng)目里邊需要用到 安卓的系統(tǒng) 而且我們的開發(fā)板還有WiFi
    發(fā)表于 08-10 01:09

    基于機(jī)智云的智能宿舍系統(tǒng)設(shè)計(jì)

    摘 要:為了滿足大學(xué)生對智能宿舍的需求,設(shè)計(jì)了基于機(jī)智云的智能宿舍管理系統(tǒng)。該
    發(fā)表于 09-01 20:34

    基于DES加密算法的預(yù)付費(fèi)空調(diào)管理系統(tǒng)設(shè)計(jì)

    針對目前空調(diào)管理性、智能化較差的問題設(shè)計(jì)了一種基于DES加密算法的預(yù)付費(fèi)空調(diào)管理系統(tǒng)。該系統(tǒng)以AT89S52為主控芯片,通過RC522讀寫器
    發(fā)表于 11-23 10:49 ?1次下載
    基于DES加密算法的預(yù)付費(fèi)<b class='flag-5'>空調(diào)管理</b><b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)

    基于PLC的宿舍管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    為解決學(xué)生逃課滯留宿舍,僅靠人力難以監(jiān)督的問題,文章提出一種以學(xué)生課表為中心,基于PLC的宿舍管理系統(tǒng)。每間宿舍配備
    發(fā)表于 05-31 10:04 ?20次下載

    限量預(yù)售|2D加速、JPEG硬解、超高性價(jià)比M4芯片,您的圖形評估利器——HMI-Board來啦!

    能力。依托于瑞薩高性能芯片 RA6M3 及 RT-Thread 軟件生態(tài),HMI Board 不僅硬件性能強(qiáng)勁,同時(shí)軟件生態(tài)豐富,助力開發(fā)者快速開發(fā)出 GUI 智能硬件產(chǎn)品。 HMI-Boar
    的頭像 發(fā)表于 05-16 05:45 ?1336次閱讀
    限量預(yù)售|2D加速、JPEG硬解、超高性價(jià)比M4芯片,您的圖形評估利器——<b class='flag-5'>HMI-Board</b>來啦!

    聯(lián)合發(fā)布 | 2D加速、JPEG硬解、超高性價(jià)比M4芯片,您的圖形評估利器——HMI-Board來啦!

    MCU RA6M3 及RT-Thread軟件生態(tài),HMI Board不僅硬件性能強(qiáng)勁,同時(shí)軟件生態(tài)豐富,助力開發(fā)者快速開發(fā)出GUI智能硬件產(chǎn)品。 HMI-Board搭載2M Flash
    的頭像 發(fā)表于 05-19 15:15 ?1504次閱讀
    聯(lián)合發(fā)布 | 2D加速、JPEG硬解、超高性價(jià)比M4芯片,您的圖形評估利器——<b class='flag-5'>HMI-Board</b>來啦!

    怎么解決HMI-Board在調(diào)試4bitSDHI掛載文件系統(tǒng)失敗的問題呢?

    這兩天在學(xué)習(xí)使用HMI-Board的SDHI功能,在掛載文件系統(tǒng)時(shí)遇到了開發(fā)實(shí)踐指南中提到掛載文件系統(tǒng)失敗的問題,根據(jù)開發(fā)實(shí)踐指南中的方法能夠解決1bit位SDHI掛載文件系統(tǒng)失敗的問
    的頭像 發(fā)表于 08-07 14:53 ?683次閱讀
    怎么解決<b class='flag-5'>HMI-Board</b>在調(diào)試4bitSDHI掛載文件<b class='flag-5'>系統(tǒng)</b>失敗的問題呢?

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

    高性能芯片 RA6M3 及 RT-Thread 和 LVGL 軟件生態(tài),HMI Board 不僅硬件性能強(qiáng)勁,同時(shí)軟件生態(tài)豐富,助力開發(fā)者快速開發(fā)出 GUI 智能硬件產(chǎn)品。 本示例開源鏈接: https
    的頭像 發(fā)表于 09-15 18:25 ?1771次閱讀
    瑞薩RA6M3 <b class='flag-5'>HMI-Board</b> Video Demo 上手指南

    【直播預(yù)告】HMI-Board Windows32

    三晚,我們有幸邀請到了本次大賽的一等獎(jiǎng)得主,他將與我們分享他的作品——HMI-Board智能終端桌面。 直播信息 直播主題 HMI-Board?Windows32 直播時(shí)間 11月15日?2030 直播
    的頭像 發(fā)表于 11-14 18:20 ?488次閱讀
    【直播預(yù)告】<b class='flag-5'>HMI-Board</b> Windows32

    空調(diào)管溫傳感器壞了的表現(xiàn)有哪些

    空調(diào)管溫傳感器是用來監(jiān)測空調(diào)系統(tǒng)的冷凝器和蒸發(fā)器的溫度的重要組件。當(dāng)空調(diào)管溫傳感器出現(xiàn)故障時(shí),會(huì)影響空調(diào)的運(yùn)行效果,并可能導(dǎo)致
    的頭像 發(fā)表于 01-16 14:58 ?5370次閱讀

    空調(diào)管系統(tǒng)可解決的問題有哪些?

    空調(diào)管系統(tǒng)概覽是對全局的數(shù)據(jù)情況進(jìn)行統(tǒng)覽,包括接入設(shè)備統(tǒng)計(jì)、運(yùn)行時(shí)長統(tǒng)計(jì)、用電統(tǒng)計(jì)等、右側(cè)可以靈活配置,嵌入3D場景,以實(shí)際場景標(biāo)注空調(diào)位置,展示具體數(shù)據(jù) 。
    的頭像 發(fā)表于 03-05 10:57 ?832次閱讀
    <b class='flag-5'>空調(diào)管</b>控<b class='flag-5'>系統(tǒng)</b>可解決的問題有哪些?