1、項目背景
在不久前的一個早晨,我被一陣鬧鈴叫醒後,像往常同樣去上班,到公司後發現不少同事都帶了傘,因而乎打開了兜裏的磚塊(手機),晚上回去的時候果真被淋了,雖然雨不是很大,可是被淋老是不爽,因而乎開始思考是否能作一個天氣時鐘,來拯救下我和像我同樣出門不看天氣的朋友,吧啦吧啦......。git
2、項目技能點
本項目使用RT_Thread國產操做系統開發,其豐富的軟件包大大縮短了開發週期,本項目主要使用以下軟件包:
1.onenet:設備經過mqtt鏈接onenet
2.webClient:獲取天氣
3.ntp:同步網絡時間
4.cJSON:解析小程序下發數據github
3、項目框架
1.整體交互邏輯圖以下所示:web
2.設備框圖以下:小程序
2.1.LCD顯示網絡
LCD顯示DHT11採集的溫溼度和當前時間併發
2.2.蜂鳴器app
定時時間到了蜂鳴器一直髮出聲音,直到用戶按下K0按鍵,中止發聲。框架
4、項目核心技術點
1.mqtt鏈接onenetide
理論上mqtt鏈接onenet應該是本項目比較有挑戰性的地方,好在rt_thread官方提供了軟件包,使用env工具配置後直接使用便可。工具
2.定時邏輯處理
本項目建立了一個時間處理線程,線程起來後首先等待連網成功,而後調用ntp接口同步網絡時間,接下來進入while(1)循環,每500ms獲取當前時間,和本地存儲的定時器進行對比,若是當前時間等於保存的時間,開始執行鬧鐘動做,蜂鳴器發聲。
3.天氣獲取邏輯處理
建立一個天氣處理線程,線程起來後首先等待連網成功,而後獲取一次天氣狀況,併發給onenet,小程序獲取並顯示。而後每隔一小時獲取一次天氣狀況和同步ntp網絡時間
void weather_task_thread(void* arg) { int a =0; uint8_t *p = &a; USER_TIME_S current_time = { 0x00 }; // user_dev_time_flash_read(); while (4 != user_get_connect_status()->connect_status) { rt_thread_delay(1); } rt_thread_delay(3); rt_kprintf("################################### start to get weather"); weather(); while ( 1 ) { user_get_time(¤t_time); if ((0 == current_time.hour) && (0 == current_time.minute) && (0 == current_time.second) ) { rt_kprintf("########################## sync weather and ntp time #####################\r\n"); weather(); user_sntp_time_synced(); } rt_thread_mdelay(1000); } }
4.小程序訪問onenet
小程序使用http訪問onenet,每隔3秒獲取onenet數據,更新設備狀態,直接操做onenet以下API接口控制和獲取設備狀態:
5、項目效果演示
嗶哩嗶哩:https://www.bilibili.com/video/av78712582?zw
6、程序源碼
小程序:https://github.com/solitary-sand/wechat_miniprogram_demos/tree/master/wechat_smart_clock
設備端:https://github.com/solitary-sand/rt_thread_w601_app_rgb_smart_clock