1638|2

29

帖子

4

TA的资源

一粒金砂(中级)

楼主
 

【平头哥RVB2601创意应用开发】+智能闹钟 [复制链接]

  本帖最后由 奇迹12 于 2022-5-17 19:02 编辑

一、作品简介

显示当前时间

设备能够通过ntp获取时间,并配置到RTC

具有设置单个闹钟的功能

闹钟可通过按下任意按键关闭

主界面显示当前环境温度与湿度

 

二、系统框图

三、各部分功能说明和解析

1.RTC配置与时间读取

csi_rtc_t rtc;

void app_rtc_init(app_time_t *time)
{
	ASSERT_INSPECT(csi_rtc_init(&rtc, 0));
	ASSERT_INSPECT(csi_rtc_set_time(&rtc, time));
}

void app_get_time(app_time_t *time)
{
	ASSERT_INSPECT(csi_rtc_get_time(&rtc, time));
	time->tm_year += 1900;
	time->tm_mon += 1;
}

 

2.主界面代码

裸机操作,通过操作显存显示,最后刷新到屏幕

void app_display_main(app_time_t app_time, int16_t temp, int16_t humi)
{
	uint8_t date_x=24,date_y=10;
	uint8_t time_x=32,time_y=26;
	uint8_t interval = 8;

	uint8_t temp_x=0,temp_y=45;
	uint8_t humi_x=88,humi_y=45;
	
	gui_Clear();
	gui_ShowChar(date_x,date_y,app_time.tm_year/1000%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_year/100%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_year/10%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_year/1%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,'-',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_mon/10%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_mon/1%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,'-',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_mday/10%10+'0',16,1); date_x+=interval;
	gui_ShowChar(date_x,date_y,app_time.tm_mday/1%10+'0',16,1); date_x+=interval;
	
	gui_ShowChar(time_x,time_y,app_time.tm_hour/10%10+'0',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,app_time.tm_hour/1%10+'0',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,':',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,app_time.tm_min/10%10+'0',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,app_time.tm_min/1%10+'0',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,':',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,app_time.tm_sec/10%10+'0',16,1); time_x+=interval;
	gui_ShowChar(time_x,time_y,app_time.tm_sec/1%10+'0',16,1); time_x+=interval;

	
	gui_ShowChar(temp_x,temp_y,temp/100%10+'0',16,1); temp_x+=interval;
	gui_ShowChar(temp_x,temp_y,temp/10%10+'0',16,1); temp_x+=interval;
	gui_ShowChar(temp_x,temp_y,'.',16,1); temp_x+=4;
	gui_ShowChar(temp_x,temp_y,temp/1%10+'0',16,1); temp_x+=interval;
	gui_ShowChar(temp_x,temp_y-2,'o',12,1); temp_x+=6;
	gui_ShowChar(temp_x,temp_y,'C',16,1); temp_x+=interval;
	
	
	gui_ShowChar(humi_x,humi_y,humi/100%10+'0',16,1); humi_x+=interval;
	gui_ShowChar(humi_x,humi_y,humi/10%10+'0',16,1); humi_x+=interval;
	gui_ShowChar(humi_x,humi_y,'.',16,1); humi_x+=4;
	gui_ShowChar(humi_x,humi_y,humi/1%10+'0',16,1); humi_x+=interval+3;
	gui_ShowChar(humi_x,humi_y,'%',16,1); humi_x+=interval;
	
	oled_refresh(OLED_GRAM);
}

 

3.读取DHT11

