news 2026/4/30 15:26:22

ESP32玩转ST7735屏:除了显示中文,如何用urequests获取天气并展示?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP32玩转ST7735屏:除了显示中文,如何用urequests获取天气并展示?

ESP32联网天气站:用ST7735屏打造动态气象信息中心

当ESP32遇上ST7735屏幕,简单的文字显示已经不能满足开发者的探索欲望。今天,我们将突破静态显示的局限,打造一个能实时获取并展示天气信息的智能终端。这不仅仅是技术的堆砌,更是一次从"能显示"到"会思考"的跨越。

1. 环境准备与硬件连接

在开始之前,确保你已经完成了ESP32与ST7735屏幕的基础连接和显示测试。硬件连接方案如下:

ESP32引脚ST7735引脚备注
GNDGND共地
3.3VVDD电源
IO23SDA数据
IO18SCL时钟
IO22RST复位
IO21DC数据/命令选择
IO16CS片选
3.3VBLK背光

关键组件检查清单

  • ESP32开发板(建议使用ESP32-WROOM-32)
  • ST7735 1.8寸TFT屏幕
  • MicroUSB数据线
  • 杜邦线若干
  • 稳定的WiFi网络环境

2. 构建MicroPython开发环境

要让ESP32运行我们的天气站程序,首先需要搭建MicroPython环境。以下是详细步骤:

  1. 下载最新的MicroPython固件(建议版本1.19或更高)
  2. 使用esptool工具刷入固件:
    esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 esp32-20220618-v1.19.1.bin
  3. 安装必要的库文件:
    • st7735.py(屏幕驱动)
    • GB2312-12.fon(中文字库)
    • urequests.py(网络请求)

提示:使用ampy工具可以方便地上传文件到ESP32:ampy --port /dev/ttyUSB0 put st7735.py

3. 获取天气API服务

选择一个可靠的天气数据源至关重要。和风天气、OpenWeatherMap等都提供免费层级的API服务。这里以和风天气为例:

  1. 注册开发者账号并创建项目
  2. 获取API Key(通常需要1-2个工作日审核)
  3. 了解API调用方式:
    # 基础请求示例 import urequests url = "https://devapi.qweather.com/v7/weather/now?location=101010100&key=你的KEY" response = urequests.get(url) data = response.json()

API响应数据结构示例

{ "code": "200", "now": { "temp": "24", "feelsLike": "26", "text": "晴", "windDir": "东南风", "windScale": "3", "humidity": "40" } }

4. 实现动态天气显示系统

现在,我们将所有组件整合起来,创建一个完整的天气显示系统。

4.1 主程序框架

import network import urequests import json from machine import Pin, SPI import st7735 import time # 屏幕初始化 spi = SPI(2, baudrate=20000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23)) lcd = st7735.ST7735(128, 160, spi, dc=Pin(21), cs=Pin(16), rst=Pin(22), rot=0, bgr=0) lcd.font_load('./GB2312-12.fon') # WiFi配置 WIFI_SSID = "你的WiFi名称" WIFI_PASS = "你的WiFi密码" # 天气API配置 API_KEY = "你的API密钥" LOCATION = "101010100" # 城市代码

4.2 WiFi连接模块

稳定的网络连接是获取天气数据的前提。我们实现一个带错误处理的连接函数:

def connect_wifi(): wifi = network.WLAN(network.STA_IF) if not wifi.isconnected(): wifi.active(True) wifi.connect(WIFI_SSID, WIFI_PASS) max_retry = 10 while not wifi.isconnected() and max_retry > 0: max_retry -= 1 time.sleep(1) if not wifi.isconnected(): lcd.fill(0) lcd.text("WiFi连接失败", 10, 40, 0xF800) lcd.show() return False lcd.fill(0) lcd.text("IP:" + wifi.ifconfig()[0], 10, 50, 0x07E0) lcd.show() return True

4.3 天气数据获取与解析

def get_weather(): try: url = f"https://devapi.qweather.com/v7/weather/now?location={LOCATION}&key={API_KEY}" response = urequests.get(url) if response.status_code == 200: data = response.json() response.close() return data['now'] else: return None except Exception as e: print("获取天气失败:", e) return None

