# Esp32浇水 **Repository Path**: zhux3/esp32-watering ## Basic Information - **Project Name**: Esp32浇水 - **Description**: Esp32浇水 esp32-watering - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-09 - **Last Updated**: 2026-07-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ESP32 物联网自动浇水系统 基于 ASP.NET Core 9 + Blazor WebAssembly 的物联网自动浇水系统,内置 MQTT Broker,支持多种硬件设备接入和管理。 ## 技术栈 | 组件 | 技术 | |------|------| | 运行时 | .NET 9 | | Web 框架 | ASP.NET Core + Blazor WebAssembly | | ORM | Entity Framework Core (SQLite) | | MQTT | MQTTnet(内置 Broker + Client) | | 实时通信 | SignalR | | 前端 UI | Bootstrap 5 + Chart.js | ## 项目结构 ``` Esp32Watering/ ├── src/ │ └── Esp32Watering.Server/ # 后端服务 │ ├── Controllers/ # API 控制器 │ ├── Data/ # 数据库上下文 │ ├── Hubs/ # SignalR Hub │ ├── Models/ # 实体与 DTO │ ├── Services/ # 核心服务 │ └── Client/ # Blazor WebAssembly 前端 │ ├── Pages/ # 页面组件 │ ├── Services/ # 前端 API + SignalR 服务 │ └── Layout/ # 布局组件 ├── tools/ │ ├── Esp32Simulator/ # ESP32 设备模拟器 (.NET 9) │ ├── Esp32Mpy/ # ESP32 MicroPython 固件 (ADC + L9110S) │ └── Esp8266Relay/ # ESP-01 MicroPython 固件 (双继电器 + 定时浇水) └── docs/ ├── hardware-guide.md # 硬件选型指南 ├── mpy-esp32-guide.md # ESP32 MicroPython 固件教程 ├── mpy-esp8266-guide.md # ESP-01 双继电器设备教程 ├── mixly-esp32-guide.md # Mixly 图形化编程教程 ├── soil-moisture-calibration.md # 土壤湿度传感器标定数据 └── deploy-1panel.md # 1Panel 生产部署 ``` ## 快速开始 ### 前置条件 - [.NET 9 SDK](https://dotnet.microsoft.com/download/dotnet/9.0) ### 启动服务 ```bash git clone https://gitee.com/zhux3/esp32-watering.git cd esp32-watering dotnet run --project src/Esp32Watering.Server ``` 服务启动后,浏览器访问 `http://localhost:5167` 即可打开管理界面。 ### 启动设备模拟器(可选) ```bash dotnet run --project tools/Esp32Simulator ``` 按提示输入 MQTT 连接参数(直接回车使用默认值),即可模拟设备定时上报湿度数据。 ## 支持的硬件设备 ### 1. ESP32 + 土壤湿度传感器 + L9110S 电机驱动 自动浇水设备,具备土壤湿度检测、自动浇水、MQTT 远程控制功能。 | 引脚 | 用途 | |------|------| | GPIO 34 | 土壤湿度传感器 ADC(12 位,0-4095) | | GPIO 26 (PWM) + GPIO 27 | L9110S 电机驱动 | | GPIO 2 | 板载 LED(闪烁=正常,长亮=异常) | 固件位于 `tools/Esp32Mpy/main.py`,刷写脚本 `tools/Esp32Mpy/flash.cmd`。 ### 2. ESP-01 (1MB Flash) + 双继电器模块 定时浇水设备,**无湿度传感器**,通过 HTTP 从服务端获取定时时间组,本地自行执行浇水。 | 引脚 | 用途 | |------|------| | GPIO 0 | 继电器 IN1(第 1 路水泵) | | GPIO 2 | 继电器 IN2(第 2 路水泵) | 固件位于 `tools/Esp8266Relay/main.py`。时间由服务端 API 返回的 `serverDate`/`serverTime` 校准 RTC,无需 NTP。 ## 架构 ``` ┌────────────────────┐ MQTT(1883) ┌───────────────────────────┐ │ ESP32 设备端 │ ◄──────────────────► │ ASP.NET Core 服务端 │ │ (湿度传感器+电机) │ │ │ └────────────────────┘ │ ┌─────────────────────┐ │ │ │ MqttBrokerService │ │ ┌────────────────────┐ │ │ (内置 MQTT Broker) │ │ │ ESP-01 设备端 │ ── HTTP ──► │ └─────────┬───────────┘ │ │ (双继电器+定时) │ GET /api/config/ │ │ │ └────────────────────┘ scheduled-watering │ ┌─────────▼───────────┐ │ │ │ MqttClientService │ │ │ │ (订阅设备主题) │ │ │ └─────────┬───────────┘ │ │ │ │ │ ┌─────────▼───────────┐ │ │ │ DeviceDataService │ │ │ │ (数据处理 + DB) │ │ │ └────┬───────────┬────┘ │ │ │ │ │ │ ┌────▼───┐ ┌────▼───┐ │ │ │ SQLite │ │ SignalR │ │ │ └────────┘ └────┬────┘ │ └──────────────────┼───────┘ │ ┌──────────────────▼───────┐ │ Blazor WebAssembly 前端 │ │ (SignalR 实时推送) │ └──────────────────────────┘ ``` ### 核心服务 - **MqttBrokerService** — 内置 MQTT Broker,监听 1883 端口,支持账号密码认证 - **MqttClientService** — 订阅设备主题,处理上报数据 - **DeviceDataService** — 处理湿度记录、浇水确认、设备状态更新,广播 SignalR 事件 - **DeviceHeartbeatService** — 每 30 秒心跳检测,120 秒无数据自动标记离线 ## API 接口 | 方法 | 路由 | 说明 | |------|------|------| | GET | `/api/devices` | 获取所有设备列表 | | GET | `/api/devices/{id}` | 获取单个设备详情 | | GET | `/api/moisturerecords/device/{deviceId}?take=10` | 获取设备湿度记录 | | GET | `/api/watering/records/device/{deviceId}?take=10` | 获取设备浇水记录 | | POST | `/api/watering/send` | 发送浇水指令 | | GET | `/api/config/moisture-thresholds` | 获取湿度阈值配置 | | **GET** | **`/api/config/scheduled-watering`** | **获取定时浇水时间组 + 服务器当前时间** | ### SignalR Hub - **端点**: `/hubs/watering` - **事件**: | 事件 | 参数 | 说明 | |------|------|------| | `MoistureDataReceived` | `(deviceId, moistureValue, isOnline)` | 设备上报湿度数据时触发,实时更新总览页 | | `DeviceStatusChanged` | `(deviceId, isOnline)` | 设备在线/离线状态变化时触发 | | `WateringCommandSent` | `(deviceId, command)` | 浇水指令确认后推送到对应设备详情页 | ## MQTT 主题 所有设备统一使用 `esp32/{id}` 主题前缀(ESP-01 设备同样复用此前缀): | 主题 | 方向 | 说明 | |------|------|------| | `esp32/{id}/soil_moisture` | 设备 → 服务端 | 上报土壤湿度 (0-4095),ESP-01 无此功能 | | `esp32/{id}/status` | 设备 → 服务端 | 上报在线状态 `"online"`(心跳,每 30 秒) | | `esp32/{id}/watering/cmd` | 服务端 → 设备 | 下发浇水指令 `"1"` | | `esp32/{id}/watering/ack` | 设备 → 服务端 | 浇水指令确认 `"1"` | > MQTT Broker 默认开启账号密码认证,设备连接时需携带凭据。配置文件中不填写 `Username`/`Password` 则无认证。 ## 数据库 使用 SQLite,数据库文件自动创建于项目运行目录。包含 3 张表: - **Devices** — 设备信息与在线状态(预置 20 个设备作为种子数据) - **SoilMoistureRecords** — 土壤湿度历史记录 - **WateringRecords** — 浇水操作记录 ## 前端页面 - **设备总览** (`/`) — 卡片网格展示所有设备,通过 SignalR 实时接收湿度和状态更新 - **设备详情** (`/device/{id}`) — Chart.js 折线图展示湿度趋势、浇水记录柱状图,支持手动浇水 ## 配置 编辑 `src/Esp32Watering.Server/appsettings.json`: | 配置项 | 默认值 | 说明 | |--------|--------|------| | `ConnectionStrings:DefaultConnection` | `Data Source=watering.db` | SQLite 数据库路径 | | `MqttBroker:Port` | `1883` | MQTT Broker 端口 | | `MqttBroker:ClientId` | `esp32-watering-server` | MQTT 客户端 ID | | `MqttBroker:Username` | `esp32` | MQTT 认证用户名(留空则无认证) | | `MqttBroker:Password` | `esp32@2026` | MQTT 认证密码 | | `DeviceHeartbeat:TimeoutSeconds` | `120` | 心跳超时时间(秒) | | `MoistureThresholds:RawValueMax` | `4095` | 湿度传感器最大值 | | `MoistureThresholds:DryThresholdPercent` | `30` | 干燥阈值百分比 | | `MoistureThresholds:WetThresholdPercent` | `60` | 湿润阈值百分比 | | `ScheduledWatering:Enabled` | `true` | 定时浇水总开关 | | `ScheduledWatering:TimeGroups[].Time` | `"08:00"` | 定时浇水执行时间 (HH:mm) | | `ScheduledWatering:TimeGroups[].DurationSeconds` | `10` | 定时浇水持续秒数 | ```json { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "Data Source=watering.db" }, "MqttBroker": { "Port": 1883, "ClientId": "esp32-watering-server", "Username": "esp32", "Password": "esp32@2026" }, "DeviceHeartbeat": { "TimeoutSeconds": 120 }, "MoistureThresholds": { "RawValueMax": 4095, "DryThresholdPercent": 30, "WetThresholdPercent": 60 }, "ScheduledWatering": { "Enabled": true, "TimeGroups": [ { "Time": "08:00", "DurationSeconds": 10 }, { "Time": "20:00", "DurationSeconds": 15 } ] } } ``` ## 许可证 MIT