基于RT-THREAD系统的“小闹钟”

一、项目初衷

冬天的早上比较冷,早上6点半起不来,于是就想用这个做一个小闹钟,之所以叫小闹钟,是因为当前功能还不是很完善,比如手动设置时间的功能还未添加进去,手动配网的也还没加进去。

二、项目功能概述

目前的功能实现如下:

1、LCD显示

aht10采集的温湿度,ap3216c采集的光照强度和距离传感器的AD值;

2、开发板连接WiFi后,

使用netutils的NTP功能,同步时间,显示当前日期和时间到LCD上;

3、开发板接收红外遥控器的按下时的编码,

然后存储起来。用来控制一个红外遥控的小灯;

4、开发板上电,同步时间后,

在闹钟的设定时刻,蜂鸣器会响起,然后发送存储的红外编码,打开灯(因为灯的开关编码一样,这里默认灯是关闭的),同时向微信(利用http://sc.ftqq.com/3.version 提供的接口)发送一条温湿度的信息,早上起来后,看下当前环境实时的温湿度。

5、ap3216c

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

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

三、使用的RT-Thread的软件包

软件包的目录在工程目录的packages文件夹下。

  • 1、aht10,用于采集温湿度;

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

  • 3、EasyFlash和Fal用于存储数据;

  • 4、infrared,用于发送红外编码;

  • 5、mbedtls,用于发送HTTPS的get消息;

  • 6、netutils,联网;

  • 7、qrcode显示smartconfig的二维码,我使用demo一直提示校验失败,无法正常使用. 后续使用web配网。所以这里暂时没有用到。

  • 8、webclient, 用来post和get消息用的,但是HTTPS的用不了。

四、软件框架说明

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

main函数如下:

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] = '0';
	}
	//读取的红外编码值存到myhome_sensor
	myhome_sensor.infrared_recv[0] = (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);
	}
}

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

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

五、演示效果及地址

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

https://v.youku.com/v_show/id_XNDQ2MTc5NzY2OA==.html?spm=a2h3j.8428770.3416059.1

源码:https://github.com/Rayuu/W601_RT-thread_Alarm

六、总结

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

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

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

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

http://bbs.eeworld.com.cn/thread-1102603-1-1.html

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章