基于WiFi的网络授时时钟(带实时天气更新)设计——DIY方案分享

本方案采用的是MCU+AT指令的形式开发,MCU是大家比较熟悉的意法半导体公司STM32F103C8T6,WiFi模块使用的是安信可ESP-12F,本方案是一个Demo设计,比较简单,仅实现了功能,算是一个抛砖引玉吧!

先上视频演示:https://v.youku.com/v_show/id_XNDE3OTE4MDY4NA==.html?spm=a2hzp.8244740.0.0

WiFi模块资料链接:https://docs.ai-thinker.com/esp8266

STM32F103C8芯片资料链接:https://www.stmicroelectronics.com.cn/content/st_com/zh/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103c8.html#overview

硬件部分,由时钟电路+WiFi模块+MCU最小系统+OLED显示屏+稳压电路+按键电路组成,这里采用时钟电路是希望模块在断网后还能获取一个比较精准的时间,并且电路设计上增加了储能电容可以在断电一个月后保持时间数据不丢失,当然这里也可以用STM32里面的RTC时钟;OLED显示屏采用的是裸屏设计,使整体电路板一体化效果好些;其他电路都是参考开发板or硬件手册上设计的;硬件设计软件采用的是 Altium Designer (13.0),原理图概略图如下图所示:

完整硬件图纸链接:https://download.csdn.net/download/ps574134526/11174710

实物图如下图所示:(电路板是找厂家打样的,元器件是纯人工手焊)

软件部分,由底层驱动+WiFi联网+调用API接口并解析数据+OLED显示组成;首先分析一波,这里面用到了MCU的USARTI2C*2GPIO*2引脚资源,然后对应去找相关类似的例程,既然已经有轮子了,为何还要花时间去造轮子,当然是直接改例程来的舒服。这里开发方式采用的是库函数开发,用的是STM32的标准库,对应找到了OLED显示屏的驱动资料PCF8563的驱动资料WiFi模组的驱动资料按键输入的驱动资料;将它们整合到一个工程里面,然后更改里面的引脚配置等,就完成了整个设计的底层驱动

WiFi联网,这里WiFi是设置成了STA模式(STA模式是啥,可自行问度娘),然后连接手机开的热点(注意手机必须要能连接上公网,即我们常用的互联网)。具体如何设置可以参考WiFi模块的AT指令集,AT指令集在上面WiFi模块资料里面有。手机开的WiFi热点的账号密码需要事先知道,并写入在程序里面,后续如果需要更改热点的账号密码,就需要更改程序。

天气和时间更新,即调用API接口并解析数据,这里用到了两个API接口,第一个是心知天气的天气实况数据获取,因为是免费版所以只能获取到天气现象和气温两项数据;第二个是Nowapi的北京时间数据获取。因为用到的两个API接口是隶属于两个不同的服务器,所以程序上需要进行切换,连完这个服务器后需要断开连另一个服务器,比较麻烦。后面我发现其实Nowapi里面就有天气数据可以获取,完全可以通过只连接这个服务器就实现天气和时间数据的更新。实现方法参考下面的网址,写比较详细。

心知天气https://docs.seniverse.com/api/weather/now.html、服务器IP116.62.81.138(域名api.seniverse.com)、默认端口80

Nowapihttps://www.nowapi.com/api/life.time、服务器IP103.205.4.43(域名api.k780.com)、默认端口80

解析数据用的是比较简单的方法,因为需要解析的数据量不大,所以并没有移植cjson,直接用strtok函数硬解。

OLED显示,OLED显示用的是I2C接口,然后给的例程只有常用的标点符号和26个英文字母的字库,如果需要汉字还需要自己添加字库,一般是用到什么汉字就添加什么汉字的字库,然后用例程里面给的功能函数去实现显示。

显示屏资料http://pan.baidu.com/s/1dFri9Vz

下图是用到的所有.c文件(除库函数之外)

