ESP32-cam WiFi功能获取网络时间及OLED显示
ESP32-Cam简介
ESP32-Cam是安信可公司(AI Think)推出的一款小巧便携的芯片,该芯片拥有ESP32家族标配的WiFi以外,还有优秀的图像处理能力,特别是神经卷积网络运算的优化,可以说是物联网时代小巧而又强大的产物之一。
但也有几个缺点,初学者必坑,不是,避坑:
1、接口少,小巧的芯片往往只需要很少的接口,而这款ESP32-Cam可以说是把小巧做到了极致,懂我意思吧,整个芯片16个PIN,留给用户的却又8个之多,可以说是非常凉心了;
2、容易发热。热到什么程度呢,冬天暖手都觉着烫(可以拿来给女朋友煮岩浆)。当然,运算量不大的时候,发热还不明显,但是当加入WiFi和摄像头模块以后,热量陡然上升,而且顺便也会拉低图像的传输帧率。此时只能缩小画面或者降低画质来保证流畅传输了。
四针0.96寸OLED屏幕简介
我用的是四针0.96寸OLED屏幕,蓝黑配色,慢慢的科技感。而且四针也把简介做到了极致。四针采用IIC总线,除去两个电源引脚,就是时钟线和数据线了。
0.96寸OLED屏幕内置SSD1306驱动,因此要在Arduino IDE中下载相关的库(还要匹配ESP32系列芯片哟~)
系统设计思路
一直想做一个桌面小时钟,也不知道哪里来的执念。
首先是网络时间的获取,方法有很多,只要找到NTP,然后通过WiFi读取到程序中就可以。这里我用的是(翻历史记录找不到了,我敲,各位自己琢磨吧)但是有一个mt的结构体,它里面的数据我放在代码最后面了,看到记得点赞查收,谢谢。
然后就是OLED的显示了。这里我用的是库里(这都被你发现了,我是库里球迷0^0)的函数。具体可以点击上面图中的“more info”去GitHub了解详情。(不会吧不会吧,不会都已经在做ESP32的项目了,还没注册GitHub吧,别说没有VPN,现在可以免翻墙登入的)
正片部分(空降代码区)
/*
2021.10.14 22:43
终于驱动起来OLED屏幕了
之前因为库没有找对
使用的都是只适合Arduino芯片的库
Arduino中由专门针对ESP32系列芯片驱动OLED的库
2021.10.16 17:19
完成连接WIFI,从网络获取时间,并显示在屏幕上
误差在毫秒级,肉眼无法察觉
接下来将进行UI界面的设计
*/
#include <Wire.h>
#include "SSD1306.h"
#include <WiFi.h>
#define unsigned int uint //定义数据类型
SSD1306 display(0x3c, 15, 14); //设置OLED引脚
const char *ssid = "********"; //你的网络名称
const char *password = "********"; //你的网络密码
const char *ntpServer = "pool.ntp.org"; //世界时钟
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
const int OLEDWID = 128;
const int OLEDLEN = 64;
const int HALF_WID = OLEDWID>>1;
const int HALF_LEN = OLEDLEN>>1;
struct tm timeinfo;
void setup() {
Serial.begin(115200); //设置串口通信频率
//Serial.setDebugOutput(true); //调试输出打开
Serial.println();
//OLD初始化设置
display.init(); //OLED显示初始化
display.setFont(ArialMT_Plain_16); //调整字体大小
display.clear();
//display.drawString(0,0,"Hello");
//WiFi设置
WiFi.begin(ssid,password);
while(WiFi.status()!=WL_CONNECTED){
delay(500);
//Serial.print(".");
display.setTextAlignment(TEXT_ALIGN_CENTER); //锚点在字符中央
display.drawString(HALF_WID,0,"Waiting...");
}
display.display();
//Serial.println("Wifi Connected!");
display.clear();
display.setTextAlignment(TEXT_ALIGN_CENTER); //锚点在字符中央
display.clear();
display.drawString(HALF_WID,0,"WIFIConnected!");
display.display();
delay(1000);
// 从网络时间服务器上获取并设置时间
// 获取成功后芯片会使用RTC时钟保持时间的更新
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
void loop() {
printData();
delay(1000);
//n++;
//if(n==60) {configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);n=0;} //每分钟进行时间校准
}
String TwoDigit_Str(int digit){
if(digit<10)
return "0"+String(digit);
return String(digit);
}
void printData(){
if (!getLocalTime(&timeinfo))
{
display.clear();
display.setTextAlignment(TEXT_ALIGN_CENTER); //锚点在字符中央
display.drawString(HALF_WID,0,"GettingTime...");
display.display();
return;
}
String Data = String(timeinfo.tm_year+1900) + "-" + String(timeinfo.tm_mon+1) + "-" + String(timeinfo.tm_mday); //日期转换
String timenow = TwoDigit_Str(timeinfo.tm_hour) + ":" + TwoDigit_Str(timeinfo.tm_min) + ":" + TwoDigit_Str(timeinfo.tm_sec); //时间转换
String WeekDay;
switch(timeinfo.tm_wday){ //星期转换
case 0: WeekDay = "Sun"; break;
case 1: WeekDay = "Mon"; break;
case 2: WeekDay = "Tue"; break;
case 3: WeekDay = "Wed"; break;
case 4: WeekDay = "Thr"; break;
case 5: WeekDay = "Fri"; break;
case 6: WeekDay = "Sta"; break;
}
display.clear();
display.setTextAlignment(TEXT_ALIGN_CENTER); //锚点在字符中央
display.drawString(HALF_WID,HALF_LEN-8,timenow); // 当前时间输出
display.drawString(HALF_WID,4,Data); // 当前日期输出
display.drawString(HALF_WID,OLEDLEN-20,WeekDay); //输出星期
display.display();
}
/*
struct tm {
int tm_sec; // 秒,取值0~59;
int tm_min; // 分,取值0~59;
int tm_hour; // 时,取值0~23;
int tm_mday; // 月中的日期,取值1~31;
int tm_mon; // 月,取值0~11;
int tm_year; // 年,其值等于实际年份减去1900;
int tm_wday; // 星期,取值0~6,0为周日,1为周一,依此类推;
int tm_yday; // 年中的日期,取值0~365,0代表1月1日,1代表1月2日,依此类推;
int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正;不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负
};
*/
结束语(一点心得,欢迎交流病情)
其实今年6月份我就拿到了这个ESP32-Cam的板子了,但是由于是我真正接触的第一个集成板子,因此学习起来有些困难,而且还有些眼高手低,刚上来就想把人脸识别和深度学习做出来,痴心妄想了属于是~~
发这篇博客不只是分享一下心得,也算是用这块板子做的比较拿得出手的一个项目了,有不足的地方,也欢迎大家讨论交流…
本人西南交大大三狗一只,也欢迎大家评论区、私信多多与我互动,我叫马牛逼,我敢…(不是这样的,哈哈哈哈)