内容介绍
内容介绍
一、所选主题和项目介绍
1.1 项目背景
在智能家居和桌面装饰场景中,一款能够自动更新壁纸并显示时间的设备具有很高的实用价值。Bing每日壁纸以其高质量和多样性著称,本项目利用M5Stack Tab5的高分辨率屏幕,实现了一款能够自动获取并显示Bing每日壁纸的时钟应用。
1.2 项目目标
本项目使用M5Stack Tab5开发板,实现一款Bing每日壁纸时钟,主要功能如下:
- 自动获取壁纸:每天自动从Bing获取当日壁纸
- 网络时间同步:通过NTP服务器同步准确时间
- 实时时钟显示:在壁纸上叠加显示当前时间、日期和星期
- WiFi自动重连:网络断开时自动重新连接
- 横屏满屏显示:支持横屏显示,壁纸填满整个屏幕
1.3 创新点
- 自动壁纸更新:每天自动获取Bing每日壁纸,无需手动更换
- 网络时间同步:通过NTP确保时间准确
- WiFi自动管理:自动连接和重连WiFi,无需人工干预
- 高清显示:利用Tab5的1280x720高分屏,显示清晰的壁纸和时钟
- 层级管理:壁纸和时钟标签分层显示,确保时钟始终可见
二、硬件介绍
2.1 主控设备
M5Stack Tab5 (SKU: K132) — 基于ESP32的高性能平板设备,配备10.1英寸IPS显示屏,分辨率1280x720,支持WiFi和蓝牙通信。
参数 | 规格 |
|---|---|
主控芯片 | ESP32,双核240MHz |
显示屏 | 10.1英寸 IPS,1280×720 |
内存 | 8MB PSRAM |
存储 | 16MB Flash |
网络 | WiFi 802.11 b/g/n |
电源 | USB-C 供电 |



2.2 硬件连接
Tab5为一体化设备,无需额外硬件连接,直接通过USB-C供电即可工作。
三、方案框图和项目设计思路
3.1 系统架构
┌─────────────────┐
│ Bing API │
│ (壁纸服务) │
└────────┬────────┘
│
│ HTTP
│
▼
┌─────────────────┐
│ NTP Server │
│ (时间服务) │
└────────┬────────┘
│
│ UDP
│
▼
┌─────────────────┐
│ Tab5 │
│ (显示终端) │
└─────────────────┘
3.2 设备启动流程
┌─────────────┐
│ 设备启动 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 连接WiFi │
└──────┬──────┘
│
▼
┌─────────────┐
│ 同步网络时间 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 获取Bing壁纸 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 显示壁纸时钟 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 主循环运行 │
│ 更新时间 │
│ 检查壁纸更新│
└─────────────┘
3.3 核心模块设计
网络管理模块
- 自动连接WiFi
- 定期检查连接状态
- 断线自动重连
Bing壁纸模块
- 调用Bing HPImageArchive API
- 解析JSON获取壁纸URL
- 下载并保存图片到本地
时钟显示模块
- 使用NTP同步网络时间
- 使用Widgets.Label显示时间、日期、星期
- 每秒更新一次显示
四、软件流程图和关键代码介绍
4.1 主程序结构
"""
TAB5 Bing Daily Wallpaper Clock
功能特性:
1. 自动获取Bing每日壁纸
2. 网络时间同步
3. 实时时钟显示
4. WiFi自动重连
"""
4.2 网络管理
class NetworkManager:
"""网络管理器"""
def __init__(self):
self.wlan = network.WLAN(network.STA_IF)
self.connected = False
def wait_for_connection(self, timeout=30):
"""等待WiFi连接"""
while not self.is_connected():
if time.time() - start >= timeout:
return False
time.sleep(1)
return True
def check_and_reconnect(self):
"""检查并重新连接"""
if not self.is_connected():
return self.reconnect()
return True
4.3 Bing壁纸获取
class BingWallpaper:
"""Bing壁纸获取器"""
BING_API_URL = "http://www.bing.com/HPImageArchive.aspx"
def fetch_wallpaper_info(self):
"""获取壁纸信息"""
url = "{}?format=js&idx=0&n=1&mkt=zh-CN".format(self.BING_API_URL)
response = requests2.get(url)
data = ujson.loads(response.content)
self.image_url = self.BING_DOMAIN + data["images"][0]["url"]
return True
def download_image(self, save_path="/flash/wallpaper.jpg"):
"""下载壁纸图片"""
response = requests2.get(self.image_url)
with open(save_path, "wb") as f:
f.write(response.content)
return True
4.4 时钟显示
class ClockDisplay:
"""时钟显示"""
def create_labels(self):
"""创建标签控件"""
self.label_time = Widgets.Label(
"--:--:--", 340, 180, 1.5,
0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu72
)
self.label_date = Widgets.Label(
"----/--/--", 440, 300, 1.2,
0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu40
)
self.label_week = Widgets.Label(
"--------", 440, 360, 1.2,
0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu40
)
def sync_time(self):
"""同步网络时间"""
ntptime.settime()
self.time_synced = True
4.5 壁纸显示
def update_wallpaper():
"""更新壁纸"""
if wallpaper.fetch_wallpaper_info():
if wallpaper.download_image("/flash/wallpaper.jpg"):
# 满屏显示壁纸
Lcd.drawJpg("/flash/wallpaper.jpg", 0, 0, 1280, 720)
# 重新创建标签确保可见
clock.create_labels()
clock.update_display()
五、硬件功能展示图及说明
5.1 显示界面

