用8266学习单片机-7-数码管实现:网络时钟-NTPClient-取网络时间并用串口打印

简介

上一讲记录了学习多位数码管的显示,这次把它做成一个网络时钟吧

效果

在这里插入图片描述

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
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值