资讯专栏INFORMATION COLUMN

STM32F4+ESP8266拟辉光钟设计(一)简介及时间获取

番茄西红柿 / 3024人阅读

摘要:在搜索了一些资料后我把我的工作分成了两个部分第一个部分就是时间的获取第二个部分是灯光的控制。模块联网的方式是通过其与分别与串口的端和端相连通过串口通信发送指令来控制实现联网。通过了解我发现可以通过芯片内部的时钟来实现时间的自走功能。

0 效果

话不多说,先来看看最后实现的效果(从左到右分别为时、分、秒,当时设计的时候忘了设计中间的冒号了
-_-):


画了PCB,请朋友帮忙画了solidworks打印出来框架,然后买螺丝进行拼装。

1 简介

某天逛某宝的时候突然发现了拟辉光钟,当时就觉得挺好看的,但一看价格就直接劝退了(这里放了两张价格)
于是我产生了自己动手做的想法。现在网上搜了一下拟辉光钟的工作原理:

拟辉光钟是利用光线在亚克力板上的划痕处产生光线折射,使得划痕处的光线较亮,配置以随时间而变的灯光,达到类似于辉光钟的效果。

在搜索了一些资料后,我把我的工作分成了两个部分,第一个部分就是时间的获取,第二个部分是灯光的控制。下面主要就这两个大的模块介绍下具体怎么实现的。

拟辉光钟
时间获取
灯光控制

2 STM32F4+ESP8266获取网络时间

我之前的项目中一直在用STM32,比较熟悉,所以这次依然使用了STM32作为主控板。获取时间的大体思路是利用ESP8266WIFI模块能够连网的功能,在上电后能够通过MCU控制ESP8266连接到网络并发送相应的API请求,获得当前时间,之后把当前时间赋值到RTC时钟,实现自走的功能。

2.1 ESP8266的联网和API请求

首先先简要介绍一下ESP8266模块,在安可信官网上有此模块的详细介绍,这里放一个链接:
安可信,在它用户文档里对该模块的介绍是这样的:

ESP8266是一款超低功耗的UART-WiFi 透传模块,拥有业内极富竞争力的封装尺寸和超低能耗技术,专为移动设备和物联网应用设计,可将用户的物理设备连接到Wi-Fi 无线网络上,进行互联网或局域网通信,实现联网功能。

此模块拥有独立控制能力,可以作为主控芯片使用,也可以作为其他控制器的联网芯片,使主控制器拥有联网功能。
模块联网的方式是通过其RXDTXD分别与串口的TX端和RX端相连,通过串口通信发送AT指令来控制ESP8266实现联网。有关模块的STA、AP、STA+AP模式还有AT指令集可以参考以下链接:
ESP8266 AT指令集https://blog.csdn.net/qq_45104817/article/details/105834987
模块教程:https://blog.csdn.net/mbs520/article/details/109572070
在本项目通过使用STM32上的USART6给8266发送以下的AT指令实现了联网功能:

1.设置工作模式:

AT+CWMODE=1 //设置模式,1为STA模式(从机)

2.重启: 重启可以保证模式能够转换成功

AT+RST

3.联网:(在这里遇到了一个小问题,就是我在学校连校园网的话需要通过用户认证,但单纯的用这个指令不能联网成功。网上说可以通过串口发送响应的完成认证的请求头,但后来我通过笔记本连网后再开热点解决了):

AT+CWJAP="name","password" //name为你想连的WIFI名称,password为你的WIFI密码

4.设置连接方式 只有将连接方式设置为单路连接才能启用TCP/IP

AT+CIPMUX=0

TCP/IP是一种网络通信协议,可以理解为设备连接到目标网络后,通过这个特有的双方都理解的语言才可以实现数据通信,详细的介绍可以参考:https://zhuanlan.zhihu.com/p/33889997
5.连接到目标站点 第4步设置了单路连接,现在就可以启用TCP连接到API站点获取数据了!

AT+CIPSTART="TCP","quan.suning.com",80 //协议形式;站点IP或网址;端口号(指定一个没有被占用的即可)

这里quan.suning.com即为我们要用的API,连接到该网络后,可以通过发送标准形式的请求头来获取当前时间。
6.开启透传 开启透传模式,为传送报头做准备

AT+CIPMODE=1

7.发送报头,接收数据

res=esp8266_send_data("GET http://quan.suning.com/getSysTime.do HTTP/1.1/r/nHost: quan.suning.com/r/n/r/n",50);

返回来的数据如下:

receive:HTTP/1.1 200 OKDate: Sat, 16 Oct 2021 10:31:07 GMTContent-Type: text/html;charset=UTF-8Content-Length: 62Connection: keep-aliveServer: styxSet-Cookie: tradeLdc=NJGX_YG;Expires=Sat, 16-Oct-21 22:31:07 GMTStrict-Transport-Security: max-age=300Cache-Control: no-cache,no-store,max-age=0,s-maxage=0Access-Control-Allow-Credentials: trueX-Ser: BC98_dx-lt-yd-jiangsu-zhenjiang-3-cache-16, BC204_lt-shanxi-taiyuan-6-cache-4X-Cache: MISS from BC204_lt-shanxi-taiyuan-6-cache-4(baishan){"sysTime2":"2021-10-16 18:31:07","sysTime1":"20211016183107"}

我们的主要目的是获取当前时间,所以返回来的数据中大部分是没有用的,通过观察发现我们只需要提取出“sysTime2”后面跟的时间即可,所以我们需要一些算法来把时间提取出来。我的思路就是先通过字符串查找函数strstr找到"sysTime2"所在位置的指针,再根据时、分、秒相对于指针的偏移量依次把数据提取出来,这里我把我的代码放在下面,当然大家也可以设置更加高效的算法:

