arduino + esp8266_01s + TM1637做一个WiFi时钟

news/2025/3/29 10:47:37/

看了很多的wifi时钟,于是就做了一个掌上的mini时钟,我没有安装esp8266的库文件和板级支持包,所以就打算直接用at指令来访问服务器,并从接收到的数据中获取当前时间。经测量大概3天误差在±10毫秒以内,然后系统每24小时自动进行校准时间,减少误差。最终效果还算理想。

硬件部分:

  1. arduino nano :体型较小,比较便宜
  2. esp8266_01s :01s相对于01在接线上可以不用把EN接高电平
  3. TM1637 :与其它四位数码管相比使用I2c接口,所需引脚大量减少
  4. usb转ttl:用于wifi模块的调试

软件:

1.arduino IDE
2.需要安装TM1637库文件
3.我并未安装arduino上的esp8266库文件,因此wifi模块使用at指令来进行调试的,具体操作在下面展示

库安装

打开arduino IDE再按快捷键 Crtrl + Shift + I 调出库管理,再
在输入栏上写上TM1637,点击安装。
在这里插入图片描述

连线部分

esp8266_01sarduino
3.3v3.3v
GNDGND
RXTX
TXRX
TM1637arduino
3.3v3.3v
GNDGND
CLK11
DIO12

AT指令调试:

wifi模块接上usb转ttl,打开串口调试助手输入:
AT 若返回“ok”则表示能正常通讯,然后依次输入以下代码
(输出时在最后加上回车换行):
AT+CWMODE=3 配置成 AP+STA模式
AT+RST 重启生效
AT+CIFSR 查询设备IP
AT+CWJAP=“ssid”,“password” 连接你手机的热点“ssid”为热点的名称,"password"为密码。
AT+CIPSTART=“TCP”,“183.230.40.33”,80l连接的服务器ip 183.230.40.33/80
AT+CIPMODE=1开启透传模式
AT+CIPSEND开始透传

现在wifi模块就已经连上服务端了,这时我们在串口随便发送任意字符,都会收到服务器返回给我们的信息,这时只要把里面的时间给读取出来就行了。
在这里插入图片描述
这里我发送了一个’A’,服务器给我返回了带有时间的消息包。但这里的时间是美国时间,所以需要在小时上加个8小时的时差就行了。

wifi模块上电自动连接到服务器

如果我们想把wifi模块给配置好
AT+SAVETRANSLINK=1,“183.230.40.33”,80,“TCP”,100开机自动连接并进入透传。

输入这行命令这样就不用每次上电都重新发送AT指令了。

esp8266_01s获取时间

String receive = "";    //读取串口收到的字符
char info[380] = {0};   //char* 类型临时接收缓冲区
int hour_shi;
int hour_ge;
int min_shi;
int min_ge;
int sec_shi;
int sec_ge;void setup() {Serial.begin(115200); //初始化WIFI串口Serial.print("a");delay(1000);//等待连接  while (Serial.available() > 0){receive += char(Serial.read());//将串口读取的值存到字符串receive中delay(2);}strcpy(info, receive.c_str()); //String转换成char*Serial.println(info);char ret[10] = {0};  //时间存入缓冲区strncpy( ret, strstr(info, "GMT") - 9, 9 ); //将字符“GMT”前的9个字符放到ret字符数组中hour_shi = ret[0] - '0';hour_ge = ret[1] - '0';min_shi = ret[3] - '0';min_ge = ret[4] - '0';sec_shi = ret[6] - '0';sec_ge = ret[7] - '0';hour_ge += 8;//时差处理,在小时上加8,返回北京时间if(hour_ge>10){if(hour_shi==0){hour_ge = hour_ge%10;hour_shi = 1;}else//(hour_shi==1){hour_ge = hour_ge % 10;hour_shi = 2;if(hour_ge>4){hour_ge -= 4;hour_shi = 0;}}}else{hour_ge = hour_ge % 10;if(hour_shi==0){hour_shi = 1;}else{hour_shi = 2;}}Serial.print(hour_shi);//串口打印获取的时间Serial.print(hour_ge);Serial.print(":");Serial.print(min_shi);Serial.print(min_ge);Serial.print(":");Serial.print(sec_shi);Serial.println(sec_ge);delay(1000);
}
void loop()
{}

运行成功后

使用millis()函数,使程序不断进行时间累加

