天氣時鐘

一、項目背景
在不久前的一個早晨,我被一陣鬧鈴叫醒後,像往常一樣去上班,到公司後發現很多同事都帶了傘,於是乎打開了兜裏的磚塊(手機),晚上回去的時候果然被淋了,雖然雨不是很大,但是被淋總是不爽,於是乎開始思考是否能做一個天氣時鐘,來拯救下我和像我一樣出門不看天氣的朋友,吧啦吧啦......。

二、項目技能點
本項目使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章