天气时钟

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

相关文章
相关标签/搜索