4.4 界面设计与数据展示

优秀的可视化能让信息一目了然。我们设计一个包含温度、天气状况和舒适度的显示布局:

def display_weather(weather): lcd.fill(0) # 温度显示(大字号效果) temp = weather['temp'] lcd.text(f"{temp}°C", 30, 20, 0xF800) # 天气状况 condition = weather['text'] lcd.text(condition, 40, 50, 0xFFFF) # 附加信息 lcd.text(f"湿度: {weather['humidity']}%", 10, 80, 0x07E0) lcd.text(f"风速: {weather['windScale']}级", 10, 100, 0x07E0) lcd.show()

5. 系统优化与进阶技巧

5.1 定时更新策略

频繁请求API可能导致被封禁,我们实现一个智能更新机制:

# 在程序主循环中添加 last_update = 0 update_interval = 1800 # 30分钟更新一次 while True: current_time = time.time() if current_time - last_update > update_interval: if connect_wifi(): weather = get_weather() if weather: display_weather(weather) last_update = current_time time.sleep(10) # 短暂休眠减少功耗

5.2 低功耗优化

对于电池供电的场景,功耗控制尤为重要:

  1. 在非更新时段将WiFi模块关闭
  2. 降低屏幕亮度或间歇关闭背光
  3. 使用ESP32的深度睡眠模式
# 深度睡眠示例 def deep_sleep(seconds): import machine rtc = machine.RTC() rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP) rtc.alarm(rtc.ALARM0, seconds * 1000) machine.deepsleep()

5.3 多城市切换

通过按钮或触摸输入实现多城市切换:

from machine import TouchPad, Touch # 初始化触摸引脚 touch = Touch(Pin(4)) cities = { '北京': '101010100', '上海': '101020100', '广州': '101280101' } current_city = '北京' def check_touch(): if touch.read() < 40: # 阈值根据实际情况调整 return True return False # 在主循环中添加 if check_touch(): # 切换城市逻辑 pass

6. 故障排除与常见问题

问题1:屏幕显示乱码

  • 检查字库文件是否正确上传
  • 确认文本编码为GB2312
  • 重新初始化屏幕驱动

问题2:网络连接不稳定

  • 检查WiFi信号强度
  • 增加连接重试次数
  • 验证路由器是否限制了IoT设备连接

问题3:API请求失败

  • 确认API密钥有效
  • 检查网络时间是否正确(NTP同步)
  • 验证请求URL是否正确拼接

性能优化检查表

  • [ ] 使用连接池复用HTTP连接
  • [ ] 对天气数据实现本地缓存
  • [ ] 优化屏幕刷新区域而非全屏刷新
  • [ ] 对JSON解析进行错误捕获

这个天气站项目只是ESP32联网能力的冰山一角。在实际部署中,我发现将屏幕刷新频率控制在1Hz以内既能保证信息实时性,又能显著降低系统功耗。对于户外使用场景,可以考虑增加一个光敏电阻来自动调节屏幕亮度,这在强光环境下特别有用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 15:23:59

AI Agent安全框架设计:分层防御与意图理解构建可靠智能体

1. 项目概述&#xff1a;构建AI Agent的安全“罗盘”最近在AI Agent的开发圈子里&#xff0c;关于“安全性”的讨论越来越热。大家不再只关注Agent能做什么、有多聪明&#xff0c;而是开始严肃思考&#xff1a;这个能自主决策、执行任务的智能体&#xff0c;会不会在某个环节“…

作者头像 李华
网站建设 2026/4/30 15:23:47

通过 Taotoken CLI 工具一键配置团队开发环境与模型密钥

通过 Taotoken CLI 工具一键配置团队开发环境与模型密钥 1. Taotoken CLI 工具概述 Taotoken CLI 工具&#xff08;taotoken/taotoken&#xff09;是为开发者提供的命令行工具&#xff0c;支持通过交互式菜单或子命令快速配置 API Key 和模型参数。该工具特别适合团队统一管理…

作者头像 李华
网站建设 2026/4/30 15:19:26

2026最权威的十大AI辅助写作神器实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下&#xff0c;人工智能生成内容越来越普遍&#xff0c;降低AIGC检测概率成了内容创作者的…

作者头像 李华