一、项目概述与硬件架构
1.1 核心功能
本智能天气时钟系统集成了实时天气获取、网络时间同步、环境监测和低功耗管理四大核心功能:
- 网络数据获取 :
- 通过ESP8266 WiFi模块连接心知天气API(每小时更新)
- 获取北京标准时间服务器的时间数据
- 支持未来3天天气预报查询
- 环境监测 :
- DHT11温湿度传感器实时监测
- 数据刷新周期5秒(可配置)
- 显示系统 :
- 2.4寸240x240分辨率TFT-LCD
- 多级菜单显示架构(主界面/天气详情/历史数据)
- 自定义中文字库(GB2312编码)
- 电源管理 :
- STM32 STOP模式待机(<10μA)
- RTC唤醒定时器控制
- 光感自动背光调节
1.2 硬件架构图
[STM32F103C8T6] <-SPI-> [TFT-LCD]
| |
UART2 GPIO_DHT11
|
[ESP8266]
|
[WiFi Router]
1.3 关键硬件选型
模块 | 型号 | 接口类型 | 关键参数 |
---|---|---|---|
主控芯片 | STM32F103C8T6 | - | 72MHz Cortex-M3 |
WiFi模块 | ESP-01S | UART@115200 | 802.11 b/g/n |
显示屏 | ILI9341 | SPI | 240x240@60fps |
温湿度传感器 | DHT11 | 单总线 | ±2℃/±5%RH精度 |
实时时钟 | 内部RTC | - | LSI 40kHz校准 |
二、软件开发环境搭建
2.1 工具链配置
- IDE:Keil uVision5(MDK-ARM V5.36)
- 编译器:ARMCC V6.16
- 调试工具:ST-Link V2/J-Link EDU
- 版本控制:Git + Source Insight 4.0
2.2 关键库文件
c
Copy
c
/* 工程包含的核心库 */
#include "stm32f10x.h" // 标准外设库
#include "cJSON.h" // JSON解析库(内存优化版)
#include "esp8266_at.h" // ESP8266驱动库
#include "lcd_gui.h" // 图形界面库
#include "dht11_driver.h" // 传感器驱动
2.3 工程目录结构
/Project
├── CMSIS // 内核支持文件
├── STM32F10x_StdPeriph // 标准外设库
├── User
│ ├── main.c // 主程序
│ ├── esp8266.c/h // WiFi驱动
│ ├── lcd_driver.c/h // 显示屏驱动
│ ├── gui_fonts.c // 字库文件
│ └── cJSON.c/h // JSON解析器
├── Output // 编译输出
└── Doc // 设计文档
三、关键模块实现解析
3.1 WiFi通信模块
电路设计要点:
- ESP8266模块采用独立3.3V供电
- UART2配置115200波特率(8N1)
- CH_PD引脚需上拉到3.3V
- GPIO连接状态指示灯
AT指令处理流程:
c
Copy
c
bool ESP8266_SendCmd(const char* cmd, const char* ack) {
USART_SendString(USART2, cmd);
return Wait_ACK(ack, 2000); // 超时2秒
}
void Get_WeatherData() {
ESP8266_CreateTCP("api.seniverse.com",80);
ESP8266_SendRequest("GET /v3/weather/now.json?key=YOUR_KEY");
Parse_JSON_Response();
}
典型AT指令序列:
- AT+CWMODE=1 // 设置为Station模式
- AT+CWJAP="SSID","PWD" // 连接WiFi
- AT+CIPSTART="TCP","api.seniverse.com",80
- AT+CIPSEND=64 // 发送GET请求
- +++ // 退出透传模式
3.2 图形显示系统
显示驱动优化:
- 采用DMA加速SPI传输(最高18Mbps)
- 双缓冲机制减少闪烁
- 区域刷新策略降低功耗
c
Copy
c
// 汉字显示函数实现
void LCD_ShowChinese(u16 x, u16 y, u8 *str, u16 fc, u16 bc) {
while(*str) {
Get_GBK_Code(str, font_buf); // 提取字模
Draw_Char_16x16(x, y, font_buf, fc, bc);
x += 16;
str += 2;
}
}
界面布局设计:
+-----------------------+
| 广州 28℃ 晴 | 状态栏
+-----------------------+
| 12:59:45 | 数字时钟
| 2024-01-20 周五 |
+-----------------------+
| 温度:25℃ 湿度:60% | 环境数据
| 未来三天天气预报 |
+-----------------------+
3.3 低功耗管理
电源模式选择:
- RUN模式:72MHz全速运行
- SLEEP模式:CPU停止,外设运行
- STOP模式:1.8V域关闭(保留SRAM)
- STANDBY模式:最低功耗
c
Copy
c
void Enter_Stop_Mode() {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
SystemInit(); // 唤醒后重新初始化时钟
}
唤醒源配置:
- RTC闹钟(每日23:59:59进入,06:00:00唤醒)
- EXTI按键中断(PA0-WKUP引脚)
- 串口数据接收中断
四、数据解析与处理
4.1 JSON数据解析
心知天气API响应示例:
json
Copy
json
{
"results": [{
"location": {"name":"广州"},
"now": {
"text":"晴",
"temperature":"28",
"code":"1"
}
}]
}
解析实现:
c
Copy
c
typedef struct {
char name[16];
WeatherNow now;
} WeatherResult;
void Parse_Weather_JSON(char *json) {
cJSON *root = cJSON_Parse(json);
cJSON *results = cJSON_GetObjectItem(root, "results");
cJSON *location = cJSON_GetObjectItem(results, "location");
strcpy(result.name, cJSON_GetString(location, "name"));
cJSON *now = cJSON_GetObjectItem(results, "now");
result.now.temp = atoi(cJSON_GetString(now, "temperature"));
strcpy(result.now.text, cJSON_GetString(now, "text"));
}
4.2 时间同步协议
NTP校时流程优化:
- 计算网络延时:δ = (t3 - t0) - (t2 - t1)
- 时钟偏差:θ = (t1 - t0 + t2 - t3)/2
- 平滑调整:每次校时不超过±2秒
c
Copy
c
void Sync_NTP_Time() {
Send_NTP_Request();
uint32_t t0 = Get_Timestamp();
// ... 接收响应
uint32_t t3 = Get_Timestamp();
int32_t offset = (t1 - t0 + t2 - t3) / 2;
RTC_Adjust(offset);
}
五、系统调试与优化
5.1 常见问题排查
- WiFi连接失败 :
- 检查AT指令响应时间(增加延时)
- 验证WPA2加密兼容性
- 捕获空中数据包分析
- 显示异常 :
- 测量SPI时钟信号完整性
- 检查FSMC时序配置(TFT模式)
- 验证GRAM刷新率(不低于30fps)
- 功耗过高 :
- 关闭未用外设时钟(ADC/DAC)
- 配置IO口为模拟输入模式
- 优化任务调度周期
5.2 性能优化策略
-
内存优化:
- 启用压缩存储(Weather数据采用位域)
c
Copy
ctypedef struct { uint8_t code : 6; uint8_t temp : 7; } WeatherNow;
-
通信优化:
- 采用HTTP长连接(Keep-Alive)
- GZIP压缩JSON数据
- 差分更新机制(仅获取变化数据)
-
显示优化:
- 启用区域刷新(ILI9341的Partial Mode)
- 建立显示缓存区(240x240x2=115KB)
- 采用DMA2D加速图形渲染
六、项目扩展方向
6.1 硬件扩展
- 增加PM2.5传感器(GP2Y1010AU0F)
- 集成语音模块(SYN6288)
- 添加SD卡存储历史数据
- 太阳能供电系统
6.2 软件增强
- 实现OTA无线升级
- 开发手机端控制APP(基于BLE)
- 增加机器学习预测功能
- 接入智能家居平台(HomeAssistant)
6.3 产品化改进
- 通过EMC测试(辐射/传导发射)
- 进行高低温循环测试(-20℃~70℃)
- 优化注塑外壳设计
- 申请FCC/CE认证
七、总结与学习建议
通过本项目的实践,开发者可以系统掌握以下技能:
- 嵌入式网络编程 :
- TCP/IP协议栈基本原理
- HTTP客户端实现技巧
- JSON数据解析方法
- 低功耗设计 :
- 电源模式转换机制
- 动态电压频率调节(DVFS)
- 唤醒源配置策略
- 人机交互开发 :
- 图形界面框架设计
- 触摸屏驱动开发
- 多级菜单实现
建议学习路径:
- 先理解各模块独立工作原理
- 使用逻辑分析仪验证通信时序
- 分阶段实现功能(先显示后联网)
- 学习使用版本控制系统(Git)
- 参与开源硬件社区交流