一、項目背景
在不久前的一個早晨,我被一陣鬧鈴叫醒後,像往常一樣去上班,到公司後發現很多同事都帶了傘,於是乎打開了兜裏的磚塊(手機),晚上回去的時候果然被淋了,雖然雨不是很大,但是被淋總是不爽,於是乎開始思考是否能做一個天氣時鐘,來拯救下我和像我一樣出門不看天氣的朋友,吧啦吧啦......。
二、項目技能點
本項目使用RT_Thread國產操作系統開發,其豐富的軟件包大大縮短了開發週期,本項目主要使用如下軟件包:
1.onenet:設備通過mqtt連接onenet
2.webClient:獲取天氣
3.ntp:同步網絡時間
4.cJSON:解析小程序下發數據
三、項目框架
1.總體交互邏輯圖如下所示:
2.設備框圖如下:
2.1.LCD顯示
LCD顯示DHT11採集的溫溼度和當前時間
2.2.蜂鳴器
定時時間到了蜂鳴器一直髮出聲音,直到用戶按下K0按鍵,停止發聲。
四、項目核心技術點
1.mqtt連接onenet
理論上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接口控制和獲取設備狀態:
五、項目效果演示
嗶哩嗶哩:https://www.bilibili.com/video/av78712582?zw
六、程序源碼
小程序: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