开发平台介绍
乐鑫公司的ESP32-S2-Mini-1模块是一颗通用型Wi-Fi MCU模组,功能强大,具有丰富的外设接口,可用于可穿戴电子设备、智能家居等场景。ESP32-S2-MINI-1采用PCB板载天线,模组配置了4MB SPI flash,采用的是 ESP32-S2FN4 芯片。该芯片搭载了Xtensa® 32 位LX7 单核处理器,工作频率高达 240 MHz。用户可以关闭 CPU 的电源,利用低功耗协处理器监测外设的状态变化或某些模拟量是否超出阈值。
该模块可以广泛应用于下面的一些领域:
- 通用低功耗 IoT 传感器 Hub
- 通用低功耗 IoT 数据记录器
- USB 设备
- 语音识别
- 图像识别
- Mesh 网络
- 家庭自动化
- 智慧楼宇
- 工业自动化
- 健康/医疗/看护
- Wi-Fi 玩具
- 可穿戴电子产品
- 零售 & 餐饮
- 智能 POS 应用
完成本项目只用到上述部分功能即可,包括SPI_OLED显示屏、WiFi模块等。
可实现:wifi连接、获取网络服务器推流、程序主控、获取网络时间等
CH340C:USB总线的转接芯片,实现USB转串口或者USB转打印口,内置时钟,无需外部晶振
可实现:type-c口驱动、程序烧录、ticker等
RDA5807:FM收音机模块
可实现:FM频率搜索、输出等
NCP2890:1W功率的音频功率放大器
可实现:网络电台音频解码、播放
SPI_OLED:SPI驱动显示屏
可实现:GUI输出等
本项目主要利用基于ESP32-S2模块的物联网、音频信号处理平台实现本地气象时间、温度和气象信息的显示。
硬件:基于ESP32-S2-Mini-1模块的音频处理平台
软件实现:
Arduino IDE:开源IDE
可实现:程序编写、调试、烧录等工作
程序设计思路:
程序部分:
WiFi模块
void Wifi_connect()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
http请求模块:
void httpRequest()
{
WiFiClient client;
if (!client.connect(host, 80))
{
Serial.println("Connect host failed!");
return;
}
Serial.println("host Conected!");
String httpURL= "/v3/weather/now.json?key=";
httpURL += privateKey;
httpURL += "&location=";
httpURL += city;
httpURL += "&language=";
httpURL += language;
client.print(String("GET ") + httpURL + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
Serial.println("Get send");
char endOfHeaders[] = "\r\n\r\n";
bool ok = client.find(endOfHeaders);
if (!ok)
{
Serial.println("No response or invalid response!");
}
Serial.println("Skip headers");
String line="";
line += client.readStringUntil('\n');
Serial.println(client.readStringUntil('\n'));
Serial.println(line);
Json(line);
client.stop();
}
JSON解析:
void Json(String line)
{
DynamicJsonDocument doc(1400);
DeserializationError error = deserializeJson(doc, line);
struct WeatherData weatherdata = {0};
Serial.println(doc["results"][0]["daily"][0].as<const char*>());
strcpy(weatherdata.city, doc["results"][0]["location"]["name"].as<const char*>());
strcpy(weatherdata.weather, doc["results"][0]["now"]["text"].as<const char*>());
strcpy(weatherdata.temperature, doc["results"][0]["now"]["temperature"].as<const char*>());
OLEDDisplay(weatherdata.city, weatherdata.weather, weatherdata.temperature);
Serial.println("City");
Serial.println(weatherdata.city);
Serial.println("textDay");
Serial.println(weatherdata.weather);
Serial.println("temperature");
Serial.println(weatherdata.temperature);
Serial.println("read json success");
Serial.println();
Serial.println("closing connection");
}
OLED显示模块:
void OLEDDisplay(String cityName, String cityweather, String citytemperature)
{ struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
u8g2.setFont(u8g2_font_wqy12_t_gb2312);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(5,10);
u8g2.print("城市: ");
u8g2.print(cityName);
u8g2.setCursor(5, 22);
u8g2.print("天气: ");
u8g2.print(cityweather);
u8g2.setCursor(5, 34);
u8g2.print("温度: ");
u8g2.print(citytemperature);
u8g2.print("'C");
u8g2.setCursor(5, 46);
u8g2.print(&timeinfo, "%F");
u8g2.print(" ");
u8g2.print(&timeinfo, "%A");
u8g2.setCursor(5, 58);
u8g2.print("时间: ");
u8g2.print(&timeinfo, "%T");
u8g2.sendBuffer();
delay(1000);
}
程序执行效果:
最后显示城市、温度、日期、星期还有时间。
程序可改进的地方:
目前只能实时播报,未来可以设置未来三天的天气预报,并且显示天气的图标,外接屏幕更大的显示屏来显示。
总结:
通过本次项目提升我的编程能力和项目能力,希望以后能多多做这样的项目,为未来打好基础。