uint8_t dht11_readData(int16_t *Temp, int16_t *Humi)
{
	uint8_t sta = 0;
	uint8_t i;
	uint8_t buf[5];
	
	if (DHT11RstAndCheck())         //检测响应信号
	{
		for(i=0;i<5;i++)
		{
			buf=DHT11ReadByte();
		}
		if(buf[0]+buf[1]+buf[2]+buf[3] == buf[4]) //校验成功
		{
		uint8_t H_inte = buf[0]; //湿度整数部分数据
		uint8_t H_frac = buf[1]; //湿度小数部分数据
		uint8_t T_inte = buf[2]; //温度整数部分数据
		uint8_t T_frac = buf[3]; //温度小数部分数据

		printf("%d.%d %d.%d %d\n",buf[0],buf[1],buf[2],buf[3],buf[4]);
		*Humi = H_inte*10+H_frac;
		*Temp = T_inte*10+T_frac;
		}
		sta = 0;
	}
	else //响应失败返回-1
	{
	*Humi = 0; //响应失败返回-1
	*Temp = 0; //响应失败返回-1
	sta = 1;
	}

	return sta;    
}

 

4.播放声音

void player_voice()
{
    char url[128];

    snprintf(url, sizeof(url), "mem://addr=%u&size=%u", (uint32_t)&_welcome_mp3, _welcome_mp3_len);
    player_play(get_player_demo(), url, 0);
}

 

5.按键检测与处理任务

static void key_task()
{
	uint8_t key1_state = 0;
	uint8_t key2_state = 0;
	uint8_t key_time;

	while(1)
	{
		if(key1_get() == 1)
		{
			aos_msleep(10);
			if(key1_state == 0) key_time = 1000 / 10;
			else key_time = 100 /10;
			while(key1_get() == 1) 
			{
				aos_msleep(10);
				key_time--;
				if(key_time == 0) break;
			}
			key1_state = 1;
		}
		else
		{
			key1_state = 0;
		}
		
		if(key2_get() == 1)
		{
			aos_msleep(10);
			if(key2_state == 0) key_time = 1000 / 10;
			else key_time = 100 /10;
			while(key2_get() == 1)
			{
				aos_msleep(10);
				key_time--;
				if(key_time == 0) break;
			}
			key2_state = 1;
		}
		else
		{
			key2_state = 0;
		}
		
		if(key1_state == 1)
		{
			screen_state ++;
		}
		if(screen_state > 4) screen_state = 0;
		
		if(key2_state == 1)
		{
			if(screen_state == 1)
				alarm_clock.tm_hour++;
			if(alarm_clock.tm_hour >= 24) alarm_clock.tm_hour = 0;
			
			if(screen_state == 2)
				alarm_clock.tm_min++;
			if(alarm_clock.tm_min >= 60) alarm_clock.tm_min = 0;
			
			if(screen_state == 3)
				alarm_clock.tm_sec++;
			if(alarm_clock.tm_sec >= 60) alarm_clock.tm_sec = 0;
			
			if(screen_state == 4)
				alarm_clock_state ++;
			if(alarm_clock_state >= 2) alarm_clock_state = 0;
		}
		
		if((key1_state == 1 || key2_state == 1)&&player_flag == 1)
		{
			player_flag = 0;
		}
		aos_msleep(50);
	}
}

 

四、作品源码

 

 源代码

 

五、视频演示

 

 

智能闹钟_演示视频

 

六、项目总结

 整体项目比较简单,论坛也有很多大神的资料参考,很顺利就完成了,总体还是很好的,就是CDK环境用起来怪怪的。

最后感谢论坛跟平头哥提供的这次机会。

 

最新回复

nmg
奇迹,作品文档也附上 还有是否去平头哥同步和发邮件,按照下面的帖子说明,查缺补漏啊:   关于平头哥RVB2601作品提交说明 https://bbs.eeworld.com.cn/thread-1201527-1-1.html   详情 回复 发表于 2022-5-18 09:19
点赞 关注
 
 

回复
举报

7096

帖子

11

TA的资源

版主

沙发
 
各方面掌握不错了,恭喜完成作业!
 
 
 

回复

5266

帖子

239

TA的资源

管理员

板凳
 

奇迹,作品文档也附上

还有是否去平头哥同步和发邮件,按照下面的帖子说明,查缺补漏啊:
 

关于平头哥RVB2601作品提交说明 https://bbs.eeworld.com.cn/thread-1201527-1-1.html

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表