一.项目介绍
1.ESP32-S2-Mini-1模块:
引用部分官方介绍:ESP32-S2-MINI-1是乐鑫公司的一颗通用型Wi-Fi MCU模组,采用PCB板载天线,配置4MB SPI flash,主控是ESP32-S2FN4 。该主控内置Xtensa® 32 位LX7 单核处理器,主频 240 MHz。用户可以关闭 CPU 的电源,利用低功耗协处理器监测外设的状态变化或某些模拟量是否超出阈值。
2.ESP32-S2-Mini-1模块核心功能介绍:
-
128*64 OLED显示,SPI接口,显示信息、参数、波形
-
4个按键,用于参数控制、菜单选择
-
1路Mic音频输入 - 模拟电路,通过电位计可以调节增益0-40dB调节范围,并有带通滤波器
-
1路耳机插座音频输入 - 模拟电路,通过电位计可以调节增益 0-40dB调节范围,并有带通滤波器
-
2路音频输出,并有功率放大,可以驱动喇叭和耳机插座
-
FM接收模块,ESP32通过I2C接口对其进行参数设置,调节FM电台以及设置音量大小
-
一个模拟开关切换来自ESP32产生的音频还是FM输出的音频,模块开关的输出送到喇叭或耳机输出
3.开发环境(Arduino IDE):
ESP32在Arduino IDE的设置可参照这个教程。有坑注意:ESP32在开发板管理器中下载ESP32时,如果不能正常下载,建议下载offline版本(esp-idf-tools-setup-offline-2.11),Arduino IDE看上去会支持断点续传,其实断点下载下来会报错,浪费时间。
二.任务完成思路和实现过程
此次活动我选取了任务6:制作一个本地气象台/温度计:利用OLED显示,显示当前本地的时间、温度和气象信息。
以下对本次任务进行分解:
第一步:使用ESP32模组联网(代码详见附件中)
ESP32模组中自带了WIFI功能,在尝试几个不同的IDE(试了eclipse和VS)后发现,还是Arduino最适合我们这种小白,在Arduino中导入ESP32 的包后,使用如下这个文件可调用wifi联网并能抓取网络信息。
#include <WiFiUdp.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
第二步:抓取当前本地的时间、温度和气象信息。
1.在第一步联网后(可以在手机热点上看到是否联网或者用串口确认是否可以抓到设备IP),开始连接天气API,使用和风天气API调用天气信息,使用NTP.ORG抓取时间信息(查询到这个网站会通过IP判断查询地并给出当地时间)
2.在确认抓取到天气API的信息和时间后(同样可以使用串口吐信息来确认抓取的信息是否可用),使用OLED显示,OLED是128*64的单色屏,不需要背光,很省电。
另外OLED模组使用了SPI总线连接,所以需要在代码中载入SPI库,显示部分在下面代码实现中另作介绍。
#include <SPI.h>
第三步:实现和调试(完整代码详见附件)
程序中需要载入的库如下:
在使用Adafruit库显示时,另有WeatherIcon.h是自己设置的取字模转码合集(软件可用PCtoLCD2002)。
#include <SPI.h>
#include <Wire.h>
#include <time.h>
#include <WiFiUdp.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ArduinoJson.h>
#include"WeatherIcon.h"
另外因为是SPI总线,需要先初始化OLED如下:
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI 35
#define OLED_CLK 36
#define OLED_DC 33
#define OLED_CS 46
#define OLED_RESET 34
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
使用U8g2lib库显示时,加载库如下:
#include <SPI.h>
#include <time.h>
#include <WiFiUdp.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include <U8g2lib.h>
#include <ArduinoJson.h>
初始化OLED相对Adafruit库,简单一些,如下:
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 36, /* data=*/ 35, /* cs=*/ 46, /* dc=*/ 33, /* reset=*/ 34);
需要调试的部分:
(1)联网部分:选择和风API,目前大部分天气API都需要申请账号,使用个人API key,还有一种方法,是使用证书登录,此处使用ESP32的方式来连接网络
const String getweather = "https://devapi.qweather.com/v7/weather/now?location=101190401&lang=en&gzip=n&key=922013f291204b45bf867538c1a70f83";
.
.
.
if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status
HTTPClient http;
http.begin(getweather); //Specify the URL
int httpCode = http.GET(); //Make the request
(2)数据抓取和解析:ArduinoJson使用V6版本,
(3)抓取当地时间:使用ntp.org网站抓时间如下:
const char *ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
.
.
.
int oldsec = -1;
String ipaddress; //local IP
.
.
.
ipaddress = wifi_conn();
Serial.println(ipaddress.c_str());
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
(4)显示部分:分为两种,其中Adafruit库可以显示图标,而U8g2lib尝试显示图标不成功,代码如下:
Adafruit库显示的部分代码如下:
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(83, 55); //weather
display.print(today_weather);
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(15, 20); //temp
display.print(today_temp);
display.setCursor(15, 50); //Humi
display.print(today_humi);
display.display();
U8g2lib的显示部分代码如下:
u8g2.setFont(u8g2_font_helvR10_tr);
u8g2.setCursor(72, 28); //weather
u8g2.print(today_weather);
u8g2.sendBuffer();
u8g2.setCursor(57, 45); //temp
u8g2.print(today_temp);
u8g2.sendBuffer();
u8g2.setCursor(54, 62); //Humi
u8g2.print(today_humi);
u8g2.sendBuffer();
第四步:演示效果
贴上演示效果和内容如下:
三.活动总结,一些感想
本次活动,是第一次接触ESP32平台,也是第一次学习在不同平台之间移植代码。
在这个过程中,得到群里大佬的帮忙,非常感谢他们,也非常感谢硬禾学堂提供机会。