一、ESP32-S2模块的物联网/音频信号处理板卡介绍
该板卡使用了乐鑫公司的ESP32-S2-Mini-1模块,ESP32-S2-MINI-1是一颗通用型Wi-Fi MCU模组,功能强大,具有丰富的外设接口,可用于可穿戴电子设备、智能家居等场景。ESP32-S2-MINI-1采用PCB板载天线,模组配置了4MB SPI flash,采用的是 ESP32-S2FN4 芯片。该芯片搭载了Xtensa® 32 位LX7 单核处理器,工作频率高达 240 MHz。用户可以关闭 CPU 的电源,利用低功耗协处理器监测外设的状态变化或某些模拟量是否超出阈值。ESP32-S2-FH4 还集成了丰富的外设接口。
三、软件流程图
下面为该项目的思路流程图:
四、主要代码及分析
#include <SPI.h>
#include <WiFi.h>
#include <U8g2lib.h>
#include <Arduino.h>
#include <ArduinoJson.h>
#include "time.h"
#define key1 1
#define key2 2
#define key3 3
#define key4 6
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 36, /* data=*/ 35, /* cs=*/ 46, /* dc=*/ 33, /* reset=*/ 34); //选择一个u8g2的构造器,全屏缓存
const char* SSID = "......."; //输入自己的WiFi对应的名称
const char* PASSWD = "......."; //输入自己的WiFi对应的密码
int i=0;
const char* ntpServer = "pool.ntp.org"; //用NTP服务器,获取时间
const long gmtOffset_sec = 28800;
const int daylightOffset_sec = 0;
const char *host = "api.seniverse.com";//心知天气的接口
const char *privateKey = "........";//心知天气注册之后的免费私匙
const char *city = "jieyang";//本地的地址
const char *language = "en";//语言,为英语
struct WetherData
{
char city[32];
char weather[64];
char high[32];
char low[32];
char humi[32];
};
声明用到的库和一些网址,等等一些基本信息。本次还是采用心知天气和NTP来获取天气状况和本地时间。
void display_Screen(){
//显示界面
u8g2.firstPage(); //页面缓存模式
u8g2.clearBuffer(); //清除缓存
u8g2.setFontDirection(0); //设置文字的方向
u8g2.setFont(u8g2_font_ncenB14_tr); //设置字体,大号字体
u8g2.setCursor(16,30); //设置开始的位置
u8g2.print("Just do it!"); //在屏幕上显示的文本内容
u8g2.drawFrame(0,0,128,64);
u8g2.sendBuffer(); //发送缓存数据给显示器并显示
}
使用页面缓存模式,通过使用u8g2的库函数,u8g2.setCursor()和u8g2.print(),显示一个初始界面,一个矩形外框,加一串英文字符,Just do it!
void connectWiFi(){
//连接WiFi
WiFi.begin(SSID,PASSWD); //连接WiFi
Serial.begin(115200); //设置串口通讯时的数据传输速率
Serial.print("Conneting to WiFi : ");
Serial.print(SSID);
Serial.println("......");
while ( WiFi.status() != WL_CONNECTED ) {
delay(1000);
Serial.print(i++);
Serial.print(' ');
} //记录成功连接一共花费了多长时间
Serial.println("");
Serial.println("Connection established!"); //显示连接成功
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //输出连接网络的IP地址
u8g2.setFontDirection(0); //设置文字的方向
u8g2.setFont(u8g2_font_ncenB14_tr); //设置字体,大号字体
u8g2.setCursor(56,56); //设置开始的位置
u8g2.print("Start-->"); //在屏幕上显示的文本内容
u8g2.sendBuffer();
}
连接WiFi,利用串口输出,方便调试,连接成功后,会在上一个界面左下角显示一个Start-->,可以根据这个作为是否联网成功的一个特征,当显示Start-->之后,就可以进行菜单的一个选择了。
void printLocalTime()
{
struct tm timeinfo;
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); //从网络服务器上获取并设置时间
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %Y-%m-%d %H:%M:%S");
u8g2.firstPage();
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFontDirection(0);
u8g2.drawFrame(0,0,128,64);
u8g2.drawFrame(2,2,124,60);
u8g2.setFont(u8g2_font_ncenB08_tr);
u8g2.setCursor(8,58);
u8g2.print("Have a great time!>_<");
u8g2.setFont(u8g2_font_ncenB12_tr);
u8g2.setCursor(20,16);
u8g2.print(&timeinfo, "%A"); //星期*
u8g2.setCursor(16,32);
u8g2.print(&timeinfo, "%Y-%m-%d"); //年-月-日
u8g2.setCursor(26,48);
u8g2.print(&timeinfo, "%H:%M:%S"); //时-分-秒
u8g2.sendBuffer();
}
这个函数用来获取当地时间,和在OLED 屏幕上显示时间。
void key_1(){
while(digitalRead(3) != LOW){
delay(1000);
printLocalTime();
}
}
定义按键一的功能,进行时间的刷新和显示,并且将按键三作用定义为按键一的返回功能。
这部分是按键二的功能,通过心知天气,获取当地天气状况并且json解析,解析后的文本在屏幕上显示。
五、功能展示
初始界面,显示Just do it!
连接WiFi成功后,接着显示Start-->,可以进行菜单选择了。
显示时间,周几,何年何月何日,几时几分几秒。
显示气象信息,本地所在城市,天气状况,温度,湿度。
六、对本活动的心得体会
首先,非常感谢硬禾学堂举办的寒假在家练活动,这次也是按照要求完成了板卡的一个功能,中规中矩。学到了很多东西,比如,上次使用的是LCD屏幕,这次用到的是OLED 屏幕,这两种屏幕,在arduino里面就是可以调用两种不同的库,进行屏幕的一个显示,然后再一次接触到,WiFi连接,心知天气,json解析这些用户自定义函数,可以加深影响。最后呢,还有一些做的自我感觉不是太好的,比如,这次没有弄好u8g2的中文显示,全英文,还有就是时间的那个屏幕刷新是一整个屏幕刷新,比较显眼,不好操作,使用一个按键三作为返回功能,感觉有点浪费,可以让按键三多一点功能的。最后的最后,还是非常感谢硬禾学堂!!!(大大的支持^_^)