【RT-Thread软件包应用作品】小闹钟
本帖最后由 禅师 于 2019-12-8 10:18 编辑<div class="parsedown-markdown">
<p>基于RT-THREAD系统的“小闹钟”</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> 提供的接口)发送一条温湿度的信息,早上起来后,看下当前环境实时的温湿度<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> </p>
<p>综上,使用的场景就是早上6点半,闹钟(蜂鸣器)响起,打开红外灯(默认灯是关闭),同时向微信发送一条温湿度的消息。</p>
<p> </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(&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(&net_ready, RT_WAITING_FOREVER);
if (result != RT_EOK)
{
LOG_E("Wait net ready failed!");
rt_sem_delete(&net_ready);
return -RT_ERROR;
}
else
{
//同步网络时间
ntp_sync_to_rtc(RT_NULL);
time_t now;
now = time(RT_NULL);
tm = localtime(&now);
rt_kprintf("now time:%d-%d-%d\n", tm->tm_hour,tm->tm_min,tm->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> </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 />
</p>
<p> </p>
<p>源码:<a href="https://github.com/Rayuu/W601_RT-thread_Alarm">https://github.com/Rayuu/W601_RT-thread_Alarm</a></p>
<p> </p>
<p> </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> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>哥们你得奖了哦,三等奖 看下今晚RTT公众号吧</p>
页:
[1]