当前位置:   article > 正文

ESP8266及数码管的网络时钟

ESP8266及数码管的网络时钟

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

        先展示一下结果:

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

        第一步:驱动数码管

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

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

        代码如下:

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

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

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

  1. #include <ESP8266WiFi.h>
  2. #include <WiFiClientSecure.h>
  3. #include <ESP8266WebServer.h>
  4. #define ssid "12345678" //这里的12345678改为自己的WiFi名称
  5. #define password "12345678" //这里的12345678改为自己的WiFi密码
  6. //测试HTTPS通讯的网站
  7. const char *host = "***********"; //这里更换为需要访问的域名
  8. const int httpsPort = 443; //HTTPS请求的端口443
  9. char *ch3;/ /用于存放时间数据数据
  10. int ad[8];
  11. int x;
  12. int h=0;
  13. //数码管数据即 0,1,2,3,4,5,6,7,8,9
  14. u16 shujubao[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19};
  15. void setup() {
  16. Serial.begin(9600); //设置波特率
  17. WiFi.mode(WIFI_STA); //设置ESP8266为无线终端工作模式
  18. WiFi.begin(ssid, password); //连接目标WiFi
  19. Serial.println("");
  20. Serial.println("Connecting"); Serial.println("");// 等待连接
  21. while (WiFi.status() != WL_CONNECTED) { //WiFi.status() != WL_CONNECTED判断是否连接成功
  22. delay(500); //延时
  23. Serial.print("."); //没连接成功时循环输出“.”
  24. }
  25. Serial.println("");
  26. Serial.print("Connected to ");
  27. Serial.println(ssid);
  28. Serial.print("IP address: ");
  29. Serial.println(WiFi.localIP()); //成功连接后通过串口监视器显示WiFi名称以及ESP8266的IP地址。
  30. //此处为配置ESP8266相关的三个引脚
  31. pinMode(4,OUTPUT);//D2 RCL
  32. pinMode(5,OUTPUT);//D1 SCL
  33. pinMode(16,OUTPUT);//D0
  34. }
  35. //{"sysTime2":"2021-12-26 13:58:02","sysTime1":"20211226135802"}
  36. //以上为实际请求回来的数据,需要提取的有效信息为第50位至第57
  37. void fang()
  38. {
  39. https_connect(); // 实现HTTPS访问通讯
  40. for(int i=50;i<=57;i++)//循环使用switch语句实现类型转换,将有用信息转换为int类型
  41. {
  42. switch(ch3[i])
  43. {
  44. case '0' : ad[i-50]=0;break;
  45. case '1' : ad[i-50]=1;break;
  46. case '2' : ad[i-50]=2;break;
  47. case '3' : ad[i-50]=3;break;
  48. case '4' : ad[i-50]=4;break;
  49. case '5' : ad[i-50]=5;break;
  50. case '6' : ad[i-50]=6;break;
  51. case '7' : ad[i-50]=7;break;
  52. case '8' : ad[i-50]=8;break;
  53. case '9' : ad[i-50]=9;break;
  54. }
  55. }
  56. }
  57. //此处为一直循环显示数码管的部分
  58. void loop()
  59. {
  60. if(h==9999){
  61. //调用请求函数
  62. fang();
  63. h=0;
  64. }
  65. h++;
  66. //1 0000 0001 1001 1111
  67. DTSMG((0x01<<8)+shujubao[ad[0]]);
  68. for(int j=0;j<1000;j++);//此处为延时
  69. //2 0000 0010 0010 0101
  70. DTSMG((0x02<<8)+shujubao[ad[1]]);
  71. for(int j=0;j<1000;j++);
  72. //3 0000 0100 0000 1101
  73. DTSMG((0x04<<8)+shujubao[ad[2]]);
  74. for(int j=0;j<1000;j++);
  75. //4 0000 1000 1001 1001
  76. DTSMG((0x08<<8)+shujubao[ad[3]]);
  77. for(int j=0;j<1000;j++);
  78. //5 0001 0000 0100 1001
  79. DTSMG((0x10<<8)+shujubao[ad[4]]);
  80. for(int j=0;j<1000;j++);
  81. //6 0010 0000 0100 0001
  82. DTSMG((0x20<<8)+shujubao[ad[5]]);
  83. for(int j=0;j<1000;j++);
  84. //7 0100 0000 0001 1111
  85. DTSMG((0x40<<8)+shujubao[ad[6]]);
  86. for(int j=0;j<1000;j++);
  87. //8 1000 0000 0000 0001
  88. DTSMG((0x80<<8)+shujubao[ad[7]]);
  89. for(int j=0;j<1000;j++);
  90. }
  91. //数码管模块
  92. void DTSMG(u16 buff)
  93. {
  94. int i;
  95. digitalWrite(4,LOW);
  96. for(i=0;i<=15;i++)
  97. {
  98. digitalWrite(5,LOW);
  99. if(((buff>>i)&0x0001)==0) { digitalWrite(16,LOW);}//DIO
  100. else if(((buff>>i)&0x0001)==1) { digitalWrite(16,HIGH);}
  101. for(int j=0;j<1000;j++);
  102. digitalWrite(5,HIGH);
  103. }
  104. for(int j=0;j<1000;j++);
  105. digitalWrite(4,HIGH);
  106. }
  107. //网络调取API函数
  108. void https_connect()
  109. {
  110. //建立WiFiClientSecure对象
  111. WiFiClientSecure httpsClient;
  112. //串口监视器显示域名
  113. Serial.println(host);
  114. //无验证方式连接
  115. httpsClient.setInsecure();
  116. //用来判断是否连接超时
  117. httpsClient.setTimeout(15000);
  118. delay(1000); //延时
  119. Serial.println("HTTPS Connecting");
  120. Serial.println("");
  121. int r=0;
  122. while((!httpsClient.connect(host,httpsPort)) && (r < 300))
  123. {
  124. // 尝试连接服务器并等待
  125. delay(100); //httpsClient.connect(host,httpsPort)用于连接到服务器
  126. Serial.print(".");
  127. r++;
  128. }
  129. if(r==30)
  130. {
  131. // 连接超时后输出"连接失败"信息并返回
  132. Serial.println("Connection failed");
  133. Serial.println(httpsClient.getLastSSLError());
  134. return;
  135. }
  136. else
  137. {
  138. Serial.println("Connected...");// 连接成功则输出“连接成功”信息
  139. }
  140. // 建立HTTPS请求信息字符串
  141. //此处的************应更换为自己需要访问的API地址
  142. String request = String("GET ")+"************"+" HTTP/1.1\r\n" + //请求行
  143. "Host: " + host + "\r\n" + //请求头
  144. "connection: close\r\n"+"\r\n";
  145. // 向服务器发送请求
  146. httpsClient.print(request);
  147. Serial.println("request sent");
  148. // 告知用户当前ESP8266已经成功接收服务器响应头信息。
  149. while (httpsClient.connected())
  150. {
  151. // 检查服务器响应信息。一旦查到响应头结束字符,则通过串口监视器告知ESP8266已经成功接收服务器响应头信息。
  152. String line = httpsClient.readStringUntil('\n'); //获取响应头信息
  153. //串口监视器显示响应头信息
  154. if (line == "\r")
  155. {
  156. //判断头是否结束
  157. Serial.println("headers received");
  158. break;
  159. }
  160. }
  161. // 通过串口监视器输出服务器响应体信息(服务器报文)
  162. Serial.println("响应体:");
  163. String body;
  164. while(httpsClient.available())
  165. {
  166. body= httpsClient.readStringUntil('}'); //获取响应体信息
  167. //此处为强制类型转换
  168. char *ch2 = const_cast<char*>(body.c_str());
  169. Serial.println(body);
  170. ch3= ch2;
  171. }
  172. httpsClient.stop(); //操作结束,断开服务器连接
  173. Serial.println("closing connection");
  174. }

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

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

        2、需要更改域名地址

        3、需要更改api请求地址

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/211466
推荐阅读
相关标签
  

闽ICP备14008679号