unsigned long time;
int hour_shi;
int hour_ge;
int min_shi;
int min_ge;
int sec_shi;
int sec_ge;void showTime(unsigned long t);
void(*restart)(void) = 0; //软重启
void adjustTime(long sec = 0);void setup() {Serial.begin(115200);
}void loop() {time = millis();//返回开始运行当前程序时的毫秒数。这个数字在大约50天后溢出,即回到零。 showTime(time/1000); adjustTime(); //默认不校对 否则sec秒校对一次时间(一天进行一次校准(86400))
}void showTime(unsigned long t)
{//网络时间矫正精确到秒t += (sec_shi*10 + sec_ge + 1); //把格式全部转换成分钟unsigned long sum_min = t/60 + ((hour_shi*10 + hour_ge)*60 + (min_shi*10 + min_ge));unsigned long temp_hour = sum_min/60%24;unsigned long temp_min = sum_min%60;unsigned long temp_sec = t%60;int h_0 = temp_hour/10;int h_1 = temp_hour%10;int m_2 = temp_min/10;int m_3 = temp_min%10;Serial.print(h_0);Serial.print(h_1);Serial.print(":");Serial.print(m_2);Serial.print(m_3);Serial.print(":");Serial.print(temp_sec/10);Serial.println(temp_sec%10);
}void adjustTime(long sec)
{if (sec != 0 && time/1000 > sec) //0表示不校对 否则sec秒校对一次 restart();  //校对时间(重启)
}

在将代码进行整合,就完成大部分了
在这里插入图片描述

最后把TM1637的代码在加入最后进行整合就大功告成了

在这里插入图片描述
最后再准备用新买的3D打印机给时钟做个外壳就完成了

后面我会陆续发布我做的一些好玩的东西,如果感兴趣的话可以关注一波!

完整文件和代码 提取码:klhk
未经许可请不要转载


http://www.ppmy.cn/news/153590.html

相关文章

WIFI无线网络技术详细分析

WIFI无线网络在无线局域网的范畴是指“无线相容性认证”,实质上是一种商业认证,同时也是一种无线联网技术,以前通过网线连接电脑,而无线保真则是通过无线电波来连网;常见的就是一个无线路由器,那么在这个无线路由器的电…

php页面链接无线网络,Wifi无线网络连接工作概念

无线电信号: 无线电信号是密钥,这使得WiFi联网成为可能。从Wi-Fi天线发射这些无线电信号被WiFi接收器接收,如配备了无线网络卡的计算机和手机。无论何时,一个计算机接收到任何一个无线网络,通常信号 300 - 500英尺天线…

wifi应用领域

应用领域 网络媒体 由于无线网络的频段在世界范围内是无需任何电信运营执照的,因此WLAN无线设备提供了一个世界范围内可以使用的,费用极其低廉且数据带宽极高的无线空中接口。用户可以在Wi-Fi覆盖区域内快速浏览网页,随时随地接听拨打电话。而…

校园网如何用路由器开WiFi

本文虽不是首创,但也可以说是全网最清楚有效的教程,本文主要针对非网络专业学生而写,因此写得会非常详细。 第一步 首先准备一台电脑,一部手机,手机安装掌上大学(各个地域说法不一样,用你们能登…

【数据分享】1929-2022年全球站点的逐日最高气温(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2022年全球气象站…

Linux命令行如何查看cpu(lm_sensors)和显卡温度(nvidia-smi)

Linux命令行如何查看cpu和显卡温度 lm_sensors,是一款基于linux系统的硬件监控的软件。可以监控主板,CPU的工作电压,温度等数据。 实际上sensors命令只是读取了/sys/class/hwmon/目录下关于CPU等传感器温度参数并直观的展示给我们&#xff…

Ubuntu下监控CPU 、显卡、硬盘的温度

转载文章,仅供参考,感谢分享。 原文链接: 桌面应用|如何在 Ubuntu 中检查笔记本 CPU 的温度 (linux.cn)https://linux.cn/article-5682-1.htmllinuxprobe网站链接: Ubuntu环境下检查CPU 的温度 | 《Linux就该这么学》 (linuxpr…

【Python】监控GPU温度

因为疫情卡在宿舍,无奈笔记本灰太多缺少清灰工具,电脑散热太拉,开着cad一天之后经常蓝屏:( 因此借鉴该网站资料:Python使用pynvml查看GPU信息,写了一份监控电脑gpu的温度的小程序,在此做为摸鱼…