5.1.1 启动界面
==================================================
TAB5 Bing Wallpaper Clock
==================================================
[Network] Waiting for WiFi connection...
[Network] WiFi connected, IP: 192.168.1.25
[Main] Syncing network time...
[Clock] Time sync successful
[Main] Fetching Bing wallpaper...
[Bing] Wallpaper title: 野外奇观
[Main] Wallpaper updated and displayed
[Main] System initialization complete
5.1.2 运行状态
- 屏幕显示Bing每日壁纸(满屏)
- 时间显示在屏幕中央(大号字体)
- 日期和星期显示在时间下方(中号字体)
- 横屏显示,视觉效果好
5.2 系统运行日志
==================================================
TAB5 Bing Wallpaper Clock
==================================================
[Network] Waiting for WiFi connection...
[Network] WiFi connected, IP: 192.168.1.25
[Main] Syncing network time...
[Clock] Syncing network time...
[Clock] Time sync successful
[Main] Fetching Bing wallpaper...
[Bing] Request URL: http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN
[Bing] Wallpaper title: 野外奇观
[Bing] Image URL: http://www.bing.com/th?id=OHR.AndeanBear_ZH-CN6152330738_1920x1080.jpg
[Bing] Downloading image...
[Bing] Image saved to: /flash/wallpaper.jpg
[Bing] Image size: 334858 bytes
[Main] Wallpaper updated and displayed
[Main] System initialization complete
六、设计中遇到的难题和解决方法
6.1 网络连接问题
问题描述:程序启动时WiFi可能尚未连接,导致时间同步和壁纸获取失败。
解决方案:
- 实现NetworkManager类管理WiFi连接
- 添加等待连接机制,最多等待30秒
- 主循环中定期检查连接状态,断线自动重连
def wait_for_connection(self, timeout=30):
"""等待WiFi连接"""
while not self.is_connected():
if time.time() - start >= timeout:
return False
time.sleep(1)
return True
6.2 图片显示层级问题
问题描述:使用Lcd.drawJpg显示壁纸后,会覆盖Widgets.Label创建的时钟标签。
解决方案:
- 分析层级关系:Lcd.drawJpg绘制在底层,Widgets.Label是LVGL组件
- 在显示壁纸后重新创建标签
- 确保时钟标签显示在壁纸上层
Lcd.drawJpg(image_path, 0, 0, 1280, 720)
# 重新创建标签确保可见
clock.create_labels()
clock.update_display()
6.3 屏幕旋转和适配
问题描述:需要横屏显示,且图片要填满屏幕。
解决方案:
- 使用Widgets.setRotation(3)设置横屏
- 使用Lcd.drawJpg的宽高参数拉伸图片
- 调整标签位置适应横屏布局
Widgets.setRotation(3) # 横屏显示
Lcd.drawJpg(image_path, 0, 0, 1280, 720) # 满屏显示
6.4 字体大小和位置调整
问题描述:时间、日期、星期字体大小不合适,位置可能超出屏幕或相互遮挡。
解决方案:
- 时间使用DejaVu72字体,缩放1.5倍
- 日期和星期使用DejaVu40字体,缩放1.2倍
- 调整位置避免重叠和超出屏幕
self.label_time = Widgets.Label("--:--:--", 340, 180, 1.5, ...)
self.label_date = Widgets.Label("----/--/--", 440, 300, 1.2, ...)
self.label_week = Widgets.Label("--------", 440, 360, 1.2, ...)
七、心得体会
7.1 项目收获
- 物联网应用开发:掌握了基于ESP32的物联网应用开发流程
- 网络编程:学会了使用HTTP请求获取网络资源
- 时间同步:了解了NTP协议和时间同步机制
- UI设计:熟悉了UiFlow2的Widgets组件和屏幕布局
- 错误处理:学会了处理网络异常和设备错误
- 代码调试:通过修复语法错误,掌握了Python语法规范,特别是if、while、with等语句需要冒号结尾的规则
7.2 技术亮点
- 自动壁纸更新:每天自动获取Bing每日壁纸
- 网络时间同步:确保时钟准确
- WiFi自动管理:无需手动配置网络
- 高清显示:利用Tab5高分屏显示精美壁纸
- 层级管理:壁纸和时钟分层显示
7.3 改进建议
- 天气显示:增加当地天气信息显示
- 多壁纸源:支持多个壁纸源切换
- 定时开关机:支持定时开关机功能
- 触摸交互:增加触摸切换壁纸功能
- 语音播报:增加整点语音播报功能
- 节日主题:特殊节日显示主题壁纸
- 相册功能:支持显示本地相册图片
- 亮度调节:根据时间自动调节屏幕亮度
创意方向关联
本项目的技术创新为以下创意方向提供了新的思路:
1. 智能家居
- 智能相框:作为智能家居的一部分,显示家庭照片或艺术画作
- 信息展示中心:显示天气、日历、待办事项等信息
- 电子门牌:显示房间信息、会议安排等
2. 数字艺术
- 动态画廊:自动切换艺术作品,打造数字画廊
- 氛围营造:根据时间、天气自动调整显示内容
- 互动艺术:结合传感器实现互动艺术展示
3. 教育培训
- 电子时钟:作为教学工具,教授时间和日期概念
- 地理知识:显示世界各地的风景图片
- 文化展示:展示不同文化的艺术作品


