欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-25 21:35:51
...

简介

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

效果

用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
相关标签: Node MCU