Skip to content

开发文档

1. 项目概述

本项目旨在开发一个基于 ESP32 微控制器、0.96寸OLED显示屏DFPlayer Mini 语音模块和 WS2812B RGB LED 灯带的智能天气预警系统。系统能够实时获取天气数据和老黄历信息,并在特定高峰时段(6:00-9:00, 12:00-15:00, 17:00-19:00)通过多色LED灯进行物理可见的异常天气预警,同时提供按键触发的语音播报功能。

2. 硬件清单

以下是完成本项目所需的硬件组件:

序号组件名称规格/型号数量备注
1主控板ESP32 DevKitC 或其他ESP32开发板1带有Wi-Fi功能
2显示屏0.96寸OLED显示屏1I2C接口 (SSD1306芯片)
3语音模块DFPlayer Mini1带有SD卡槽
4扬声器8Ω 1W 小喇叭1配合DFPlayer Mini使用
5LED灯带WS2812B RGB LED (NeoPixel)9颗以上用于多色预警灯
6按键轻触开关1用于语音播报触发
7存储卡MicroSD卡1用于存储语音文件 (MP3格式)
8供电5V 2A 电源适配器1ESP32和WS2812B供电
9附件杜邦线、面包板、1000μF电容 (可选,用于WS2812B供电稳定)若干

3. 硬件接线说明

本项目中,我们使用了ESP32的特定GPIO引脚来连接各个模块。请严格按照下表进行接线。

模块模块引脚ESP32 GPIO引脚备注
OLED (I2C)VCC3.3V/5V供电
GNDGND接地
SCLGPIO 22I2C时钟线
SDAGPIO 21I2C数据线
DFPlayer MiniVCC5V供电
GNDGND接地
RXGPIO 17 (ESP32的RX2)DFPlayer的RX接ESP32的TX2
TXGPIO 16 (ESP32的TX2)DFPlayer的TX接ESP32的RX2
SPK_1/SPK_2扬声器直接连接8Ω 1W扬声器
WS2812B LEDVCC5V注意:需独立供电,ESP32的5V引脚电流不足
GNDGND接地
DINGPIO 13数据输入
语音按键一端GPIO 34内部上拉,接GND触发
另一端GND接地

重要提示:

  1. WS2812B供电: 9颗WS2812B全亮时电流较大,强烈建议为WS2812B灯带单独提供5V电源,并确保其GND与ESP32的GND共地。
  2. DFPlayer Mini: DFPlayer Mini的RX/TX引脚直接连接ESP32的硬件串口2 (GPIO16/17) 以确保通信稳定。

4. 开发环境搭建

本项目基于Arduino IDE或VS Code + PlatformIO进行开发。

4.1 安装ESP32开发板支持

  1. 打开Arduino IDE,进入 文件 -> 首选项
  2. 在“附加开发板管理器网址”中添加以下链接:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  3. 进入 工具 -> 开发板 -> 开发板管理器,搜索 esp32 并安装最新版本。
  4. 工具 -> 开发板 中选择ESP32型号(如 ESP32 Dev Module)。

4.2 安装所需库文件

本项目需要以下库文件。在Arduino IDE中,进入 工具 -> 管理库,搜索并安装:

库名称作用
U8g2驱动OLED显示屏
DFRobotDFPlayerMini驱动DFPlayer Mini语音模块
Adafruit NeoPixel驱动WS2812B RGB LED灯带
ArduinoJson解析API返回的JSON数据
HTTPClient用于发起HTTP请求获取天气和老黄历数据
NTPClient用于网络时间同步

5. API密钥获取与配置

本项目需要两个外部API服务:

5.1 和风天气 (QWeather)

用于获取实时和逐小时天气预报(包括温度和降水概率)。

  1. 访问 和风天气开发服务官网 注册账号。
  2. 在控制台创建项目,获取 Public IDKey
  3. 使用 GeoAPI 或在控制台查询所在城市的 Location ID
  4. 将获取到的信息替换源代码 (weather_alert_system.ino) 中的占位符:
    cpp
    const char* QWEATHER_KEY = "YOUR_QWEATHER_KEY";
    const char* QWEATHER_LOCATION = "YOUR_CITY_LOCATION_ID";

