天氣時鐘

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

相關文章
相關標籤/搜索