基于STM32的ESP8266天气时钟(1)---------AT指令连接心知天气API

📅 2026/7/15 8:30:08
基于STM32的ESP8266天气时钟(1)---------AT指令连接心知天气API
1. 项目背景与硬件准备一直想做个能显示天气和时间的小设备最近终于抽空实现了这个想法。用STM32搭配ESP8266模块获取网络天气数据整个过程比想象中简单很多。这个项目特别适合刚接触物联网开发的初学者既能学习串口通信又能掌握HTTP请求和JSON解析等实用技能。核心硬件清单主控芯片STM32F103C8T6最小系统板性价比高资料丰富WiFi模块正点原子ATK-ESP8266兼容ESP-01S固件调试工具CH340 USB转TTL模块建议选择带自动下载电路的版本供电方案3.3V稳压模块ESP8266对电压敏感必须稳定供电实际选购时ESP8266模块要注意固件版本。我用的固件版本是AT V1.7.4.0支持透传模式。如果遇到AT指令不响应的情况可能需要先用Flash下载工具刷入最新固件。硬件连接时特别注意ESP8266的RX接TTL模块的TXTX接RXVCC必须接3.3V5V会直接烧毁模块。2. 开发环境搭建软件工具链串口调试助手QCOM支持指令保存功能IDEKeil MDK社区版即可JSON解析库cJSON轻量级适合嵌入式系统第一次使用ESP8266时建议先用串口调试助手手动发送AT指令测试模块状态。打开QCOM后选择正确的COM口设备管理器里查看波特率设置为115200新固件默认值勾选发送新行选项AT指令需要回车符测试时发送AT正常会返回OK。如果返回乱码检查波特率设置如果无响应检查接线和供电。我在调试时就遇到过供电不足导致模块不稳定的情况后来换用独立3.3V电源后问题解决。3. 心知天气API配置心知天气提供免费的天气数据API申请流程注册账号后进入控制台在产品服务中选择天气数据申请免费版每日500次调用足够测试用获取API密钥形如SADF1234ABCD5678关键API参数说明请求地址https://api.seniverse.com/v3/weather/now.json必填参数?key您的API密钥 location城市拼音如beijing languagezh-Hans unitc实测发现location参数支持中文拼音或Location ID。例如查询北京天气可以用beijing或WX4FBXXFKE4F。建议先在浏览器测试API返回数据是否正常。4. AT指令实战详解4.1 基础配置流程完整的AT指令序列如下每个指令后需等待OK响应ATCWMODE1 # 设置为Station模式 ATRST # 重启使模式生效 ATCIPMUX0 # 单连接模式 ATCWJAPSSID,密码 # 连接WiFi建议用2.4G网络连接WiFi时最容易出问题。我遇到过两种典型情况返回FAIL检查SSID/密码是否正确路由器是否开启了MAC过滤返回WIFI DISCONNECT尝试将路由器信道固定在1/6/11避免自动信道切换4.2 TCP连接与透传设置建立TCP连接的完整指令流ATCIPSTARTTCP,api.seniverse.com,80 # 连接心知服务器 ATCIPMODE1 # 开启透传模式 ATCIPSEND # 进入透传发送模式 GET https://api.seniverse.com/v3/weather/now.json?keyYOUR_KEYlocationshenzhen HTTP/1.1 Host: api.seniverse.com Connection: close 这里有几个关键细节HTTP请求头必须包含Host字段最后需要两个回车换行表示请求结束退出透传模式需要先发送不带回车再发ATCIPCLOSE5. 数据接收与处理5.1 原始数据示例成功请求后会收到如下格式的JSON数据已简化{ results: [{ location: { name: 深圳, country: CN }, now: { text: 晴, temperature: 28, wind_direction: 东南 } }] }5.2 串口中断处理技巧在STM32中建议使用串口空闲中断接收数据// 串口配置示例 huart1.Instance USART1; huart1.Init.BaudRate 115200; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; HAL_UART_Init(huart1); // 启用空闲中断 __HAL_UART_ENABLE_IT(huart1, UART_IT_IDLE);在中断回调函数中处理数据void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { // 处理接收到的数据 parse_weather_data(rx_buffer); // 重新启动接收 HAL_UART_Receive_IT(huart1, rx_buffer, BUFFER_SIZE); } }6. 常见问题排查问题1AT指令无响应检查接线TX/RX是否交叉连接测量电压确保3.3V稳定建议用万用表实测尝试降低波特率有些模块默认是9600问题2TCP连接失败测试网络连通性先用ATPINGapi.seniverse.com检查DNS解析检查防火墙有些路由器会阻止外出80端口问题3JSON数据解析异常确保接收完整检查HTTP头中的Content-Length验证JSON格式使用在线JSON校验工具处理编码问题中文可能会以Unicode形式返回实际开发中建议每完成一个步骤就通过串口打印调试信息。比如连接WiFi成功后可以调用ATCIFSR打印获取的IP地址方便后续排查网络问题。