ESP8266 oled获取网络时钟制作电子表

一、需求:

通过esp8266+oled获取网络时钟制作电子表,避免时间误差,可用于精准定时,后期用于定时开关灯等操作;

二、技术难点:

  1. 如何获取网络时钟;
  2. 如何将获取到的数据转换为年、月、日、小时、分钟和秒表;
  3. 如何将转换的数据展示到oled上。

三、环境介绍:

该方案使用的是arduino ide+esp8266的库,正常安装如下:

1、正常安装

首先打开图3.1的首选项,

esp8266用定时器制作时钟 esp8266电子时钟_esp8266用定时器制作时钟

图3.1首选项例图

在设置中管理网址添加https://arduino.esp8266.com/stable/package_esp8266com_index.json(如图3.2)esp8266的搜索库,然后点击好确定;

esp8266用定时器制作时钟 esp8266电子时钟_开发语言_02

图3.2增加esp8266的搜索库

在菜单栏中选择"工具" -> "开发板" -> "开发板管理器"如图3.3

esp8266用定时器制作时钟 esp8266电子时钟_搜索_03

图3.3增加esp8266的库

在搜索框中输入"esp8266",并选择"esp8266 by ESP8266 Community",点击"安装"如图3.4所示

esp8266用定时器制作时钟 esp8266电子时钟_搜索_04

图3.4安装esp8266

安装完成后,重启Arduino IDE;

在菜单栏中选择"工具" -> "开发板",并选择对应的ESP8266型号,如图3.5,我的是nodemcu,因此选的下面配置;

esp8266用定时器制作时钟 esp8266电子时钟_c语言_05

图3.5选择esp8266的具体设备

之后就可以使用Arduino IDE来编写并上传代码到ESP8266设备上了。

注意:但是此方案我并没有走通,该方案安装会失败,可以尝试尝试,兴许你就是那个幸运儿,一次就成功呢。

2、离线安装(该包放到同文件夹内)

(1)下载如下图的开发板管理ESP8266文件的压缩包,解压后,如下图3.6所示;

esp8266用定时器制作时钟 esp8266电子时钟_c语言_06

图3.6离线esp8266压缩包

(2)找到arduino ide的安装路径,应该有和这些一样的文件,我的路径如图3.7,将我们的离线esp8266安装包,全部替换下面路径中的文件即可;

esp8266用定时器制作时钟 esp8266电子时钟_开发语言_07

图3.7arduino的环境地址

(3)然后重启,即可使用esp8266了,该方案我已实践,可行,esp8266便宜,但是使用的人很少,就是他的环境过于复杂或者很多人被安装就劝退了。

3、oled三方库的安装(其他三方库和该方案类似)

目前我使用的是三方库ESP8266_and_ESP32_OLED_driver_for_SSD1306_displays如图3.8所示;

esp8266用定时器制作时钟 esp8266电子时钟_esp8266用定时器制作时钟_08

图3.8 oled三方库展示

(1)安装方案,打开工具,管理库,如图所示;

esp8266用定时器制作时钟 esp8266电子时钟_esp8266用定时器制作时钟_09

(2)搜索ESP8266_and_ESP32_OLED_driver_for_SSD1306_displays,然后安装即可,如果没有这些库,编译会保持没有该文件;

esp8266用定时器制作时钟 esp8266电子时钟_字符串_10

4、其他库:

ESP8266HTTPClient库:主要是http获取时钟信息

esp8266用定时器制作时钟 esp8266电子时钟_搜索_11

ESP8266Wifi库,主要是连接wifi

四、程序展示和讲解

程序放到文档同文件夹内

4.1 oled连线

OLED               NODEMCU

VCC                 3.3V      

GND                GND

SCL                 D1

SDA                 D2

代码中可看到,如图4.1所示;

esp8266用定时器制作时钟 esp8266电子时钟_c语言_12

图4.1 oled引脚设置图

五、该方案的难点

5.1从哪里获取网络时间?

该方案是从苏宁网站的授时网页获取的时间:http://quan.suning.com/ 如图5.1所示

esp8266用定时器制作时钟 esp8266电子时钟_开发语言_13

图5.1获取网络时间

可访问网址,会看到如图5.2所示:

esp8266用定时器制作时钟 esp8266电子时钟_esp8266用定时器制作时钟_14

如图5.2苏宁网站的授时网页所示

后期,我可能会考虑自己会发布自己的网页,将后期项目需要的数据都由该方式发布,然后让其他软件能够同步访问。

获取网址信息代码如下图,response目前属于String字符串,字符串内容:{"sysTime2":"2023-07-16 22:31:05","sysTime1":"2023071622310”}

esp8266用定时器制作时钟 esp8266电子时钟_字符串_15

5.2如何将获取到的时间字符串提取出来?

5.2.1使用最老土的方式:

首先提出出来字符串的单个字符,然后转换成数字,然后累加出自己需要的年月日,如下图代码所示:这也是我实现功能的第一个方法,比较菜狗,啊哈哈哈!!!!

/*
"sysTime2":"2023-07-16 22:31:05","sysTime1":"2023071622310”}
 下标
  年:46——49
  月:50——51
  日:52  53
  时:54  55
  分:56  57
  秒:58  59
*/
int year(String b2)
{
  int year1 = 0;
  int year2 = 0;
  int year3 = 0;
  int year4 = 0;
  int year = 0;
  
  year1 = getOther(b2,46)*1000;
  year2 = getOther(b2,47)*100;
  year3 = getOther(b2,48)*10;
  year4 = getOther(b2,49);
  year = year1+year2+year3+year4;
  return year;
  
}
int month(String b2) {
  int month1;
  int month2;
  int month=0;
  month1 =getOther(b2,50)*10;
  month2 =getOther(b2,51);
  month =month1+month2;
  return month;
}
int day(String b2) {
  int day = 0;
  int day1;
  int day2;
  day1 =getOther(b2,52)*10;
  day2 =getOther(b2,53);
  day =day1+day2;
  return day;
}
int hour(String b2) {
  int hour = 0;
  int hour1;
  int hour2;
  hour1 =getOther(b2,54)*10;
  hour2 =getOther(b2,55);
  hour = hour1+hour2;
  return hour;
}
int minte(String b2) {
  int minte = 0;
  int minte1;
  int minte2;
  minte1 =getOther(b2,56)*10;
  minte2 =getOther(b2,57);
  minte = minte1+minte2;
  return minte;
}
int seconde(String b2) {
  int seconds = 0;
  int seconds1;
  int seconds2;
  seconds1 =getOther(b2,58)*10;
  seconds2 =getOther(b2,59);
  seconds = seconds1+seconds2;
  return seconds;
}
int getOther(String b2, int index) {//根据上面 对获取的api进行数据拆分
  return b2.charAt(index) - 48;
}
5.2.2使用toCharArray函数将所有字符都接收到arry

esp8266用定时器制作时钟 esp8266电子时钟_搜索_16