5.2 老黄历 API (以聚合数据为例)

用于获取每日宜忌信息。

  1. 访问 聚合数据官网Free-API 注册账号。
  2. 申请老黄历API服务,获取 AppKey
  3. 将获取到的信息替换源代码中的占位符:
    cpp
    const char* ALMANAC_KEY = "YOUR_ALMANAC_KEY";

6. DFPlayer Mini 语音文件准备

DFPlayer Mini 通过播放SD卡中特定路径和名称的MP3文件来实现语音播报。

  1. 准备一张MicroSD卡,格式化为FAT32格式。
  2. 在SD卡根目录下创建名为 mp3 的文件夹。
  3. 将语音文件命名为 0001.mp3, 0002.mp3, 0003.mp3 等,并存入 mp3 文件夹。

本项目中,我们预设了以下语音文件内容:

文件名对应预警级别建议播报内容
0001.mp3低温预警 (Level 1)“请注意,有低温预警,请多穿衣物。”
0002.mp3降雨预警 (Level 2)“请注意,有降雨预警,请携带雨具。”
0003.mp3双重预警 (Level 3)“请注意,有低温和降雨双重预警,请做好防范。”
0004.mp3无预警/老黄历播报“当前无异常天气预警。”
0005.mp3闹钟铃声(自定义闹钟铃声)

7. 源代码配置与烧录

  1. 打开 weather_alert_system.ino 源代码文件。
  2. 修改 Wi-Fi 配置:
    cpp
    const char* ssid = "Wi-Fi名称";
    const char* password = "Wi-Fi密码";
  3. 修改 API 密钥和 Location ID (参考 5. API密钥获取与配置)。
  4. 将ESP32开发板连接到电脑。
  5. 在Arduino IDE中,点击 上传 按钮,将代码烧录到ESP32中。

8. 核心功能实现逻辑

8.1 异常天气预警 (LED)

系统通过 WS2812B LED 实现物理可见的预警,共使用9颗LED,分为3组,每组3颗,对应3个高峰时段:

时段编号时间范围LED位置 (索引)预警颜色定义
16:00 - 9:000, 1, 2蓝色 (低温), 黄色 (降雨), 红色 (双重)
212:00 - 15:003, 4, 5蓝色 (低温), 黄色 (降雨), 红色 (双重)
317:00 - 19:006, 7, 8蓝色 (低温), 黄色 (降雨), 红色 (双重)

预警逻辑:

  • 低温预警: 当预报温度低于 TEMP_LOW_THRESHOLD (默认为5°C) 时触发。
  • 降雨预警: 当预报降水概率 (pop) 高于 RAIN_PROB_THRESHOLD (默认为50%) 时触发。
  • 在当前时段内,如果触发预警,对应的3颗LED将亮起相应的颜色。

8.2 语音播报

用户按下 GPIO 34 连接的按键后,系统将根据当前时间点的天气预警级别,播放对应的语音文件(0001.mp3 - 0003.mp3)。如果当前无预警,则播放无预警提示(0004.mp3)。

8.3 OLED显示

OLED显示屏用于展示核心信息:

  • 顶部: 实时时间 (NTP同步)。
  • 左侧: 当前天气(温度、降水概率、天气描述)。
  • 右侧: 老黄历信息(今日宜、忌)。
  • 底部: 当前是否处于预警时段的提示。

8.4 参数可设置性

在源代码中,可以轻松修改以下参数以自定义预警逻辑:

cpp
// 预警阈值设置
const int TEMP_LOW_THRESHOLD = 5; // 低温预警阈值 (°C)
const int RAIN_PROB_THRESHOLD = 50; // 降雨概率预警阈值 (%)

// 闹钟设置 (在 checkAlarm() 函数中)
const int ALARM_HOUR = 7;
const int ALARM_MINUTE = 0;

9. 总结

本系统结合了物联网、嵌入式编程和多媒体交互技术,实现了对异常天气的智能监控和多感官预警。通过模块化的设计,可以根据需求进一步扩展功能,例如增加贪睡按键、通过Web界面设置闹钟和预警阈值等。