网络闹钟
作者:hehung
一、项目背景
本作品设计目的是解决市面上的闹钟功能单一,没有联网功能的缺点。第一次了解到RVB2601,看到板载OLED显示屏,按键,WIFI等设备就有了可以做一个多功能联网闹钟的想法。全部功能都可以用板载资源完成,无需外接其他传感器等,简化了设置流程。经过三个月的反复调试,最终实现了除闹钟功能外还包括获取天气信息,自动校准时间,手动设置时间,Iot物联网远程控制,报时等功能。
二、作品简介
该作品为一个多功能闹钟,主要实现日历时间显示,天气信息显示,联网状态显示,语音报时,闹钟设置,联网校时,手动设置时间,wifi配置,城市设置等功能。第一次上电所有设置为默认状态,用户可以对wifi名以及密码进行设置之后会自动联网进行校时,天气信息获取,物联网连接等。Wifi配置好了之后系统会自动保存配置信息,下一次上电会自动联网。通过巧妙设计使得所有操作均通过板载两个按键或者物联网WEB界面配置来完成,系统中所有设置项均会自动保存掉电不丢失。
三、系统框图
系统中使用了AOS,kv,网络管理,RTC,NTP,cJSON,播放器,AT等资源等。
外设使用了板载外设OLED,喇叭,LED,按键KEY1和KEY2,板载wifi芯片W800。 总系统设计架构图见下图。
OLED部分主要用于显示信息,根据当前显示界面可以完成整个系统的设置以及操作等,因这部分架构较为复杂,单独画图说明,如下图:
OLED是该作品的核心部分,主要包含九大部分,每个部分的切换在第四章中详细描述。
①时间显示界面。用于显示日期时间,联网状态,闹钟开启状态,IOT物联网平台连接状态,当前天气和温湿度信息;
②菜单显示界面。显示四个可选菜单项,分别为设置,wifi配网,天气,退出;
③设置显示界面。显示闹钟,音量以及音量百分比,音效以及音效使能状态,报时以及报时使能状态,联网校时以及联网校时使能状态,时间,天气城市代码,退出等信息;
④Wifi配网显示界面。显示wifi名字长度,wifi名字,wifi密码长度,wifi密码,退出等信息;
⑤天气信息显示界面。该界面将滚动显示,主要显示今日天气,今日温度,今日湿度,当前天气,当前温度等信息;
⑥闹钟选择显示界面。显示闹钟时间,当前是第几个闹钟,切换上一个闹钟按钮,切换下一个闹钟按钮,退出等信息;
⑦闹钟设置显示界面。显示当前闹钟是第几个闹钟,闹钟时间,闹钟使能状态,星期一到星期天的闹钟使能状态,退出等信息;
⑧时间设置显示界面。主要显示要设置的时间的年月日时分秒,退出等信息;
⑨城市代码设置显示界面。该代码用于获取天气信息使用,显示需要获取的城市的天气代码。
喇叭用于播放“欢迎声音”,“闹钟音乐”,“按键音效”以及“音量设置时音效”。
作品中使用了绿色以及红色LED。
绿色LED作为系统工作指示灯循环明暗交替变化;
红色LED作为闹钟指示灯,当设定闹钟时间到了之后停止绿色LED工作,变为红色LED循环明暗交替变化提示闹钟时间到了。
两个板载按键KEY1和KEY2用于显示界面切换以及所有设置项操作。
用于联网控制。IoT数据交互,NTP校时,天气信息获取。
上电之后会自动进行NTP校时,校时完成之后会获取天气信息,之后连接IoT平台进行数据交互
Web界面用于IoT控制。包括闹钟时间设置,使能/禁能设置设置,闹钟星期使能/禁能设置,音量百分比设置,音效使能/禁能设置设置,报时使能/禁能设置设置,联网校时使能/禁能设置,时间设置,天气城市代码设置等控制功能,便于用于操作,可以与本地设置结合使用;
四、各部分功能说明和解析
软件实现中的任务分配如下图所示。
按键逻辑在一个周期为20ms的任务中工作。
按键使用了板载的两个按键KEY1和KEY2,实现系统所需的所有控制操作。
每个按键支持四种控制模式,分别如下:
(1)短按
按键按下时间小于500ms。
(2)长按
按键按下时间大于等于500ms
(3)按键保持按下
按键按下时间大于等于500ms且保持不松手。
(4)按键保持松开
这种是默认状态,没有特殊逻辑处理。
这几种控制模式在5. OLED中会详细描述。
LED逻辑在一个周期为100ms的任务中执行。
(1)LED主要用于显示系统是否在正常工作,绿色LED使用PWM控制周期性明暗交替变化。
(2)当闹钟响应之后,PWM控制红色LED周期性明暗交替变化,绿色LED熄灭。
(3)闹钟取消之后,绿色LED继续周期性明暗交替变化。
NTP任务周期为100ms。
任务创建之后,先初始化RTC导入默认日历时间,之后进入NTP校时任务。
任务逻辑如下:
(1)如果“网络校时”功能使能,如果网络连接成功,则获取NTP时间对本地RTC日历进行校准;
(2)如果“网络校时”功能使能,如果网络连接未成功,则等待网络连接;
(3)如果“网络校时”功能禁能,则不获取网络时间;
(4)如果“网络校时”功能由禁能变为使能,则立即获取网络时间对本地RTC日历进行校准。
闹钟任务周期为1s。
该作品支持最多设置10个闹钟。每个闹钟可能进行时间(小时,分钟)设置,使能/技能设置,星期一~星期天使能/技能设置。
功能支持如下:
(1)如果闹钟使能且未设置任何一个星期使能(即星期一到星期天都未使能),则闹钟是单次播报,一旦闹钟激活了之后就会设置为禁能状态;
(2)如果闹钟使能且使能了星期一到星期天中的任意一个或者多个,则闹钟为以星期为单位的周期性工作。如果使能了星期一到星期天,则闹钟每天都会工作;
(3)如果闹钟禁能,则被禁能的闹钟不工作;
(4)如果使能了多个闹钟,则多个闹钟都会工作,相互独立;
(5)任务创建后,会周期性扫描设定的闹钟时间是否到达,如果设定的闹钟时间到达,则播放闹钟音乐,控制红色LED周期性明暗交替变化;
(6)如果闹钟工作期间按下了任意一个按键(无论长按还是短按),则停止闹钟播报;
(7)闹钟激活之后会开始计时,如果连续5分钟没有被手动关闭,则自动关闭。
物联网数据交互任务的周期为1s。
物联网平台使用了阿里云的飞燕平台,主要用于用于远程控制“网络闹钟”,所有的web设置项会和本地设置进行实时同步。
IoT web控制界面如下图所示。
(1)网络校准使能:使能或者禁能NTP功能,当NTP功能从禁能切换为使能时会自动校准一次时间;
(2)音量百分比:调节音量百分比(0-100);
(3)按键音效:使能或者禁能按键音效功能;
(4)报时:使能或者禁能报时功能(报时功能只支持早上九点到下午六点整点报时);
(5)设置时间:手动设置时间,如果“网络校时”功能为禁能状态才有效,否则设置无效;
(6)城市代码:设置获取天气信息的城市代码,需要保证天气城市代码有效,天气城市代码可以参考该网址:https://blog.csdn.net/mxh3600/article/details/121580770
(7)闹钟设置:
获取天气的任务周期为1s。
任务创建好了之后会进入准备获取天气信息。
(1)如果NTP使能了,则等待NTP获取成功之后再获取天气信息;
(2)如果NTP禁能了,则等待网络连接成功之后再获取天气信息;
(3)当第一次天气信息获取成功之后,每一次小时获取一次天气信息,以满足实时更新最新天气的需求。
获取天气使用了GET方式,获取指定http天气信息,获取的是实时天气,网址为:https://www.nowapi.com/api/weather.today
该平台提供三个月的免费试用,一小时最多可以获取20次。
获取的JSON示例如下图,通过对JSON数据的解析,提取出当前天气信息,当前温度湿度信息,本日天气信息,本日温度信息等。
喇叭任务的周期为100ms,用于播放闹钟音乐,按键音效,音量调节音效,系统启动欢迎语音。
实现功能如下:
(1)当系统启动时,播放欢迎“您好的语音”;
(2)当闹钟激活之后,喇叭播放闹钟音效;
(3)如果“音效”使能,则每一次按键按下都会播放按键音效;
(4)如果正在调节“音量”,则音量调节完毕会播放音效;
(5)音量大小可以在“设置”界面或者物联网控制调节;
(6)如果“报时”使能,报时功能支持早上九点到下午六点整点报时,如果禁能,不报时。
OLED一共会显示九种不同的界面,分别如下:
(1)时间显示界面
时间显示界面会显示如下信息:
在该界面下,短按“KEY1”进入“菜单界面”。
(2)菜单显示界面
菜单显示界面会显示如下菜单:
(3)设置显示界面
设置界面分为三页显示分别如下:
第一页显示:
第二页显示:
第二页显示:
(4)Wifi配网界面
注:对于WiFi名字以及密码设置时,为了简化输入逻辑,使用两个按键分别表示ascii的高位和低位用于输入,可以实现标准ASCII码所有可打印字符的输入,“KEY2”对应ASCII十六进制的高位,“KEY1”对应的是ASCII的十六进制的低位,短按“KEY2”高位ASCII加一,短按“KEY1”低位ASCII加一,可打印的ASCI字符为0x20-0x7E,所以wifi名字和密码只支持ASCII上的可打印字符,不支持中文以及其他复杂字符,所以连接的路由器名字以及密码需要为常见字符才行。在对密码以及wifi名设置时,左上角会显示当前ASCII十六进制数,方便查看,详细操作见视频。
Wifi配网会显示三个页面,分别如下:
Wifi名设置时,两个按键短按组合为ASCII值,方便设置;长按“KEY2”切换上一个字符,长按“KEY1”切换下一个字符,详细操作见视频。
注:WiFi名字长度最多支持32位,最少1位。
Wifi密码设置时,两个按键短按组合为ASCII值,方便设置;长按“KEY2”切换上一个字符,如果当前光标在第一个密码字符上,长按“KEY2”光标切换到“密码长度”上,长按“KEY1”切换下一个字符,当光标处于最后一个密码字符时,长按“KEY1”会切换到“退出”,详细操作见视频。
注:密码最多支持64位,最少8位或者0位(表示没有密码)。
当光标在“退出”上时,短按“KEY1”或者“KEY2”退回到“菜单显示界面”,长按“KEY1”光标切换到“wifi名字长度”,长按“KEY2”光标切换到“密码”最后一个字符上。
注:Wifi配置这块做的有些许繁琐,因为w800没有ap功能,如果有ap功能,可以简化一些流程,做成这种方式可以连接绝大部分的路由器,并且只需要配网一次,下次上电无需再次配网会自动连接。
(5)天气信息显示界面
天气显示界面会滚动显示今日天气,今日温度范围,当前天气,当前温度,当前湿度等信息。
按下任何按键(无论长按,短按)均会退回到“菜单显示界面”。
(6)闹钟选择界面
在闹钟选择界面中有4个可选项,如下图:
(7)闹钟详细设置界面
可设置项为“<”,“>”,“时”,“分”,“开关”,“一”,“二”,“三”,“四”,“五”,“六”,“日”,“退出”。
短按“KEY1”,光标会切换到下一个可设置项上;
短按“KEY2”,光标会切换到上一个可设置项上;
长按“KEY1”或者“KEY2”或者按住保持所设置内容有所区别。
当光标处于不同的设置项上时,设置内容不一样,如下进行说明:
“<”:长按“KEY1”或者“KEY2”切换到上一个闹钟;
“>”:长按“KEY1”或者“KEY2”切换到下一个闹钟;
“时”:长按“KEY1”并保持闹钟时持续性加一,长按“KEY2”并保持闹钟时持续性减一;
“分”:长按“KEY1”并保持闹钟分持续性加一,长按“KEY2”并保持闹钟分持续性减一;
“开关”:当显示为“关”时,长按“KEY1”或者“KEY2”变为“开”,表示闹钟使能;当显示为“开”时,长按“KEY1”或者“KEY2”变为“关”,表示闹钟禁能;
“一”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周一指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“二”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周二指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“三”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周三指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“四”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周四指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“五”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周五指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“六”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周六指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“日”:当显示为禁能时,长按“KEY1”或者“KEY2”变为使能,表示闹钟使能了每周日指定时间都激活;当显示为使能时,长按“KEY1”或者“KEY2”变为禁能;
“退出”:长按“KEY1”或者“KEY2”退回到“闹钟选择界面”;
(8)手动设置时间界面
手动设置可以设置“时”,“分”,“秒”,“年”,“月”,“日”“退出”;
长按“KEY1”光标切换到下一个设置项,长按“KEY2”光标切换到上一个设置项;
当光标处于时间设置项上时,短按“KEY1”时间加一,短按“KEY2”时间减一;
当光标处于“退出”时,短按“KEY1”或者“KEY2”退回到“设置界面”。
(9)天气城市代码设置界面
城市代码设置界面主要用于设置获取天气所需要的城市代码,城市代码可以参考:https://blog.csdn.net/mxh3600/article/details/121580770
城市代码只支持数字,为9位长度的数字。
长按“KEY1”光标切换到下一个数字;
长按“KEY2”光标切换到上一个数字;
当光标在数字上时,短按“KEY1”数字加一,短按“KEY2”数字减一;
当光标在“退出”上时,短按“KEY1”或者“KEY2”退回到“设置界面”,长按“KEY1”光标切换到城市代码的最后一个数字上,长按“KEY2”光标切换到城市代码的第一个数字上。
KV没有单独的任务,主要用于其他模块使用用来保存数据,掉电不丢失。
会记录如下数据到KV空间保存:
RTC没有单独的任务。上电时自动初始化加载初始设定值,如果NTP或者手动时间或者Web更新了时间,则重新装载设置值到RTC。
五、作品源码
作品上传到了gitee,链接:https://gitee.com/hehung/NetworkClock
注:源码中修改了库文件,所以库文件一起上传了,如果需要测试这个程序,需要下载整个文件包,下载下来直接编译运行即可。
源码文件结构:
app_alarm.c, app_alarm.h: 闹钟处理程序
app_display.c, app_display.h: OLED屏幕显示处理程序以及切换逻辑
app_iot.c, app_iot.h: 物联网处理逻辑
app_key.c, app_key.h: 按键处理逻辑
app_kv.c, app_kv.h: 设置存储逻辑
app_main.c: 主函数入口
app_oled.c, app_oled.h: OLED显示逻辑驱动程序,字符显示,汉字显示,字符串显示,数字显示等
app_oled_bmp.h: 显示的图片数组
app_oled_Font.h: 显示的文字数组,汉字,ASCII码等
app_player.c, app_player.h: 喇叭播放器处理程序
app_rgb.c, app_rgb.h: RGB LED处理逻辑
app_rtc.c, app_rtc.h: RTC以及NTP处理逻辑
app_weather.c, app_weather.h: 天气信息处理逻辑
Oled_drv.c, oled_drv.h: OLED SPI驱动程序,来自官方,有自己的小改动
Mp3_hex.h:
六、视频演示
视频将演示具体如何操作网络闹钟作品。
视频上传到了bilibili,链接为:https://www.bilibili.com/video/BV1dr4y1G7yP/
七、项目总结
这是我第一次接触平头哥的板子,初次看到这个板子的时候,感觉设计的很精美,遂申请了该比赛。虽然开发过程中遇到了一些问题,但最后都在平头哥小二的帮助下解决了。历经三个月的时间,完成了对开发板资源的了解与实践,最终完成了该作品,算是对学习该开发板的一个总结,也让我对平头哥的板子有了深入的了解,希望越做越好。感谢EEWORLD与平头哥的支持。
帖子分享链接:
【平头哥RVB2601创意应用开发】1. 开箱啦 https://bbs.eeworld.com.cn/thread-1195813-1-1.html
【平头哥RVB2601创意应用开发】2. 试试控制板载RGB http://bbs.eeworld.com.cn/thread-1195828-1-1.html
【平头哥RVB2601创意应用开发】3. 板载按键实验 https://bbs.eeworld.com.cn/thread-1195831-1-1.html
【平头哥RVB2601创意应用开发】4. 运用RTC来记录时间http://https://bbs.eeworld.com.cn/thread-1195848-1-1.html
【平头哥RVB2601创意应用开发】5. 解决W800有时候连不上网的问题 https://bbs.eeworld.com.cn/thread-1205623-1-1.html
【平头哥RVB2601创意应用开发】6. 获取天气信息http://https://bbs.eeworld.com.cn/thread-1205624-1-1.html
【平头哥RVB2601创意应用开发】7. 物联网控制 https://bbs.eeworld.com.cn/thread-1205711-1-1.html
八、其他
说说开发过程中遇到的一些编译器上的问题吧:
在word上写得文档在这里格式有些对不上,所以word文档也直接上传,见附件。
本帖最后由 hehung 于 2022-6-4 12:45 编辑
引用: lugl4313820 发表于 2022-6-4 20:57 帖子写得非常好,希望拿奖,一鸣惊的人才子,继续加油!
谢谢