硬件
esp8266 01s
arduino uno
TM1637 4位数码管
软件
Arduino IDE
使用NTP服务需要先安装 NTPClient 库,按组合件 Crtrl + Shift + I 调出库管理 具体操作如下所示:
NTP 服务 简介
NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。esp8266也可以通过建立与NTP服务的连接,来获取实时时间。
在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要求就非常地高,是按照A这台计算机的时间,还是按照B这台计算机的时间?NTP就是用来解决这个问题的,NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
NTPClient 库的安装
使用NTP服务需要先安装 NTPClient 库,按组合件 Crtrl + Shift + I 调出库管理 具体操作如下所示:
接线
ESP8266 Arduino UNO
3V3 3.3V
GND GND
RX D2
TX D3
数码管 Arduino UNO
VCC 5V
GND GND
CLK D11
DIO D12
ESP8266获取时间
#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>
const char *ssid = "test";
const char *password = "12345678";
WiFiUDP ntpUDP;
// You can specify the time server pool and the offset (in seconds, can be
// changed later with setTimeOffset() ). Additionaly you can specify the
// update interval (in milliseconds, can be changed using setUpdateInterval() ).
NTPClient timeClient(ntpUDP,"ntp1.aliyun.com",60*60*8,30*60*1000);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
}
void loop() {
timeClient.update();
Serial.println(timeClient.getFormattedTime());
delay(1000);
}
配置WiFi密码和名字
需要设置路由器的密码(Password)和名称(SSID)这样才可以esp8266才可以上网,具体操作如下:
… …
const char ssid = “602”; // 路由器名称
const char password = “602602602”; // 路由器密码
… …
校准时区
校准时区 由于全球的时间是不同的,所以需要校准时间,以北京时间为例,在创建实例的时候,见校准参数传入即可,具体操作如下: NTPClient
timeClient(ntpUDP, “ntp1.aliyun.com”,60608, 30601000);
Arduino UNO
#include <TM1637.h>
// 数码管 配置引脚
#define CLK 11 //!参数 clk -数字引脚连接到模块的时钟引脚数
#define DIO 12//!参数 dio -数字引脚连接到模块的DIO引脚数
TM1637 TM(CLK, DIO);//!初始化一个TM1637对象,设置时钟和数据引脚。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);//RX=2,TX=3
String comdata="";
void setup() {
// put your setup code here, to run once:
mySerial.begin(115200);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
while(mySerial.available()){
comdata += char(mySerial.read()); //每次读一个char字符,并相加
delay(2);
}
if (comdata.length() > 0){
String h=comdata.substring(0,2);
String m=comdata.substring(3,5);
int hour_=h.toInt();
int minture_=m.toInt();
TM.DNum(hour_,minture_,true);//显示双数字,左边两位显示num1最后两位;左边两位显示num2最后两位;piont 是否显示中间的两点
TM.show(true);//设置数码管显示 为真显示,否则不显示
// Serial.println(minture_);
comdata="";
}
}