基于RT-Thread的智慧路燈案例實(shí)驗(yàn)分享
點(diǎn)擊上方「嵌入式大雜燴」,選擇「置頂公眾號(hào)」第一時(shí)間查看嵌入式筆記!
進(jìn)入文章正題之前先說(shuō)一個(gè)事:昨天分享的那本Linux書(shū)籍是去嵌入式Linux公眾號(hào)回復(fù)呀,不是在本公眾號(hào)回復(fù)哈。
前言
之前分享了基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗(yàn)分享《基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗(yàn)分享》,閱讀量挺不錯(cuò),看樣子大家都挺喜歡這種實(shí)驗(yàn)。那咱們就再來(lái)一個(gè)類(lèi)似的實(shí)驗(yàn):基于RT-Thread的智慧路燈案例實(shí)驗(yàn)。
實(shí)驗(yàn)框圖
實(shí)驗(yàn)說(shuō)明:設(shè)備終端不斷采集光強(qiáng)數(shù)據(jù)并上傳至云端進(jìn)行監(jiān)控,同時(shí)也會(huì)把當(dāng)前LED(路燈)的狀態(tài)上傳。LED的狀態(tài)會(huì)根據(jù)光照值進(jìn)行打開(kāi)、關(guān)閉。
比如當(dāng)光照值低于(夜晚)我們?cè)O(shè)置的光照閾值時(shí)就會(huì)打開(kāi)LED,當(dāng)光照高于(白天)光照閾值時(shí)就會(huì)熄滅LED燈。除此之外,云端可以遠(yuǎn)程控制LED的亮滅,達(dá)到一個(gè)遠(yuǎn)程控制的作用。
創(chuàng)建RTT工程
-
硬件:小熊派開(kāi)發(fā)板。
-
軟件:基于RT-Thread操作系統(tǒng)的應(yīng)用開(kāi)發(fā)。
-
開(kāi)發(fā)工具:RT-Thread Studio V1.1.0。
本實(shí)驗(yàn)我們需要用到RT-Thread的BH1750軟件包、OneNet軟件包及at_device軟件包等。這些軟件包的使用已經(jīng)在前兩篇筆記中有寫(xiě)到:
本次實(shí)驗(yàn)也只是把它們?nèi)诤显谝黄饋?lái)使用。
1、添加相關(guān)軟件包、配置:
添加完之后的
RT-Thread Settings文件如:
添加軟件包及軟件包的一些詳細(xì)配置可查閱上兩篇筆記。這里也大概提一下要點(diǎn):
(1)設(shè)置WiFi信息:
(1)設(shè)置WiFi信息:
(2)設(shè)置OneNET信息
(2)設(shè)置OneNET信息
(3)配置I2C對(duì)接BH1750
(3)配置I2C對(duì)接BH1750
這里我用的是
RT-Thread Studio V1.1.0,這里的I2C的范例配置有點(diǎn)問(wèn)題,其它版本的
RT-Thread Studio應(yīng)該可以按范例配置那么配,如果按范例配置編譯不通過(guò)的話(huà)可以按照I2C2那樣配置。
2、應(yīng)用代碼
2、應(yīng)用代碼
(1)測(cè)試函數(shù)
(1)測(cè)試函數(shù)
左右滑動(dòng)查看全部代碼>>>
int onenet_upload_example(void) { rt_thread_t tid; /* onenet初始化 */ onenet_mqtt_init(); /* 綁定led命令響應(yīng)回調(diào)函數(shù) */ onenet_set_cmd_rsp_cb(onenet_ledcmd_rsp_cb); /* 創(chuàng)建onenet數(shù)據(jù)上傳任務(wù) */ tid = rt_thread_create("onenet_upload",
onenet_upload_entry,
RT_NULL, 2048, 10, 5); if (tid)
rt_thread_startup(tid); return 0;
}
MSH_CMD_EXPORT(onenet_upload_example, send data to OneNET cloud cycle);
首先進(jìn)行一個(gè)onenet初始化,這個(gè)初始化接口時(shí)onenet軟件包提供的。
接著進(jìn)行一個(gè)led命令響應(yīng)回調(diào)函數(shù)的綁定,回調(diào)函數(shù)onenet_ledcmd_rsp_cb里進(jìn)行的就是接收到onenet下發(fā)的led命令之后進(jìn)行地一些操作。最后就是創(chuàng)建一個(gè)onenet數(shù)據(jù)上傳的線(xiàn)程。
最后把這個(gè)函數(shù)以命令的形式導(dǎo)出,以便我們可以在命令行輸入onenet_upload_example命令進(jìn)行測(cè)試。
(2)led命令響應(yīng)回調(diào)函數(shù)
左右滑動(dòng)查看全部代碼>>>
static void onenet_ledcmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size) { char res_buf[20] = {0}; char recv_buf[5] = {0};
LOG_D("recv data is %.*s\n", recv_size, recv_data); if (!strncmp((char*)recv_data, "ledon", 5))
{
rt_pin_write(SC1_LED_PIN, SC1_LED_ON);
rt_snprintf(res_buf, sizeof(res_buf), "led is on");
rt_kprintf("led is on\n");
} else if(!strcmp((char*)recv_data, "ledoff", 5))
{
rt_pin_write(SC1_LED_PIN, SC1_LED_OFF);
rt_snprintf(res_buf, sizeof(res_buf), "led is off");
rt_kprintf("led is off\n");
} else {
rt_kprintf("ledcmd ERROR!\n");
} /* user have to malloc memory for response data */ *resp_data = (uint8_t *) rt_malloc(strlen(res_buf)); strncpy((char *)*resp_data, res_buf, strlen(res_buf));
*resp_size = strlen(res_buf);
}
我們收到onenet下發(fā)的命令之后,所需要做的操作放在這里面。比如當(dāng)我們的設(shè)備接收到ledon字符串時(shí),打開(kāi)led,并打印提示信息。最后再把led is on信息應(yīng)答給onenet。
(3)上傳數(shù)據(jù)的任務(wù)
左右滑動(dòng)查看全部代碼>>>
/* 上傳數(shù)據(jù)至onenet */ static void onenet_upload_entry(void *parameter) { rt_device_t dev = RT_NULL; struct rt_sensor_data data; rt_size_t res; char led_status = SC1_LED_OFF; char send_buf[32] = {0}; /* 設(shè)置高亮LED的引腳為輸出模式 */ rt_pin_mode(SC1_LED_PIN, PIN_MODE_OUTPUT); /* 查找bh1750傳感器 */ dev = rt_device_find("li_bh1750"); if (dev == RT_NULL)
{
rt_kprintf("Can't find device:li_bh1750\n"); return;
} /* 以只讀模式打開(kāi)bh1750 */ if (rt_device_open(dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK)
{
rt_kprintf("open device failed!"); return;
} while (1)
{ /* 從傳感器讀取一個(gè)數(shù)據(jù) */ res = rt_device_read(dev, 0, &data, 1); if (1 != res)
{
rt_kprintf("read data failed!size is %d", res);
} else {
rt_kprintf("light:%4d.%d lux\n", data.data.light / 10, data.data.light % 10);
rt_sprintf(send_buf,"%4d.%d", data.data.light / 10, data.data.light % 10);
} /* 高亮LED燈根據(jù)光照值自動(dòng)打開(kāi)、熄滅 */ if (data.data.light / 10 <= 40)
{
rt_pin_write(SC1_LED_PIN, SC1_LED_ON);
led_status = SC1_LED_ON;
rt_kprintf("led_status = ON\n");
} else {
rt_pin_write(SC1_LED_PIN, SC1_LED_OFF);
led_status = SC1_LED_OFF;
rt_kprintf("led_status = OFF\n");
} /* 上傳光照數(shù)據(jù)至onenet */ if (onenet_mqtt_upload_string("light", (const char*)send_buf) < 0)
{
LOG_E("upload has an error, stop uploading"); break;
} /* 上傳高亮led燈的狀態(tài)至onenet */ if (onenet_mqtt_upload_string("led_status", (const char*)ledsta_str[led_status]) < 0)
{
LOG_E("upload has an error, stop uploading"); break;
}
rt_thread_delay(rt_tick_from_millisecond(3 * 1000));
}
rt_device_close(dev);
}
這是我們的上傳任務(wù):讀取BH1750傳感器采集的光照值,通過(guò)onenet軟件包給我們提供的onenet_mqtt_upload_string接口上傳至onenet。
同時(shí),led的狀態(tài)根據(jù)光照值的結(jié)果自動(dòng)打開(kāi)/關(guān)閉,led的狀態(tài)也是通過(guò)onenet_mqtt_upload_string接口傳至onenet。
3、OneNET云端web應(yīng)用
(1)創(chuàng)建一個(gè)web應(yīng)用
為了能更好地、更直觀的展示我們的數(shù)據(jù),我們創(chuàng)建一個(gè)web應(yīng)用來(lái)管理:
onenet構(gòu)建web應(yīng)用的方式與之前我們分享的《基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗(yàn)分享》中華為云構(gòu)建web應(yīng)用的方式類(lèi)似,都是通過(guò)拖控件的方式。我們創(chuàng)建好的應(yīng)用如下:
實(shí)驗(yàn)結(jié)果
因?yàn)镺nenet數(shù)據(jù)最快是3秒刷新一次,所以存在一點(diǎn)延遲。
源碼下載
本實(shí)驗(yàn)的RT-Thread Studio工程將上傳至本公眾號(hào)粉絲qq群,如有興趣,可自行獲取。qq群號(hào): 696658660 。 同時(shí),本篇筆記將會(huì)同步至我的個(gè)人博客: www.lizhengnian.cn ,歡迎來(lái)訪(fǎng)。 據(jù)說(shuō)現(xiàn)在微信公號(hào)文章推送規(guī)則有點(diǎn)變化,如果覺(jué)得本公眾號(hào)文章有用,不妨星標(biāo)置頂本公眾號(hào)。
猜你喜歡
嵌入式百寶箱:第2期
最后
若覺(jué)得文章不錯(cuò),轉(zhuǎn)發(fā)分享、在看,也是我們繼續(xù)更新的動(dòng)力。
在公眾號(hào)內(nèi)回復(fù)更多資源,可免費(fèi)獲取嵌入式資料。期待你的關(guān)注~
加好友,回暗號(hào)【嵌入式大雜燴】,進(jìn)微信群
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!