一、項目概述與硬件架構
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
/* 工程包含的核心庫 */
#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
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
// 漢字顯示函數實現
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
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
{"results": [{"location": {"name":"廣州"},"now": {"text":"晴","temperature":"28","code":"1"}}]
}
解析實現:
c
Copy
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
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
typedef 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)
- 參與開源硬件社區交流