ESP822芯片是一款既可以当做服务器又可以被当做客户端的开发板。当选择ESP8266作为客户端时,可以连接WIFI进行网络请求。当网络配置好以后可以使用https请求,对相关的API进行请求。
先展示一下结果:
如上图显示即为12月15日22时41分
第一步:驱动数码管
1.八位数码管是通过两片595芯片级联控制的共阳极数码管,电路图如下。
八位数码管对应八位,当每一位写入高电平时,就相当于选择了对应的数码管点亮。当速度足够快时,人的肉眼就不会分辨出闪烁的效果。比如说 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请求的知识学习自“太极创客”。第一次写博客,不是很会,望各位大佬雅正。