资讯动态

基于STM32的天气时钟复现指南:ST7735 SPI驱动与AT指令联网实战

发布时间:2026/10/15 22:33:56 来源:尧图企业网站定制
1. 从零复现 STM32 天气时钟硬件清单与工程结构先理清STM32 天气时钟这个项目说白了就是让一块单片机通过串口指挥 ESP32 联网把心知天气的数据拉回来再驱动 ST7735 SPI 屏幕把温度、天气图标、时间显示出来。它适合已经点过 LED、跑过串口实验但还没完整做过一个“联网显示”综合项目的嵌入式初学者。我试过把整个流程拆成硬件、工程、驱动、联网、显示五块按顺序推进基本不会卡死。先看硬件清单这是复现的地基。核心板选 STM32F103C8T6 就行便宜且资料多下载器用 JLink OB 或者 ST-Link 都可以USB 转 TTL 模块负责给 ESP32-C3 发 AT 指令和看日志面包板加三种杜邦线公对公、公对母、母对母用来飞线。外设模块包括ST7735 SPI 屏、ESP32-C3 模组、热敏电阻模块、W25Q Flash、AT24C02 EEPROM、按键模块、MPU6050。这些模块不是全部必须但原项目都用了复现时建议先只接屏幕和 ESP32跑通主链路后再补其他传感器。软件资源方面图标去 iconfont 下载 48x48 像素的天气图标用 LVGL 的在线转换工具选 RGB565 模式生成 C 数组心知天气注册后拿到私钥拼进请求 URL。VSCode 装两个插件Batch Rename 批量改文件名EditorConfig 统一缩进和行尾配置里写trim_trailing_whitespace true和insert_final_newline true避免保存时留下尾随空格导致编译警告。工程目录我建议这样组织Core/放 main.c 和中断处理Drivers/ST7735/放屏幕驱动Drivers/ESP32/放 AT 指令封装App/放天气解析和界面刷新逻辑Hardware/放 GPIO、SPI、USART 的底层初始化。这样分层的好处是屏幕不亮时你只查 ST7735 目录联网失败时只查 ESP32 目录不会一锅乱炖。知识点覆盖上这个项目会把 ADC热敏电阻、USARTAT 指令、DMA串口收数据、SPI屏幕、I2CEEPROM/MPU6050、中断按键、GPIO片选和复位全部串一遍。C 语言层面会用到const、static、typedef、回调函数和结构体封装这些在裸机里就是“面向对象”的雏形。先把这些概念过一遍后面看代码就不会觉得跳跃。2. TaoToken 前置准备API Key 与接入配置怎么拿这一章解决“联网能力从哪来”的问题。ESP32-C3 负责物理联网但如果你后续想在这个项目里加一个“AI 天气播报”或者“自然语言查询天气”的功能就需要一个稳定的模型 API 入口。TaoToken 在这里的角色是提供兼容 OpenAI 风格的接口让你用同一套 Base URL 和 Key 去调不同模型不用每个模型单独改代码。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号。注册流程不复杂邮箱加密码即可。登录后进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 在左侧找到 API Keys 页面点“创建新密钥”。Key 只显示一次复制后存到本地密码管理器或者工程根目录的.env文件里千万别直接提交到 Git。拿到 Key 之后Base URL 统一用 https://taotoken.net/api 注意这个地址后面不加 UTM 参数直接写进代码的base_url字段。模型 ID 根据你的用途选如果只是做天气文本润色选一个通用对话模型即可如果要做代码辅助选 coding 系列。模型对话入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 你可以在页面上直接测试 Key 是否可用。对于长期做嵌入式开发、需要反复调模型写驱动代码的场景可以看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 它比按次计费更适合高频使用。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有各语言的调用示例照着改就行。这里要提醒一点TaoToken 是模型 API 入口不是网络代理工具它不负责让你的 STM32 或 ESP32 连上互联网。ESP32 联网靠的是它自己的 Wi-Fi AT 指令TaoToken 只在你需要调用云端模型时使用。两者职责分开别混在一起排查。3. 可复制配置ST7735 SPI 初始化与 ESP32 AT 指令工程片段这一章给可直接粘贴的配置片段。先看 ST7735 的 SPI 初始化。以 STM32 HAL 库为例SPI 配置成主机模式时钟极性低、相位第一边沿预分频先设 4 分频跑 18MHz 左右屏幕能亮再往上调。GPIO 方面CS 片选、DC 数据命令切换、RES 复位、BLK 背光各占一个引脚初始化时全部推挽输出。// st7735_init.c #include st7735.h static void ST7735_WriteCmd(uint8_t cmd) { HAL_GPIO_WritePin(ST7735_DC_PORT, ST7735_DC_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(ST7735_CS_PORT, ST7735_CS_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_GPIO_WritePin(ST7735_CS_PORT, ST7735_CS_PIN, GPIO_PIN_SET); } static void ST7735_WriteData(uint8_t *data, uint16_t len) { HAL_GPIO_WritePin(ST7735_DC_PORT, ST7735_DC_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(ST7735_CS_PORT, ST7735_CS_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, data, len, 1000); HAL_GPIO_WritePin(ST7735_CS_PORT, ST7735_CS_PIN, GPIO_PIN_SET); } void ST7735_Init(void) { HAL_GPIO_WritePin(ST7735_RES_PORT, ST7735_RES_PIN, GPIO_PIN_RESET); HAL_Delay(20); HAL_GPIO_WritePin(ST7735_RES_PORT, ST7735_RES_PIN, GPIO_PIN_SET); HAL_Delay(120); ST7735_WriteCmd(0x01); // SWRESET HAL_Delay(120); ST7735_WriteCmd(0x11); // SLPOUT HAL_Delay(120); ST7735_WriteCmd(0x3A); // COLMOD uint8_t colmod 0x05; // RGB565 ST7735_WriteData(colmod, 1); ST7735_WriteCmd(0x29); // DISPON HAL_Delay(50); }ESP32 的 AT 指令部分串口波特率先用 115200发AT看是否回OK。联网流程是ATCWMODE1设 station 模式ATCWJAPSSID,PASSWORD连 Wi-FiATCIPSTARTTCP,api.seniverse.com,80建 TCP 连接然后ATCIPSEND长度发 HTTP GET 请求。请求里把心知天气的私钥拼进去格式类似GET /v3/weather/now.json?key你的私钥locationbeijinglanguagezh-Hansunitc。// esp32_at.c 片段 void ESP32_GetWeather(void) { ESP32_SendCmd(ATCWMODE1\r\n, OK, 2000); ESP32_SendCmd(ATCWJAP\你的WiFi\,\你的密码\\r\n, WIFI GOT IP, 15000); ESP32_SendCmd(ATCIPSTART\TCP\,\api.seniverse.com\,80\r\n, CONNECT, 5000); char req[256]; snprintf(req, sizeof(req), GET /v3/weather/now.json?key你的私钥locationbeijinglanguagezh-Hansunitc HTTP/1.1\r\n Host: api.seniverse.com\r\nConnection: close\r\n\r\n); char cmd[32]; snprintf(cmd, sizeof(cmd), ATCIPSEND%d\r\n, strlen(req)); ESP32_SendCmd(cmd, , 2000); HAL_UART_Transmit(huart2, (uint8_t*)req, strlen(req), 5000); }如果你用 Cline 或 CC Switch 这类工具做辅助开发配置三件套要写全Base URL 填 https://taotoken.net/api Key 填你创建的密钥Model ID 填你选的模型名。Codex 的auth.json里对应字段是api_base和api_key别写错键名。4. 验证请求与成功结果屏幕点亮与天气数据回显配置写完先验证屏幕。烧录后如果屏幕白屏或花屏先查 SPI 时钟是否太快降到 9MHz 试试再查 DC 引脚是否接反DC 为低是命令、为高是数据接反了屏幕会完全不响应。正常初始化后屏幕会先黑一下再亮起背光引脚给高电平就能看到底色。屏幕验证通过后单独测 ESP32。用 USB 转 TTL 接 ESP32 的 TX/RX电脑串口助手发AT回OK说明模组活着。发ATCWJAP?查是否已连上 Wi-Fi。连上后发ATCIPSTART建 TCP再发ATCIPSEND串口会回提示符这时候把 HTTP 请求贴进去正常会收到类似下面的响应{results:[{location:{id:WX4FBXXFKE4F,name:北京,country:CN,path:北京,北京,中国,timezone:Asia/Shanghai,timezone_offset:08:00},now:{text:晴,code:0,temperature:25},last_update:2024-01-01T12:00:0008:00}]}看到temperature和text字段就说明联网取数成功。接下来在 STM32 里用 USART 中断加 DMA 接收把 JSON 里的温度值解析出来。解析可以用简单的字符串查找找到temperature:后取后面两位数字转成整数再送显示。时间用 SNTP 命令ATCIPSNTPCFG1,8,ntp.aliyun.com配好时区再ATCIPSNTPTIME?拿时间戳用localtime转换后显示。显示刷新逻辑先画背景色再用 ST7735 的SetWindow函数定位到温度区域把字模数据写进去。天气图标用 LVGL 转出来的 RGB565 数组直接按像素写。实测下来整屏刷新一次大概 30ms每秒刷一次完全不闪。5. 本篇常见错排查401、local proxy failed 与 reading choices 报错第一个高频错误是 401。如果你在调模型 API 时看到401 Unauthorized九成是 Key 写错或者 Base URL 少了/api。检查Authorization头是不是Bearer 你的Key注意 Bearer 后面有一个空格。另外 Key 如果复制时带了换行符也会导致 401用trim()去一下首尾空白。第二个是local proxy failed。这个报错通常出现在你用本地工具转发请求时本地转发服务没启动或者端口被占。排查顺序先确认转发进程在跑再netstat -ano | findstr 端口号看端口是否被占用最后检查防火墙有没有拦。如果你没开本地转发那这个报错说明配置里误填了localhost地址把 Base URL 改回 https://taotoken.net/api 即可。第三个是reading choices相关报错一般出现在解析模型返回时。模型返回的 JSON 里choices数组为空或者你取的字段路径不对。打印完整响应体确认choices[0].message.content存在。如果返回的是流式数据要按 SSE 格式逐行解析不能一次性json.loads。第四个是 OAuth 相关报错。如果你用 Claude Code 或类似工具报OAuth token expired说明登录态过期了。重新走一遍授权流程或者改用 API Key 方式接入。Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有 Anthropic 兼容接口的配置说明。硬件侧常见错屏幕不亮先查背光引脚和复位时序ESP32 不回 OK 查波特率和 TX/RX 是否交叉DMA 接收丢数据查缓冲区大小和空闲中断是否开启。每个错误都对应一个具体检查点别跳步。6. 语义一致 CTA按场景选对入口继续深入如果你卡在排障和接入环节比如 Key 拿不到、Base URL 填错、401 反复出现直接去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 重新生成密钥再对照接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 逐行核对配置。如果你只是想先验证某个模型能不能用、返回格式对不对去模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 直接发一条测试消息看响应是否正常比在代码里反复烧录快得多。如果你打算长期在这个天气时钟项目上叠加 AI 功能比如语音播报、自然语言查天气、自动生成界面代码那 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 更适合你按周期计费比按次调用省心。Claude Code 的 Anthropic 兼容接入看 https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有完整的 Base URL、Key、Model ID 三件套写法。最后说一个实用技巧把 ST7735 的初始化命令序列和 ESP32 的 AT 指令流程分别存成两个.md笔记每次换屏幕型号或换 Wi-Fi 环境时只改对应文件不用翻整个工程。这个习惯能帮你省下大量重复排查的时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