致谢
感谢 DigiKey 和 电子森林 提供的FastBond4活动支持,本次活动链接:https://www.eetree.cn/page/digikey-fastbond
附件下载
TAB5_BingWallpaperClock.m5f2
源码
TAB5_BingWallpaperClock.py
源码
adapter.epro
原理图和PCB
adapter.zip
原理图和PCB
团队介绍
无
评论
0 / 100
查看更多
猜你喜欢
FastBond3挑战部分-基于esp32的天气时钟该项目使用了Arduino IDE软件,C语言,实现了天气时钟的设计,它的主要功能为:基于esp32、可以显示天气、时间、温度、图片等。
lin9an
991
FastBond4挑战部分-基于M5Stack Tab5的本地Matter over Thread智能家居控制系统该“无线”项目完整打通了 `Thread Border Router -> Matter Controller -> Matter End Device -> 本地控制面板` 的整条链路。
StreakingJerry
20
FastBond4挑战部分-基于Tab5的多设备称重监控系统该项目使用了M5Stack Tab5开发板和Unit Mini Scales称重传感器,实现了基于ESP32-S3的多设备称重监控系统的设计,它的主要功能为:I2C称重传感器自动扫描发现、MQTT远程数据订阅与显示、2x2网格UI实时更新、多桥接设备协同工作。
量子跃迁引擎
9