ESP8266及数码管的网络时钟

        ESP822芯片是一款既可以当做服务器又可以被当做客户端的开发板。当选择ESP8266作为客户端时,可以连接WIFI进行网络请求。当网络配置好以后可以使用https请求,对相关的API进行请求。

        先展示一下结果:

ESP8266及数码管的网络时钟_第1张图片

 如上图显示即为12月15日22时41分

        第一步:驱动数码管

1.八位数码管是通过两片595芯片级联控制的共阳极数码管,电路图如下。

ESP8266及数码管的网络时钟_第2张图片

 八位数码管对应八位,当每一位写入高电平时,就相当于选择了对应的数码管点亮。当速度足够快时,人的肉眼就不会分辨出闪烁的效果。比如说 0000 0001 就是选择最右边的数码管显示数字。当选中位选以后再进行八位的段选,也就是说控制数码管显示什么数字。每位数码管实质是由八个led灯组成。因为是共阳极数码管,因此写入低电平时led会点亮。比如说:写入 1001 1111 数码管就会显示数字 “1”。当写入 0000 0001 1001 1111 时就会出现最右边数码管点亮且显示数字“1”的现象。至于数码管到底是怎么工作的以及数码管怎么显示对应的数字,并不是本文章的重点,建议百度可以知道的更加详细。

        代码如下:

//595数码管模块
void DTSMG(u16 buff)
{
  int i;
  digitalWrite(4,LOW);//拉低电平
  for(i=0;i<=15;i++) //循环将16位二进制数写入两片级联的595中
  {
    digitalWrite(5,LOW);//拉低电平
    if(((buff>>i)&0x0001)==0) { digitalWrite(16,LOW);}//DIO 待扫描引脚为低电平
    else if(((buff>>i)&0x0001)==1) { digitalWrite(16,HIGH);}//待扫描引脚为高电平
    for(int j=0;j<1000;j++);
    digitalWrite(5,HIGH);//将二进制信息移位送入595
    
  }
  for(int j=0;j<1000;j++);
  digitalWrite(4,HIGH);//将16位二进制信息通过595持续输出
}

以上便为数码管控制代码。

以下即为ESP8266作为客户端访问API的代码

#include 
#include  
#include 

#define ssid     "12345678"       //这里的12345678改为自己的WiFi名称 
#define password "12345678"       //这里的12345678改为自己的WiFi密码
//测试HTTPS通讯的网站
const char *host = "***********";  //这里更换为需要访问的域名
const int httpsPort = 443;  //HTTPS请求的端口443
char *ch3;/ /用于存放时间数据数据
int ad[8];
int x;
int h=0;

//数码管数据即 0,1,2,3,4,5,6,7,8,9
u16 shujubao[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19};

  void setup() {
  Serial.begin(9600);    //设置波特率
  WiFi.mode(WIFI_STA);    //设置ESP8266为无线终端工作模式
  WiFi.begin(ssid, password); //连接目标WiFi
  Serial.println("");
  Serial.println("Connecting"); Serial.println("");// 等待连接
  while (WiFi.status() != WL_CONNECTED) {   //WiFi.status() != WL_CONNECTED判断是否连接成功
    delay(500);   //延时
    Serial.print(".");  //没连接成功时循环输出“.”
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); //成功连接后通过串口监视器显示WiFi名称以及ESP8266的IP地址。
  //此处为配置ESP8266相关的三个引脚
  pinMode(4,OUTPUT);//D2   RCL
  pinMode(5,OUTPUT);//D1   SCL
  pinMode(16,OUTPUT);//D0
}

//{"sysTime2":"2021-12-26 13:58:02","sysTime1":"20211226135802"}
//以上为实际请求回来的数据,需要提取的有效信息为第50位至第57位

void fang()
{
   https_connect(); // 实现HTTPS访问通讯
  for(int i=50;i<=57;i++)//循环使用switch语句实现类型转换,将有用信息转换为int类型
  {
switch(ch3[i])
{
case '0' : ad[i-50]=0;break;
case '1' : ad[i-50]=1;break;
case '2' : ad[i-50]=2;break;
case '3' : ad[i-50]=3;break;
case '4' : ad[i-50]=4;break;
case '5' : ad[i-50]=5;break;
case '6' : ad[i-50]=6;break;
case '7' : ad[i-50]=7;break;
case '8' : ad[i-50]=8;break;
case '9' : ad[i-50]=9;break;
}
  } 
  
}

