基于RT-Thread的智慧路燈案例實(shí)驗分享
點(diǎn)擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!
進(jìn)入文章正題之前先說一個事:昨天分享的那本Linux書籍是去嵌入式Linux公眾號回復(fù)呀,不是在本公眾號回復(fù)哈。
前言
之前分享了基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗分享《基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗分享》,閱讀量挺不錯,看樣子大家都挺喜歡這種實(shí)驗。那咱們就再來一個類似的實(shí)驗:基于RT-Thread的智慧路燈案例實(shí)驗。
實(shí)驗框圖
實(shí)驗說明:設(shè)備終端不斷采集光強(qiáng)數(shù)據(jù)并上傳至云端進(jìn)行監(jiān)控,同時也會把當(dāng)前LED(路燈)的狀態(tài)上傳。LED的狀態(tài)會根據(jù)光照值進(jìn)行打開、關(guān)閉。
比如當(dāng)光照值低于(夜晚)我們設(shè)置的光照閾值時就會打開LED,當(dāng)光照高于(白天)光照閾值時就會熄滅LED燈。除此之外,云端可以遠(yuǎn)程控制LED的亮滅,達(dá)到一個遠(yuǎn)程控制的作用。
創(chuàng)建RTT工程
-
硬件:小熊派開發(fā)板。
-
軟件:基于RT-Thread操作系統(tǒng)的應(yīng)用開發(fā)。
-
開發(fā)工具:RT-Thread Studio V1.1.0。
本實(shí)驗我們需要用到RT-Thread的BH1750軟件包、OneNet軟件包及at_device軟件包等。這些軟件包的使用已經(jīng)在前兩篇筆記中有寫到:
本次實(shí)驗也只是把它們?nèi)诤显谝黄饋硎褂谩?/span>
1、添加相關(guān)軟件包、配置:
添加完之后的
RT-Thread Settings文件如:
添加軟件包及軟件包的一些詳細(xì)配置可查閱上兩篇筆記。這里也大概提一下要點(diǎn):
(1)設(shè)置WiFi信息:
(1)設(shè)置WiFi信息:
(2)設(shè)置OneNET信息
(2)設(shè)置OneNET信息
(3)配置I2C對接BH1750
(3)配置I2C對接BH1750
這里我用的是
RT-Thread Studio V1.1.0,這里的I2C的范例配置有點(diǎn)問題,其它版本的
RT-Thread Studio應(yīng)該可以按范例配置那么配,如果按范例配置編譯不通過的話可以按照I2C2那樣配置。
2、應(yīng)用代碼
2、應(yīng)用代碼
(1)測試函數(shù)
(1)測試函數(shù)
左右滑動查看全部代碼>>>
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)行一個onenet初始化,這個初始化接口時onenet軟件包提供的。
接著進(jìn)行一個led命令響應(yīng)回調(diào)函數(shù)的綁定,回調(diào)函數(shù)onenet_ledcmd_rsp_cb里進(jìn)行的就是接收到onenet下發(fā)的led命令之后進(jìn)行地一些操作。最后就是創(chuàng)建一個onenet數(shù)據(jù)上傳的線程。
最后把這個函數(shù)以命令的形式導(dǎo)出,以便我們可以在命令行輸入onenet_upload_example命令進(jìn)行測試。
(2)led命令響應(yīng)回調(diào)函數(shù)
左右滑動查看全部代碼>>>
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字符串時,打開led,并打印提示信息。最后再把led is on信息應(yīng)答給onenet。
(3)上傳數(shù)據(jù)的任務(wù)
左右滑動查看全部代碼>>>
/* 上傳數(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;
} /* 以只讀模式打開bh1750 */ if (rt_device_open(dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK)
{
rt_kprintf("open device failed!"); return;
} while (1)
{ /* 從傳感器讀取一個數(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ù)光照值自動打開、熄滅 */ 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傳感器采集的光照值,通過onenet軟件包給我們提供的onenet_mqtt_upload_string接口上傳至onenet。
同時,led的狀態(tài)根據(jù)光照值的結(jié)果自動打開/關(guān)閉,led的狀態(tài)也是通過onenet_mqtt_upload_string接口傳至onenet。
3、OneNET云端web應(yīng)用
(1)創(chuàng)建一個web應(yīng)用
為了能更好地、更直觀的展示我們的數(shù)據(jù),我們創(chuàng)建一個web應(yīng)用來管理:
onenet構(gòu)建web應(yīng)用的方式與之前我們分享的《基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗分享》中華為云構(gòu)建web應(yīng)用的方式類似,都是通過拖控件的方式。我們創(chuàng)建好的應(yīng)用如下:
實(shí)驗結(jié)果
因為Onenet數(shù)據(jù)最快是3秒刷新一次,所以存在一點(diǎn)延遲。
源碼下載
本實(shí)驗的RT-Thread Studio工程將上傳至本公眾號粉絲qq群,如有興趣,可自行獲取。qq群號: 696658660 。 同時,本篇筆記將會同步至我的個人博客: www.lizhengnian.cn ,歡迎來訪。 據(jù)說現(xiàn)在微信公號文章推送規(guī)則有點(diǎn)變化,如果覺得本公眾號文章有用,不妨星標(biāo)置頂本公眾號。
猜你喜歡
嵌入式百寶箱:第2期
最后
若覺得文章不錯,轉(zhuǎn)發(fā)分享、在看,也是我們繼續(xù)更新的動力。
在公眾號內(nèi)回復(fù)更多資源,可免費(fèi)獲取嵌入式資料。期待你的關(guān)注~
加好友,回暗號【嵌入式大雜燴】,進(jìn)微信群
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!