禅师 发表于 2019-12-7 16:03

【RT-Thread软件包应用作品】小闹钟

本帖最后由 禅师 于 2019-12-8 10:18 编辑

<div class="parsedown-markdown">
<p>基于RT-THREAD系统的&ldquo;小闹钟&rdquo;</p>

<p><span style="font-size:20px;"><strong>一、项目初衷</strong></span></p>

<p>冬天的早上比较冷,早上6点半起不来,于是就想用这个做一个小闹钟,之所以叫小闹钟,是因为当前功能还不是很完善,比如手动设置时间的功能还未添加进去,手动配网的也还没加进去。<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--110.gif" width="50" /></p>

<p><span style="font-size:20px;"><strong>二、项目功能概述</strong></span></p>

<p>目前的功能实现如下:</p>

<p>1、LCD显示aht10采集的温湿度,ap3216c采集的光照强度和距离传感器的AD值;</p>

<p>2、开发板连接WiFi后,使用netutils的NTP功能,同步时间,显示当前日期和时间到LCD上;</p>

<p>3、开发板接收红外遥控器的按下时的编码,然后存储起来。用来控制一个红外遥控的小灯;</p>

<p></p>

<p>4、开发板上电,同步时间后,在闹钟的设定时刻,蜂鸣器会响起,然后发送存储的红外编码,打开灯(因为灯的开关编码一样,这里默认灯是关闭的),同时向微信(利用<a href="http://sc.ftqq.com/3.version">http://sc.ftqq.com/3.version</a>&nbsp;提供的接口)发送一条温湿度的信息,早上起来后,看下当前环境实时的温湿度<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--100.gif" width="50" />。</p>

<p></p>

<p>5、ap3216c的接近传感器的AD值大于400(离得越近值越大)时,发送红外编码,控制灯的开或者关。</p>

<p></p>

<p>&nbsp;</p>

<p>综上,使用的场景就是早上6点半,闹钟(蜂鸣器)响起,打开红外灯(默认灯是关闭),同时向微信发送一条温湿度的消息。</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;"><strong>三、使用的RT-Thread的软件包</strong></span></p>
</div>

<p>软件包的目录在工程目录的packages文件夹下。</p>

<p>1、aht10,用于采集温湿度;</p>

<p>2、ap3216c,用于采集光照和接近传感器的距离;</p>

<p>3、EasyFlash和Fal用于存储数据;</p>

<p>4、infrared,用于发送红外编码;</p>

<p>5、mbedtls,用于发送HTTPS的get消息;</p>

<p>6、netutils,联网;</p>

<p>7、qrcode显示smartconfig的二维码,我使用demo一直提示校验失败,无法正常使用.</p>

<p></p>

<p>后续使用web配网。</p>

<p>所以这里暂时没有用到。</p>

<p>8、webclient,用来post和get消息用的,但是HTTPS的用不了。</p>

<p></p>

<p><span style="font-size:20px;"><strong>四、软件框架说明</strong></span></p>

<p>板子上电后,在执行到MAIN函数之前,进行系统的初始化,这里包括fal,easyflash,wifi的配置信息读取。</p>

<p>main函数如下:</p>

<pre>
<code class="language-cpp">int main(void)
{
    int result = RT_EOK;
                //当前时间
                static struct tm *tm;
                //读取红外编码值到临时变量
                char *openled_infrared_data;

                /* 设置 LED 引脚为输出模式 */
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
                rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);
                //初始化蜂鸣器
                rt_pin_mode(PIN_BEEP,PIN_MODE_OUTPUT);
       
                //这两个函数在wifi config.c中的wlan_autoconnect_init()初始化
                //初始化flash
                //fal_init();
                //easyflash初始化,读取红外编码
    //if (easyflash_init() == EF_NO_ERR)

    /* 配置 wifi 工作模式 */
    rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION);
   
    /* 初始化 wlan 自动连接功能 */
    wlan_autoconnect_init();

    /* 使能 wlan 自动连接功能 */
    rt_wlan_config_autoreconnect(RT_TRUE);

    /* 创建 'net_ready' 信号量 */
    result = rt_sem_init(&amp;net_ready, "net_ready", 0, RT_IPC_FLAG_FIFO);
    if (result != RT_EOK)
    {
      return -RT_ERROR;
    }

    /* 注册 wlan 连接网络成功的回调,wlan 连接网络成功后释放 'net_ready' 信号量 */
    rt_wlan_register_event_handler(RT_WLAN_EVT_READY, wlan_ready_handler, RT_NULL);
    /* 注册 wlan 网络断开连接的回调 */
    rt_wlan_register_event_handler(RT_WLAN_EVT_STA_DISCONNECTED, wlan_station_disconnect_handler, RT_NULL);

                //读取数据暂存
                openled_infrared_data = ef_get_env("led_infrared_data");
                //读取失败
                if(openled_infrared_data == RT_NULL)
                {
                        openled_infrared_data = '0';
                }
                //读取的红外编码值存到myhome_sensor
                myhome_sensor.infrared_recv = (rt_uint8_t)atoi(openled_infrared_data);

                //lcd init
                lcd_clear(WHITE);
                lcd_set_color(WHITE,BLACK);
       
                //查找传感器并打开,采集数据
                sensor_pro_thread_create();
       
                //创建infrared处理线程并启动
                infrared_pro_thread_create();
               
                //lcd显示线程创建并启动
                lcd_dis_thread_create();
                //事件处理
                event_pro_thread_create();
               
    /* 等待 wlan 连接网络成功 */
    result = rt_sem_take(&amp;net_ready, RT_WAITING_FOREVER);
    if (result != RT_EOK)
    {
      LOG_E("Wait net ready failed!");
      rt_sem_delete(&amp;net_ready);
      return -RT_ERROR;
    }
                else
                {
                        //同步网络时间
                        ntp_sync_to_rtc(RT_NULL);
                        time_t now;
                        now = time(RT_NULL);
                       
                        tm = localtime(&amp;now);
                        rt_kprintf("now time:%d-%d-%d\n", tm-&gt;tm_hour,tm-&gt;tm_min,tm-&gt;tm_sec);
                }

}</code></pre>