//此处为一直循环显示数码管的部分
void loop()
{
  
   if(h==9999){
   //调用请求函数
   fang();
   h=0;
   }
   h++;
   //1  0000 0001  1001 1111 
    DTSMG((0x01<<8)+shujubao[ad[0]]);
    for(int j=0;j<1000;j++);//此处为延时
    //2  0000 0010  0010 0101
    DTSMG((0x02<<8)+shujubao[ad[1]]);
    for(int j=0;j<1000;j++);
    //3  0000 0100  0000 1101
    DTSMG((0x04<<8)+shujubao[ad[2]]);
   for(int j=0;j<1000;j++);
    //4  0000 1000  1001 1001
    DTSMG((0x08<<8)+shujubao[ad[3]]);
    for(int j=0;j<1000;j++);
    //5  0001 0000  0100 1001
    DTSMG((0x10<<8)+shujubao[ad[4]]);
    for(int j=0;j<1000;j++);
    //6  0010 0000  0100 0001
    DTSMG((0x20<<8)+shujubao[ad[5]]);
    for(int j=0;j<1000;j++);
    //7  0100 0000  0001 1111
    DTSMG((0x40<<8)+shujubao[ad[6]]);
    for(int j=0;j<1000;j++);
    //8  1000 0000  0000 0001
    DTSMG((0x80<<8)+shujubao[ad[7]]);
    for(int j=0;j<1000;j++);
   
}

//数码管模块
void DTSMG(u16 buff)
{
  int i;
  digitalWrite(4,LOW);
  for(i=0;i<=15;i++)
  {
    digitalWrite(5,LOW);
    if(((buff>>i)&0x0001)==0) { digitalWrite(16,LOW);}//DIO
    else if(((buff>>i)&0x0001)==1) { digitalWrite(16,HIGH);}
    for(int j=0;j<1000;j++);
    digitalWrite(5,HIGH);
    
  }
  for(int j=0;j<1000;j++);
  digitalWrite(4,HIGH);
}



//网络调取API函数
void https_connect()
{
  //建立WiFiClientSecure对象
  WiFiClientSecure httpsClient;
  //串口监视器显示域名    
  Serial.println(host);
  //无验证方式连接     
  httpsClient.setInsecure();
  //用来判断是否连接超时
  httpsClient.setTimeout(15000);  
  delay(1000);    //延时
  Serial.println("HTTPS Connecting");
  Serial.println("");
  int r=0;  
  while((!httpsClient.connect(host,httpsPort)) && (r < 300))
  { 
    // 尝试连接服务器并等待
    delay(100);         //httpsClient.connect(host,httpsPort)用于连接到服务器
    Serial.print(".");
    r++;
  }
  if(r==30)
  {        
    // 连接超时后输出"连接失败"信息并返回
    Serial.println("Connection failed");
    Serial.println(httpsClient.getLastSSLError());
    return;
  } 
  else 
  { 
    Serial.println("Connected...");// 连接成功则输出“连接成功”信息
  }
  // 建立HTTPS请求信息字符串
  //此处的************应更换为自己需要访问的API地址
  String request =  String("GET ")+"************"+" HTTP/1.1\r\n" +  //请求行
                 "Host: " + host + "\r\n" +   //请求头
                 "connection: close\r\n"+"\r\n";
  //  向服务器发送请求
  httpsClient.print(request); 
  Serial.println("request sent");
  // 告知用户当前ESP8266已经成功接收服务器响应头信息。
  while (httpsClient.connected())
  {
    // 检查服务器响应信息。一旦查到响应头结束字符,则通过串口监视器告知ESP8266已经成功接收服务器响应头信息。
    String line = httpsClient.readStringUntil('\n'); //获取响应头信息
    //串口监视器显示响应头信息
    if (line == "\r")
    {   
      //判断头是否结束
      Serial.println("headers received");
      break;
    }
  }
  // 通过串口监视器输出服务器响应体信息(服务器报文)
  Serial.println("响应体:");
  String body;
  while(httpsClient.available())
  {        
    body= httpsClient.readStringUntil('}');    //获取响应体信息
    //此处为强制类型转换
    char *ch2 = const_cast(body.c_str());
     Serial.println(body);
    ch3= ch2;
  }
  httpsClient.stop(); //操作结束,断开服务器连接
  Serial.println("closing connection");  
}




        以上代码中有一些需要注意的地方

        1、首先要更更改WiFi名称与wifi密码

        2、需要更改域名地址

        3、需要更改api请求地址

        具体网络中可以请求的有关时间请求的网络API可以百度搜索

        本文使用的有关esp8266作为客户端https请求的知识学习自“太极创客”。第一次写博客,不是很会,望各位大佬雅正。

你可能感兴趣的:(ESP8266,点亮数码管,单片机的数字网络时钟,c语言,arduino)