bsp_usart1.c是用来串口调试使用,可以打印在电脑串口调试助手上显示;bsp_SysTick.c是用来生成精准的延时函数,用于I2C通讯等对时序敏感的接口;bsp_esp8266.c里面是对WiFi模块的一些初始化配置和WiFi的功能函数;Common.c里面是一些辅助函数;test.c里面是实现WiFi配网应用和API接口调用及解析;oled.c里面显示屏的初始化配置和显示功能函数;bsp_pcf8563.c里面是时钟芯片的初始化配置和读写时间功能函数;bsp_key.c里面是按键的初始化配置、按键扫描功能函数和静态内容显示函数;bsp_TiMbase.c里面是定时器函数,这里为什么用到定时器,因为一般天气和时间数据刷新的频率不会太快,这里设定的是5分钟更新一次,那么这里就需要用到定时器。

完整程序代码链接https://download.csdn.net/download/ps574134526/11176416

注意:"GET http://api.k780.com/?app=life.time&appkey=41298&sign=eb689df06015c995b73ae1f60c133a77&format=json\n" ,里面的appkey=41298和sign=eb689df06015c995b73ae1f60c133a77,最好更换成自己的appkey和sign(网址上注册账号)  "GET https://api.seniverse.com/v3/weather/now.json?key=SO0c3M39I7uTr9XjF&location=guangzhou&language=zh-Hans&unit=c\n",里面的key=SO0c3M39I7uTr9XjF和location=guangzhou,最好换成自己的Key和城市(网址上注册账号)

  • 17
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
方案采用的是MCU+AT指令的形式开发,MCU是大家比较熟悉的意法半导体公司STM32F103C8T6,WiFi模块使用的是安信可ESP-12F,本方案是一个Demo设计,比较简单,仅实现了功能,算是一个抛砖引玉吧! 先上视频演示:https://v.youku.com/v_show/id_XNDE3OTE4MDY4NA==.html?spm=a2hzp.8244740.0.0 WiFi模块资料链接:https://wiki.ai-thinker.com/esp8266 STM32F103C8芯片资料链接:https://www.stmicroelectronics.com.cn/content/st_com/zh/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f1-series/stm32f103/stm32f103c8.html#overview 硬件部分,由时钟电路+WiFi模块+MCU最小系统+OLED显示屏+稳压电路+按键电路组成,这里采用时钟电路是希望模块在断网后还能获取一个比较精准的时间,并且电路设计上增加了储能电容可以在断电一个月后保持时间数据不丢失,当然这里也可以用STM32里面的RTC时钟;OLED显示屏采用的是裸屏设计,使整体电路板一体化效果好些;其他电路都是参考开发板or硬件手册上设计的;硬件设计软件采用的是Altium Designer (13.0),原理图概略图如下图所示: 实物图如下图所示:(电路板是找厂家打样的,元器件是纯人工手焊) 软件部分,由底层驱动+WiFi联网+调用API接口并解析数据+OLED显示组成;首先分析一波,这里面用到了MCU的USART、I2C*2、GPIO*2引脚资源,然后对应去找相关类似的例程,既然已经有轮子了,为何还要花时间去造轮子,当然是直接改例程来的舒服。这里开发方式采用的是库函数开发,用的是STM32的标准库,对应找到了OLED显示屏的驱动资料、PCF8563的驱动资料、WiFi模组的驱动资料、按键输入的驱动资料;将它们整合到一个工程里面,然后更改里面的引脚配置等,就完成了整个设计的底层驱动。 WiFi联网,这里WiFi是设置成了STA模式(STA模式是啥,可自行问度娘),然后连接手机开的热点(注意手机必须要能连接上公网,即我们常用的互联网)。具体如何设置可以参考WiFi模块的AT指令集,AT指令集在上面WiFi模块资料里面有。手机开的WiFi热点的账号密码需要事先知道,并写入在程序里面,后续如果需要更改热点的账号密码,就需要更改程序。 天气和时间更新,即调用API接口并解析数据,这里用到了两个API接口,第一个是心知天气天气实况数据获取,因为是免费版所以只能获取到天气现象和气温两项数据;第二个是Nowapi的北京时间数据获取。因为用到的两个API接口是隶属于两个不同的服务器,所以程序上需要进行切换,连完这个服务器后需要断开连另一个服务器,比较麻烦。后面我发现其实Nowapi里面就有天气数据可以获取,完全可以通过只连接这个服务器就实现天气和时间数据的更新实现方法参考下面的网址,写比较详细。 心知天气:https://docs.seniverse.com/api/weather/now.html、服务器IP116.62.81.138(域名api.seniverse.com)、默认端口80 Nowapi:https://www.nowapi.com/api/life.time、服务器IP103.205.4.43(域名api.k780.com)、默认端口80 解析数据用的是比较简单的方法,因为需要解析的数据量不大,所以并没有移植cjson,直接用strtok函数硬解。 OLED显示,OLED显示用的是I2C接口,然后给的例程只有常用的标点符号和26个英文字母的字库,如果需要汉字还需要自己添加字库,一般是用到什么汉字就添加什么汉字的字库,然后用例程里面给的功能函数去实现显示。 显示屏资料:http://pan.baidu.com/s/1dFri9Vz 下图是用到的所有.c文件(除库函数之外) bsp_usart1.c是用来串口调试使用,可以打印在电脑串口调试助手上显示;bsp_SysTick.c是用来生成精准的延时函数,用于I2C通讯等对时序敏感的接口;bsp_esp8266.c里面是对WiFi模块的一些初始化配置和WiFi的功能函数;Common.c里面是一些辅助函数;test.c里面是实现WiFi配网应用和API接口调用及解析;oled.c里面显示屏的初始化配置和显示功能函数;bsp_pcf8563.c里面是时钟
机缘巧合下获得了一个共享的WiFi授时的固件,就想着做个时钟玩玩,毕竟网络授时即便有误差也是就那么大,误差改变不了;研究了下,跟GPS授时读时间基本都一样,参考着GPS的解码程序。还算行,过程有不少坎坷。数码管刷新,读温度,串口中断,北京时间计算(因为读出来的是UTC时间比北京时间慢8个小时整)只读时间还好说,可是也要日期,闰年判断,大小月判断等等。最终还是鼓捣出来了,很不错! 这是正在刷新时候被拍下来了,秒点设计的很个性,上下各两个共四个;最上面和最下面亮,剩下两个灭,然后最上和最下灭,中间两个亮。灵感一闪做的,哈哈 挂起来,关灯模式,亮度变暗,不进行显示转换。右下角那个红LED是ESP8266模块的电源指示灯,每秒旁边蓝LED闪一下 开灯,亮度恢复正常(就两个亮度,如果需要,可以再程序里改)说一下:左下角是显示温度的 显示日期,大秒点全亮,左下角数码管显示时间,小秒点闪烁 这是制作的时候照的,后来改了些细节,不过电路图都是对的! 左上角是DS18B20测温的,这也是我第一次把DS18B20焊板子上,以前都是用线引出去,因为板子也发热,人感觉不出来罢了 一堆三极管,因为单片机太小,所以段码也用三极管控制了,不过单片机还是微微发热 给ESP8266模块供电用的1117-3.3V降压模块,有个电源指示灯,被我拆了 给ESP8266刷固件方法: USB-TTL模块的GND-ESP8266模块的GND USB-TTL模块的3.3V-ESP8266模块的VCC USB-TTL模块的RXD-ESP8266模块的UTXD USB-TTL模块的TXD-ESP8266模块的URXD ESP8266模块的GPIO0-ESP8266模块的GND ESP8266模块的CH_PD-ESP8266模块的VCC 【转载自数码之家】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sense_Ye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值