赞
踩
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 <ESP8266WiFi.h>
- #include <WiFiClientSecure.h>
- #include <ESP8266WebServer.h>
-
- #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<char*>(body.c_str());
- Serial.println(body);
- ch3= ch2;
- }
- httpsClient.stop(); //操作结束,断开服务器连接
- Serial.println("closing connection");
- }
-
-
-
-
以上代码中有一些需要注意的地方
1、首先要更更改WiFi名称与wifi密码
2、需要更改域名地址
3、需要更改api请求地址
具体网络中可以请求的有关时间请求的网络API可以百度搜索
本文使用的有关esp8266作为客户端https请求的知识学习自“太极创客”。第一次写博客,不是很会,望各位大佬雅正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。