<p>在wifi_config.c中完成WiFi的名称和密码读取,在sensor_port.c还有温湿度,光照传感器的硬件初始化,使用INIT_ENV_EXPORT函数注册,源码均在ports文件夹中。</p>

<p>在执行到main函数后,首先初始化IO,初始化各个传感器,然后等待WiFi的连接,WiFi连接后,同步网络时间,初始化LCD,进行时间处理。</p>

<p></p>

<p>&nbsp;</p>

<p><span style="font-size:20px;"><strong>五、演示效果及地址</strong></span></p>

<p>演示视频:链接: https://pan.baidu.com/s/1tDc90epcaDxRxgy8y33HbA 提取码: djhf</p>

<p><a href="https://v.youku.com/v_show/id_XNDQ2MTc5NzY2OA==.html?spm=a2h3j.8428770.3416059.1">https://v.youku.com/v_show/id_XNDQ2MTc5NzY2OA==.html?spm=a2h3j.8428770.3416059.1<iframe frameborder="0" height="450px" src="http://player.youku.com/embed/XNDQ2MTc5NzY2OA==" width="100%"></iframe></a><br />
&nbsp;</p>

<p>&nbsp;</p>

<p>源码:<a href="https://github.com/Rayuu/W601_RT-thread_Alarm">https://github.com/Rayuu/W601_RT-thread_Alarm</a></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><span style="font-size:20px;"><strong>六、总结</strong></span></p>

<p>11月20日拿到板子后,最开始是想做一个万能遥控器的,搞了几天,空调遥控器的编码搞不出来,放弃了。</p>

<p>然后对照SDK的目录例程自己学习配置W601的外设,最近一周天天早上起不来,就想到做这么一个闹钟来玩一玩。</p>

<p>当前缺少通过web配网和闹钟的时间设定,后续会新增功能。</p>

<p>最后感谢论坛和rt-thread组织的这次活动,让我更深层次的学习了RT-THREAD,RT-THREAD功能是真的强大。</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

Fillmore 发表于 2020-1-6 16:04

<p>哥们你得奖了哦,三等奖 看下今晚RTT公众号吧</p>
页: [1]
查看完整版本: 【RT-Thread软件包应用作品】小闹钟