找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8997|回复: 14
收起左侧

基于WiFi的网络授时时钟(带实时天气更新)STM32程序设计

  [复制链接]
ID:451980 发表于 2019-5-19 10:04 | 显示全部楼层 |阅读模式
本方案采用的是MCU+AT指令的形式开发,MCU是大家比较熟悉的意法半导体公司STM32F103C8T6,WiFi模块使用的是安信可ESP-12F,本方案是一个Demo设计,比较简单,仅实现了功能,算是一个抛砖引玉吧!

先上视频演示:https://v.youku.com/v_show/id_XN ... m=a2hzp.8244740.0.0

WiFi模块资料链接:wiki点ai-thinker点com/esp8266

STM32F103C8芯片资料链接:https://www.stmicroelectronics.c ... 103c8.html#overview

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

11111.PNG


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

22222222222222.PNG


软件部分,由底层驱动+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里面就有天气数据可以获取,完全可以通过只连接这个服务器就实现天气和时间数据的更新。实现方法参考下面的网址,写比较详细。

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

Nowapi: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文件(除库函数之外)

3333333333333.PNG


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分钟更新一次,那么这里就需要用到定时器。

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

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "bsp_usart1.h"
  3. #include "bsp_SysTick.h"
  4. #include "bsp_esp8266.h"
  5. #include "test.h"
  6. #include "oled.h"
  7. #include "bsp_pcf8563.h"
  8. #include "bsp_key.h"
  9. #include "bsp_TiMbase.h"

  10. /**
  11.   * @brief  主函数
  12.   * @param  无
  13.   * @retval 无
  14.   */
  15. int main ( void )
  16. {

  17.         SysTick_Init();                                                                           //配置 SysTick 为 1ms 中断一次
  18.         Delay_us(100000);                         //延时100ms等待电压稳定
  19.         /* 初始化 */
  20.        
  21.   USARTx_Config();                                                                          //初始化串口1
  22.         ESP8266_Init();                                                                            //初始化WiFi模块使用的接口和外设
  23.         Pcf8563_Gpio_Init();                                                                             //时钟芯片初始化
  24.        
  25.         Pcf8563_SetTime();                        //设置初始时间
  26.        
  27.         Key_GPIO_Config();                                                                        //按键初始化
  28.         OLED_Init();                                                                                                                        //初始化OLED  
  29.         OLED_Clear();                                                                                     //清屏

  30.        
  31.         BASIC_TIM_Init();

  32.         WIFI_Config_Show();
  33.        
  34.         printf ( "\r\nWecome!\r\n" );                    //打印测试例程提示信息

  35.   ESP8266_StaTcpClient_UnvarnishTest();     //建立TCP/IP连接
  36.        
  37.   while ( 1 );
  38.        
  39.        
  40. }


  41. /*********************************************END OF FILE**********************/
复制代码


0.png

全部资料51hei下载地址:
硬件-基于WiFi的网络授时时钟设计V1.0.7z (10.66 MB, 下载次数: 289)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:601774 发表于 2019-9-11 18:25 | 显示全部楼层
很棒啊,最近也想弄一个时钟,到实际弄的时候在请教下,收藏了
回复

使用道具 举报

ID:601774 发表于 2019-9-11 18:27 | 显示全部楼层
RTC那个电池是用法拉电容吗
回复

使用道具 举报

ID:601774 发表于 2019-9-11 18:33 | 显示全部楼层
WIFI能随意获取其他网页的时间吗,假如用在不是北京时间的地方能自动获取时间吗,比如拿去欧洲了,不是第八时区了,是否能自动校时
回复

使用道具 举报

ID:99570 发表于 2020-1-16 21:29 | 显示全部楼层
好东西,学习一下。买模块弄一个试试。
回复

使用道具 举报

ID:230666 发表于 2020-1-20 13:34 | 显示全部楼层
下载来学习一下 OLED 屏幕驱动 我的老是乱码
回复

使用道具 举报

ID:620291 发表于 2020-3-5 16:40 | 显示全部楼层
好东西,学习一下。买模块弄一个试试
回复

使用道具 举报

ID:119642 发表于 2020-4-7 22:14 | 显示全部楼层
挺喜欢这个的。非常不错
回复

使用道具 举报

ID:388929 发表于 2020-4-8 23:28 | 显示全部楼层
WIFI模块好,看到你这成品,我也想搞一个来学一下,谢谢你的分享,谢谢,我先打个MARK,买回来再来看看
回复

使用道具 举报

ID:451980 发表于 2020-7-16 14:34 | 显示全部楼层
ygsasd 发表于 2019-9-11 18:27
RTC那个电池是用法拉电容吗

对的, 实际就是大电容,它能储存电能,可以提供保存1-2月时间数据不丢失的电能
回复

使用道具 举报

ID:451980 发表于 2020-7-16 14:35 | 显示全部楼层
ygsasd 发表于 2019-9-11 18:33
WIFI能随意获取其他网页的时间吗,假如用在不是北京时间的地方能自动获取时间吗,比如拿去欧洲了,不是第八 ...

这个时间是从服务器API接口拿到的,只要API接口支持国外时间输出,那么就可以获取到,可能需要改动下代码
回复

使用道具 举报

ID:451980 发表于 2020-7-16 14:36 | 显示全部楼层
zrm0806 发表于 2020-1-20 13:34
下载来学习一下 OLED 屏幕驱动 我的老是乱码

OLED屏幕可以先用例程驱动试试,不行的话看看是不是I2C没加上拉电阻,或者是没有焊接好
回复

使用道具 举报

ID:300127 发表于 2020-10-19 08:03 | 显示全部楼层
下载来学习一下,谢谢你的分享
回复

使用道具 举报

ID:930143 发表于 2021-5-31 18:05 | 显示全部楼层
除了C语言和python外还需要什么编程语言吗?需要mqtt协议什么的吗?
回复

使用道具 举报

ID:671688 发表于 2023-3-28 18:33 | 显示全部楼层
好东西,正好需要做网络授时
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表