硬件
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=3String 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="";}}
