ESP8266 oled获取网络时钟制作电子表
一、需求:
通过esp8266+oled获取网络时钟制作电子表,避免时间误差,可用于精准定时,后期用于定时开关灯等操作;
二、技术难点:
- 如何获取网络时钟;
- 如何将获取到的数据转换为年、月、日、小时、分钟和秒表;
- 如何将转换的数据展示到oled上。
三、环境介绍:
该方案使用的是arduino ide+esp8266的库,正常安装如下:
1、正常安装
首先打开图3.1的首选项,
图3.1首选项例图
在设置中管理网址添加https://arduino.esp8266.com/stable/package_esp8266com_index.json(如图3.2)esp8266的搜索库,然后点击好确定;
图3.2增加esp8266的搜索库
在菜单栏中选择"工具" -> "开发板" -> "开发板管理器"如图3.3
图3.3增加esp8266的库
在搜索框中输入"esp8266",并选择"esp8266 by ESP8266 Community",点击"安装"如图3.4所示
图3.4安装esp8266
安装完成后,重启Arduino IDE;
在菜单栏中选择"工具" -> "开发板",并选择对应的ESP8266型号,如图3.5,我的是nodemcu,因此选的下面配置;
图3.5选择esp8266的具体设备
之后就可以使用Arduino IDE来编写并上传代码到ESP8266设备上了。
注意:但是此方案我并没有走通,该方案安装会失败,可以尝试尝试,兴许你就是那个幸运儿,一次就成功呢。
2、离线安装(该包放到同文件夹内)
(1)下载如下图的开发板管理ESP8266文件的压缩包,解压后,如下图3.6所示;
图3.6离线esp8266压缩包
(2)找到arduino ide的安装路径,应该有和这些一样的文件,我的路径如图3.7,将我们的离线esp8266安装包,全部替换下面路径中的文件即可;
图3.7arduino的环境地址
(3)然后重启,即可使用esp8266了,该方案我已实践,可行,esp8266便宜,但是使用的人很少,就是他的环境过于复杂或者很多人被安装就劝退了。
3、oled三方库的安装(其他三方库和该方案类似)
目前我使用的是三方库ESP8266_and_ESP32_OLED_driver_for_SSD1306_displays如图3.8所示;
图3.8 oled三方库展示
(1)安装方案,打开工具,管理库,如图所示;
(2)搜索ESP8266_and_ESP32_OLED_driver_for_SSD1306_displays,然后安装即可,如果没有这些库,编译会保持没有该文件;
4、其他库:
ESP8266HTTPClient库:主要是http获取时钟信息
ESP8266Wifi库,主要是连接wifi
四、程序展示和讲解
程序放到文档同文件夹内
4.1 oled连线
OLED NODEMCU
VCC 3.3V
GND GND
SCL D1
SDA D2
代码中可看到,如图4.1所示;
图4.1 oled引脚设置图
五、该方案的难点
5.1从哪里获取网络时间?
该方案是从苏宁网站的授时网页获取的时间:http://quan.suning.com/ 如图5.1所示
图5.1获取网络时间
可访问网址,会看到如图5.2所示:
如图5.2苏宁网站的授时网页所示
后期,我可能会考虑自己会发布自己的网页,将后期项目需要的数据都由该方式发布,然后让其他软件能够同步访问。
获取网址信息代码如下图,response目前属于String字符串,字符串内容:{"sysTime2":"2023-07-16 22:31:05","sysTime1":"2023071622310”}
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;
}