#define HOURS_ADD_DRES 22  //小时相对于data_pt指针的偏移量是22char *data_pt=NULL;	while(!data_pt){	res=esp8266_send_data("GET http://quan.suning.com/getSysTime.do HTTP/1.1/r/nHost: quan.suning.com/r/n/r/n",50);	data_pt = strstr((const char *) res,(const char *)"sysTime2");//在返回数据中找sysTime2	}	printf("GET TIME SUCCESS!/r/n");//如果找到了,data_pt非空,退出循环,获取时间成功	int k=0;	char time[10];  	char *hour_string;//存放时间的字符串	int hour,second,minute=0;    hour_string = data_pt + HOURS_ADD_DRES;  //hour_string指针指向时-分-秒时间的小时位第一位,精准锁定	for(i=0;i<=7;i++)//把各位的数据提取出来	{		time[k]=*hour_string;	  hour_string++;k++;	}	time[8]='/0';	hour=(time[0]-48)*10+(time[1]-48);	minute=(time[3]-48)*10+(time[4]-48);	second=(time[6]-48)*10+(time[7]-48);//ASCII码转换成数字,方便后续	printf("time:%s",time);//把当前获取到的时间打印到串口

可以看到串口输出了正确的值,获取时间成功了!

2.2 RTC时钟的设置

在这之前我们已经通过ESP8266联网实现了当前时间的获取,但如此这样一直获取时间显然是不现实的,一方面每次发送请求有一定的失败概率,如果获取时间失败那么时间的显示就会不连续。另一方面网站面临多次重复的请求会对你的IP地址进行屏蔽来防止恶意攻击。此外如此频繁的请求也会消耗太多的资源放在请求上,导致程序的效率不高。通过了解我发现可以通过芯片内部的RTC时钟来实现时间的自走功能。
有关RTC时钟的具体实现与详解可以参考这篇RCT详解
通过配置RTC,将ESP8266模块获取的时间写入RTC,之后可以利用RTC的秒中断或者根据RTC的计数器变动来刷新当前时间值,在灯光上进行不同的显示。

RTC_Set_Time(hour,minute,second,1);

此代码实现了随着时间的变化刷新显示,同时,也可以采用秒中断的方法(后者更加精确

	RTC_TimeTypeDef RTC_TimeTypeInitStructure;	RTC_GetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure);	flags0=RTC_TimeTypeInitStructure.RTC_Seconds%10;	flags1=RTC_TimeTypeInitStructure.RTC_Seconds/10;			flagm0=RTC_TimeTypeInitStructure.RTC_Minutes%10;	flagm1=RTC_TimeTypeInitStructure.RTC_Minutes/10;		flagh0=RTC_TimeTypeInitStructure.RTC_Hours%10;	flagh1=RTC_TimeTypeInitStructure.RTC_Hours/10;		if(flags0!=befores0){		ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Seconds%10,5,1);		befores0=flags0;}	if(flags1!=befores1){		ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Seconds/10,4,0);		befores1=flags1;}		if(flagm0!=beforem0){		ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Minutes%10,3,1);		beforem0=flagm0;}	if(flagm1!=beforem1){		ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Minutes/10,2,0);		beforem1=flagm1;}		if(flagh0!=beforeh0){		ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Hours%10,1,1);		beforeh0=flagh0;}	if(flagh1!=beforeh1){		ws281x_showNum(RTC_TimeTypeInitStructure.RTC_Hours/10,0,0);		beforeh1=flagh1;}

在下一篇文章中会具体介绍灯光控制模块!谢谢大家的支持!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125319.html

相关文章

  • 基于STM32平台的数字温度显示器系统设计

    摘要:带中文字库的是一种具有位位并行线或线串行多种接口方式,内部含有国标一级二级简体中文字库的点阵图形液晶显示模块其显示分辨率为。贴片按键模块支持标准的协议,完整的协议栈。以最低成本提供最大实用性,为功能嵌入其他系统提供无限可能。 项目简介 开发环境: Keil5.14,CubeMX6.0.1,主...

    villainhr 评论0 收藏0
  • 基于STM32ESP8266 WIFI与ONENET通信连接(2),云平台以手机APP数据显示

    摘要:基于的与通信连接,实现温湿度数据互传,控制第一步,在实现将传感器数据采集之后,并且完成配网步骤,可以正常通过模块正常将数据发送到云平台之后进行以下阅读,上述内容可以跳转到以下链接进行查看具体操作。 ...

    antz 评论0 收藏0
  • 01.ESP8266开发方式知多少

    摘要:开发方式是乐鑫为开发者提供的物联应开发平台,包括基础平台以及上层应开发示例,如智能灯智能开关等。指令开发方式作为芯片,指令开发也是必不可少的。开发方式即,意为运行在单片机上的。 ...

    sushi 评论0 收藏0
  • stm32f373利用esp8266连接onenet平台

    摘要:添加设备名和鉴权信息。记录如下数据二引脚连接和接电源接地和连接至配置的串口三代码编写串口配置单片机需配置两个串口,串口打印至串口助手,显示连接状态。串口用来发送信息至串口配置代码如下系列配置和系列配置不同点在于口上拉和推挽配置略有不同。 ...

    sorra 评论0 收藏0
  • 2021-09-04

    摘要:使用实现连网实现巴法云物联网使用硬件程序思路基于正点原子的测试程序在巴法云物联网创建的主题初始化代码比较简陋主函数代码如果想用串口助手调试,接线方法如下使用硬件我这里使用的是正点原子家的开发板精英版和模块。 ...

    Zack 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<