From 6502904a5a33fa10b46d53ff56ee0fcf631e88ed Mon Sep 17 00:00:00 2001 From: kicer Date: Mon, 2 Feb 2026 09:26:15 +0800 Subject: [PATCH] v1.3.5, update README --- README.md | 124 ++++++++++++++++++++++++++++++++++++++++++++------- README_en.md | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++ docs/ws2.jpg | Bin 0 -> 37515 bytes 3 files changed, 230 insertions(+), 16 deletions(-) create mode 100644 README_en.md create mode 100644 docs/ws2.jpg diff --git a/README.md b/README.md index 60de35f..fcdbe85 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,122 @@ -# WiFi天气微站 +# WS2 桌面气象站 -esp8266版天气信息显示设备 +([English](README_en.md) | 中文) +基于ESP8266的桌面气象站,能够实时显示天气信息、环境数据和时间。 + +![WS2气象站](docs/ws2.jpg) + +## 功能特点 + +- 🌤️ **实时天气显示**:获取并显示当前天气状况、温度、湿度和空气质量 +- 📺 **TFT LCD彩色显示**:1.54寸240x240像素彩色液晶屏 +- 🕐 **多种显示模式**:支持多种UI界面,包括天气时钟和电子相册模式 +- 🌐 **Web管理界面**:内置轻量级Web服务器,支持浏览器配置和管理 +- 📊 **系统监控**:实时显示设备状态、内存使用和网络信息 +- 📡 **WiFi连接**:支持2.4GHz WiFi网络,自动重连机制 + +## 硬件规格 + +- **主控芯片**:ESP8266/ESP32 +- **显示屏**:1.54寸 TFT LCD 240×240像素 +- **网络**:802.11 b/g/n WiFi + +## 软件架构 + +本项目基于MicroPython开发,包含以下核心模块: + +- **app.py** - 主应用程序 +- **config.py** - 配置管理 +- **wifi_manager.py** - WiFi连接管理 +- **display.py** - 显示屏控制 +- **nanoweb.py** - 轻量级异步Web服务器 +- **captive_portal.py** - 配置门户 + +## 快速开始 + +1. 购物网站搜: WiFi天气时钟 +> 务必与商家确认可以通过usb下载固件 + +2. 连接设备usb,下载完整版固件到ESP8266 + ```bash + esptool.py --port /dev/ttyUSB0 --baud 460800 write-flash --flash-size=detect 0 firmware.bin + ``` + +### 初次配置 + +1. 设备启动后会创建WiFi热点 `WS2-xxxx` +2. 连接该热点,浏览器会自动跳转访问 `192.168.4.1` +3. 在配置页面输入WiFi信息 +4. 设备将自动连接并获取天气信息 + +## Web管理界面 + +设备Web界面提供以下功能: + +### 设备状态 +- 查看系统运行状态、内存使用情况 +- 监控设备IP地址和运行时间 +- 实时显示UUID和固件版本 + +### 屏幕显示 +- 调节屏幕亮度 +-切换显示模式 +- LCD内容预览 + +### 系统配置 +- 选择城市和地区 +- 设置自动熄屏时间 +- 保存/加载配置 + +### 高级设置 +- 执行系统命令 +- 查看MAC地址 +- 重启设备 +- 清空配置 ## API接口 -1. /ping +设备提供RESTful API接口,可通过HTTP请求获取数据: -2. /status +``` +GET /lcd - 获取LCD设置 +GET /status - 获取系统状态 +GET /config - 获取配置信息 +POST /exec - 执行系统命令 {cmd: "命令内容", token: "认证令牌"} +POST /lcd/set - 设置LCD参数 {brightness: 80, ui_type: "default"} +POST /config/set - 设置配置 {city: "北京", standby_time: "22:00"} +``` -3. /weather - /weather/?city=xxx&force=1 +## 开发指南 -4. /lcd +1. 修改/src/rom下相关文件,使用mpremote romfs更新 +2. 自行编译micropython固件需要集成*st7789py_mpy*(未整理) -5. /lcd/set, POST +## 故障排除 -6. /exec, POST +### 常见问题 -```sh - # read memory free - > *curl -H "Content-Type: application/json" -X POST -d '{"cmd":"import gc;gc.collect();R=gc.mem_free()", "token":"c6b74200"}' http://192.168.99.194/exec* +**Q: 设备无法连接WiFi** +A: 检查WiFi密码是否正确,或重启设备重新配置 - # reset - > *curl -H "Content-Type: application/json" -X POST -d '{"cmd":"import machine; machine.reset()", "token":"c6b74200"}' http://192.168.99.194/exec* +**Q: 天气数据不更新** +- A1: 检查网络连接,或尝试强制刷新天气数据 +- A2: 个人的天气服务器失联~ +## 许可证 -## 参考资料 -[MicroPython remote control: mpremote](https://docs.micropython.org/en/latest/reference/mpremote.html) +本项目采用MIT许可证 + +## 致谢 + +- [MicroPython](https://micropython.org/) - 高效的Python微控制器实现 +- [ST7789驱动](https://github.com/devbis/st7789py_mpy) - LCD显示屏驱动 +- [captive-portal](https://github.com/anson-vandoren/esp8266-captive-portal) - 认证门户 +- [Nanoweb](https://github.com/hugokernel/micropython-nanoweb) - 轻量级异步Web服务器 +- [mpremote](https://docs.micropython.org/en/latest/reference/mpremote.html) - mp控制终端 + +## 联系方式 + +- 项目主页: https://github.com/kicer/ws2 +- 项目主页: https://iot.foresh.com/git/kicer/ws2 +- 问题反馈: https://github.com/kicer/ws2/issues diff --git a/README_en.md b/README_en.md new file mode 100644 index 0000000..db8191c --- /dev/null +++ b/README_en.md @@ -0,0 +1,122 @@ +# WS2 Desktop Weather Station + +(English | [中文](README.md)) + +An ESP8266-based desktop weather station capable of displaying real-time weather information, environmental data, and time. + +![WS2 Weather Station](docs/ws2.jpg) + +## Features + +- 🌤️ **Real-time Weather Display**: Get and display current weather conditions, temperature, humidity, and air quality +- 📺 **TFT LCD Color Display**: 1.54-inch 240x240 pixel color LCD screen +- 🕐 **Multiple Display Modes**: Support for various UI interfaces, including weather clock and photo album modes +- 🌐 **Web Management Interface**: Built-in lightweight web server supporting browser configuration and management +- 📊 **System Monitoring**: Real-time display of device status, memory usage, and network information +- 📡 **WiFi Connectivity**: Support for 2.4GHz WiFi networks with automatic reconnection + +## Hardware Specifications + +- **Main Controller**: ESP8266/ESP32 +- **Display**: 1.54-inch TFT LCD 240×240 pixels +- **Network**: 802.11 b/g/n WiFi + +## Software Architecture + +This project is developed based on MicroPython and includes the following core modules: + +- **app.py** - Main application +- **config.py** - Configuration management +- **wifi_manager.py** - WiFi connection management +- **display.py** - Display screen control +- **nanoweb.py** - Lightweight asynchronous web server +- **captive_portal.py** - Configuration portal + +## Quick Start + +1. Search for "WiFi Weather Clock" on shopping websites +> Make sure to confirm with the seller that firmware can be downloaded via USB + +2. Connect the device via USB and download the complete firmware to ESP8266 + ```bash + esptool.py --port /dev/ttyUSB0 --baud 460800 write-flash --flash_size=detect 0 firmware.bin + ``` + +### Initial Configuration + +1. The device creates a WiFi hotspot named `WS2-xxxx` upon startup +2. Connect to this hotspot and the browser will automatically redirect to `192.168.4.1` +3. Enter WiFi information on the configuration page +4. The device will automatically connect and fetch weather information + +## Web Management Interface + +The device web interface provides the following features: + +### Device Status +- View system running status and memory usage +- Monitor device IP address and uptime +- Real-time display of UUID and firmware version + +### Screen Display +- Adjust screen brightness +- Switch display modes +- LCD content preview + +### System Configuration +- Select city and region +- Set auto-sleep time +- Save/load configuration + +### Advanced Settings +- Execute system commands +- View MAC address +- Restart device +- Clear configuration + +## API Interface + +The device provides RESTful API interfaces, accessible via HTTP requests: + +``` +GET /lcd - Get LCD settings +GET /status - Get system status +GET /config - Get configuration information +POST /exec - Execute system commands {cmd: "Command content", token: "Authentication token"} +POST /lcd/set - Set LCD parameters {brightness: 80, ui_type: "default"} +POST /config/set - Set configuration {city: "Beijing", standby_time: "22:00"} +``` + +## Development Guide + +1. Modify relevant files in /src/rom directory and use mpremote romfs to update +2. Custom compilation of MicroPython firmware requires integration of *st7789py_mpy* (not organized yet) + +## Troubleshooting + +### Common Issues + +**Q: Device cannot connect to WiFi** +A: Check if the WiFi password is correct, or restart the device to reconfigure + +**Q: Weather data doesn't update** +- A1: Check network connection or try force-refreshing weather data +- A2: Personal weather server may be offline~ + +## License + +This project is licensed under the MIT License + +## Acknowledgments + +- [MicroPython](https://micropython.org/) - Efficient Python implementation for microcontrollers +- [ST7789 Driver](https://github.com/devbis/st7789py_mpy) - LCD display driver +- [captive-portal](https://github.com/anson-vandoren/esp8266-captive-portal) - Captive portal +- [Nanoweb](https://github.com/hugokernel/micropython-nanoweb) - Lightweight asynchronous web server +- [mpremote](https://docs.micropython.org/en/latest/reference/mpremote.html) - MicroPython control terminal + +## Contact + +- Project Homepage: https://github.com/kicer/ws2 +- Project Homepage: https://iot.foresh.com/git/kicer/ws2 +- Issue Tracker: https://github.com/kicer/ws2/issues diff --git a/docs/ws2.jpg b/docs/ws2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b86f681609f4240872177bba38a3bf24d409f167 GIT binary patch literal 37515 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 literal 0 HcmV?d00001