用8266学习单片机-7-数码管实现:网络时钟-NTPClient-取网络时间并用串口打印
程序员文章站
2024-02-25 21:35:51
...
简介
上一讲记录了学习多位数码管的显示,这次把它做成一个网络时钟吧
效果
NTPCLient
8266可以联网的啊,那从网络获取时间呗
项目-加载库-管理库,安装NTPClient库,然后打开 文件-示例-NTPClient-Advance
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "wifi名称";
const char *password = "wifi密码";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
timeClient.begin();
timeClient.setTimeOffset(8*60*60);
}
void loop() {
timeClient.update();
Serial.println(timeClient.getFormattedTime());
delay(1000);
}
上传之后连接热点你会发现,串口显示出的时间和现在的有误差???还不是几分钟,而是几个小时。
把setup上面的服务器换成国区的也不行哇
NTPClient timeClient(ntpUDP, "cn.pool.ntp.org", 3600, 60000);
时间修正
那怎么办呢????其实作者早就想好了,假设我的时间比串口打印出来的时间快了八小时,只要在setup中设置一下误差偏移量就好了
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 )
Serial.print ( "." );
}
timeClient.setTimeOffset(8*60*60); //单位为秒,误差八小时
timeClient.begin();
}
数码管
既然能获取时间了,那肯定要将时间显示在数码管上哇,我这里只有两个好的数码管,就只显示分钟数啦
/*
* 两位共阳数码管显示时间
* 2、3端口接3.3V,a~g各端口为负逻辑,0低电平为亮,1为灭
*/
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "Kearney";
const char *password = "shuaisile";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
int a= D10;
int b= D0;
int c= D7;
int d= D6;
int e= D5;
int f= D2;
int g= D1;
int delayTime = 10; //延迟时间ms
int led1 = D4; //GPIO2
int led2 = D9; //GPIO3,最低点位还是0.3V,不过测试后发现能控制LED
int light[10][8] = {
//a b c d e f g dp
{0, 0, 0, 0, 0, 0, 1, 1},
{1, 0, 0, 1, 1, 1, 1, 1},
{0, 0, 1, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 1, 1, 0, 1},
{1, 0, 0, 1, 1, 0, 0, 1},
{0, 1, 0, 0, 1, 0, 0, 1},
{0, 1, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 1, 0, 0, 1},
};
void lightControl(int i){
//i只能取0~9
digitalWrite(a,light[i][0]);
digitalWrite(b,light[i][1]);
digitalWrite(c,light[i][2]);
digitalWrite(d,light[i][3]);
digitalWrite(e,light[i][4]);
digitalWrite(f,light[i][5]);
digitalWrite(g,light[i][6]);
delay(delayTime); //不延时也是可以的,但是变化比较快
}
void digitalControl(int A,int B){
static int i = 0; //没有static就一直是0
if(i%2==0)
{
digitalWrite(led1,1);
digitalWrite(led2,0);
lightControl(A);
}
else
{
digitalWrite(led1,0);
digitalWrite(led2,1);
lightControl(B);
}
i++;
i = i %2;
}
void setup() {
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
}
timeClient.begin();
timeClient.setTimeOffset(8*60*60);
}
static int minu = 0;
void loop() {
timeClient.update();
minu = timeClient.getMinutes();
digitalControl(minu/10,minu%10);
}
其实两位数码管也是可以显示时分秒的,点赞留言私信再说,今天写类了。。
参考
- https://blog.csdn.net/weixin_43031092/article/details/106799687
- https://github.com/arduino-libraries/NTPClient/blob/master/NTPClient.h
- https://blog.csdn.net/Cloud_1234_5678/article/details/84346087
- https://blog.csdn.net/yannanxiu/article/details/51273684
上一篇: js(十四)---事件机制
下一篇: Java经理与员工的差异实现方法