# 农业大棚二集 **Repository Path**: ding-zijian03/Greenhouse_monitor_second ## Basic Information - **Project Name**: 农业大棚二集 - **Description**: 农业大棚二集,已经修复图表不稳定问题 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-10-17 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 温室监控系统 - WiFi热点版本 ## 项目概述 这是一个基于Arduino Nano ESP32和240x320 LCD显示屏的温室监控系统,集成了多种传感器用于全面监控温室环境。系统采用模块化设计,支持传感器热插拔,即使某些传感器失效也能正常工作。**最新更新:支持WiFi热点功能、完整Chart.js图表库和文件系统管理,提供专业级的Web监控界面!** 🆕 ## 🔥 新功能亮点 ### WiFi热点监控 - **无需安装App**:任何设备的浏览器都可访问 - **现代化Web界面**:响应式设计,自动适配手机和电脑 - **实时数据更新**:3秒自动刷新,支持手动刷新 - **多设备支持**:同时支持多个设备连接监控 - **离线访问**:不需要互联网连接,ESP32直接提供Web服务 ### 🎨 智能传感器颜色编码(最新功能) - **🟢 绿色显示**:传感器数值正常,在安全范围内 - **🟡 黄色警告**:传感器数值接近阈值边界(10%警告区域) - **🔴 红色危险**:传感器数值超出设定的最小或最大阈值 - **实时状态更新**:颜色状态每3秒自动刷新 - **直观视觉反馈**:一眼看出温室环境状况,无需查看具体数值 - **三端统一**:LCD、网页端、蜂鸣器使用完全一致的状态判断逻辑 ### 📈 交互式图表功能 - **完整Chart.js支持**:实时数据可视化,支持多种图表类型 - **文件系统支持**:支持LittleFS/SPIFFS/FFat自动检测和挂载 - **Chart.js文件上传**: - 访问 `/upload` 页面上传完整版Chart.js库 - 支持199KB+的完整Chart.js文件 - 自动回退到内置简化版本(如果文件系统不可用) - **竖线跟随**:鼠标悬停/触摸时显示跟随竖线 - **实时数值查看**:Chart.js内置tooltip显示精确时间点数据 - **移动端优化**:支持触摸拖动查看历史数据点 - **平滑交互**:流畅的悬停和触摸响应体验 - **24小时数据趋势**:288个数据点(5分钟间隔)的完整历史记录 ### 📊 系统监控功能 - **性能监测**:CPU使用率、内存使用、WiFi信号强度 - **健康检测**:传感器状态、连接质量、系统运行时间 - **系统日志**:记录警报事件、传感器异常、系统状态变化 - **统计分析**:24小时数据趋势、最值统计、传感器可靠性 - **实时仪表板**:系统概况、连接状态、性能指标 ### 快速使用指南 1. 上传代码到Arduino Nano ESP32 2. 打开串口监视器查看WiFi信息 3. 手机/电脑连接WiFi热点:"ESP32_Greenhouse"(密码:12345678) 4. 浏览器访问:192.168.4.1 5. **可选**:访问 192.168.4.1/upload 上传完整版Chart.js库(data/chart.min.js) 6. 享受智能颜色编码的实时监控和完整图表功能! ## 当前文件结构 ``` Greenhouse_monitor/ ├── Greenhouse_monitor.ino # 主程序文件(系统协调和主循环) ├── display_manager.ino # 显示管理模块(LCD控制和图表绘制) ├── wifi_manager.ino # WiFi热点和Web服务器模块 🆕 ├── sensors_temp_humid.ino # AHT30温湿度传感器模块 ├── sensors_pressure.ino # BMP180气压传感器模块 ├── sensors_co2.ino # SGP30 CO2传感器模块 ├── sensors_light.ino # BH1750光照传感器模块 ├── time_manager.ino # 时间管理模块 ├── device_control.ino # 设备控制模块(蜂鸣器报警系统) ├── partitions.csv # ESP32分区表配置 🆕 ├── data/ │ └── chart.min.js # Chart.js库文件(可选上传)🆕 └── README.md # 说明文档 ``` ## 硬件连接 ### ESP32引脚分配 ``` LCD显示屏 (ST7789): ├── SCLK → GPIO 3 ├── MOSI → GPIO 4 ├── DC → GPIO 12 ├── RST → GPIO 11 ├── CS → GPIO 13 └── BLK → GPIO 14 AHT30温湿度传感器 (I2C): ├── SDA → GPIO 6 └── SCL → GPIO 5 BMP180气压传感器 (I2C): ├── SDA → GPIO 6 └── SCL → GPIO 5 SGP30 CO2传感器 (I2C): ├── SDA → GPIO 6 └── SCL → GPIO 5 BH1750光照传感器 (I2C): ├── SDA → GPIO 6 ├── SCL → GPIO 5 └── ADDR → GPIO 8 (地址选择引脚) 蜂鸣器 (数字输出): └── 信号 → GPIO 9 ``` ### Arduino IDE开发板配置 **重要**:确保Arduino IDE中选择了正确的开发板配置: 1. **开发板选择**: - 工具 → 开发板 → Arduino ESP32 Boards → **Arduino Nano ESP32** - 如果你的开发板没有自动识别为Arduino NANO ESP32,请手动切换到此选项 2. **引脚编号模式**: - 工具 → Pin Numbering → **By GPIO number** - 这确保代码中的引脚号对应GPIO号码,而不是开发板上的物理引脚号 3. **其他设置**: - 端口:选择对应的COM端口 - 上传速度:921600(推荐)或115200 - **分区方案**:**With SPIFFS partition (advanced)** 🆕 - 此设置为文件系统预留空间,支持Chart.js文件上传 - 如果选择其他方案,文件上传功能可能不可用 4. **编程器配置**(首次上传必需): - 工具 → 编程器 → **Esptool** 5. **代码上传方式**: - **首次上传**:项目 → 使用编程器上传(必须使用此方式) - **后续上传**:直接点击上传按钮即可 ### 电源连接 - LCD显示屏:3.3V - AHT30传感器:3.3V - BMP180传感器:3.3V - SGP30传感器:3.3V - BH1750传感器:3.3V - 蜂鸣器:3.3V (或5V,取决于具体型号) ### I2C地址分配 - AHT30:0x38 - BMP180:0x77 - SGP30:0x58 - BH1750:0x23 (ADDR引脚为LOW) / 0x5C (ADDR引脚为HIGH) ## 需要安装的库 在Arduino IDE中安装以下库: 1. **LovyanGFX** - LCD显示库 - 工具 → 管理库 → 搜索"LovyanGFX" 2. **WiFi** - ESP32 WiFi库(ESP32内置,无需安装) 3. **WebServer** - ESP32 Web服务器库(ESP32内置,无需安装) 4. **文件系统库** - ESP32内置 🆕 - **SPIFFS** - 传统文件系统(ESP32内置) - **LittleFS** - 现代文件系统(ESP32 v2.0.0+内置) - **FFat** - FAT文件系统(ESP32内置) - 系统会自动检测并使用可用的文件系统 4. **Adafruit AHTX0** - AHT30温湿度传感器 - 工具 → 管理库 → 搜索"Adafruit AHTX0" 5. **Adafruit BMP085 Library** - BMP180气压传感器 - 工具 → 管理库 → 搜索"Adafruit BMP085" 6. **Adafruit SGP30** - SGP30 CO2传感器 - 工具 → 管理库 → 搜索"Adafruit SGP30" 7. **BH1750** - BH1750光照传感器 - 工具 → 管理库 → 搜索"BH1750" 8. **Wire** - I2C通信库(ESP32内置) 9. **Adafruit Sensor** - 传感器抽象库 - 工具 → 管理库 → 搜索"Adafruit Unified Sensor" ## 功能特性 ### ✅ 已实现功能 #### 🌐 WiFi热点Web监控(最新功能) - **WiFi热点模式**: - 热点名称:ESP32_Greenhouse - 热点密码:12345678 - IP地址:192.168.4.1 - **现代化Web界面**: - 响应式设计,支持手机和电脑访问 - 实时数据显示(温度、湿度、气压、CO2、光照) - 系统状态监控和运行时间显示 - 3秒自动刷新,支持手动刷新 - **RESTful API**: - `/api/data` - 获取传感器数据(JSON格式) - `/api/status` - 获取系统状态和连接数 - `/api/fs` - 获取文件系统状态和Chart.js信息 🆕 - `/api/restart` - 重启ESP32(POST请求) - **文件上传功能**: - `/upload` - Chart.js文件上传页面 🆕 - 支持文件系统诊断和容量显示 - 自动检测并使用 LittleFS → SPIFFS → FFat 文件系统 - **多设备支持**: - 同时支持多个设备连接 - 显示当前连接设备数量 - 无需安装任何App,浏览器直接访问 #### 📱 本地LCD显示界面 - **240x320 LCD显示界面** - 高分辨率彩色显示 - **WiFi状态显示** - 显示热点状态和连接设备数量 - **多传感器集成**: - AHT30温湿度传感器实时读取 - BMP180气压传感器实时读取(气压值和海拔估算) - SGP30 CO2传感器实时读取(CO2和TVOC) - BH1750光照传感器实时读取(高精度光照强度) - **温度趋势图表**: - 实时温度曲线显示 - 最大50个数据点历史记录 - 10秒间隔数据采集 - 最高/最低温度显示 - **智能传感器管理**: - **非阻塞传感器初始化**(3秒超时保护,不会卡住) - **传感器连接状态检测**(显示"disconnected"当传感器未连接) - **启动状态显示**(显示传感器初始化进度) - **容错运行**(即使部分传感器失效也能正常工作) - **数据状态指示**: - 彩色状态指示器(正常/警告/异常/未连接) - 温湿度、CO2阈值监控 - 实时数据验证 - **时间显示**: - 运行时间显示(从设备启动开始计算) - 图表时间轴管理 - **蜂鸣器报警系统**: - **启动提示音**:系统启动完成时播放(短-长-短节奏) - **异常监控**:实时检测温度、湿度、CO2异常情况 - **智能报警**:根据异常严重程度播放不同提示音 - **防骚扰设计**:设置报警间隔,避免频繁鸣叫 - **可控制开关**:支持蜂鸣器启用/禁用 - **串口调试输出** - 详细的传感器状态信息 ### 🔄 模拟显示功能 - 土壤湿度显示(模拟数据) - 设备状态显示(水泵、风扇、补光灯) ## 启动流程 1. **LCD优先初始化** - 确保屏幕能立即显示状态 2. **蜂鸣器初始化** - 初始化报警系统 3. **显示启动界面** - "System Starting..." 和传感器初始化进度 4. **传感器初始化** - 每个传感器有3秒超时保护: - AHT30温湿度传感器 - BMP180气压传感器 - SGP30 CO2传感器 - BH1750光照传感器 5. **状态反馈** - 显示哪些传感器成功/失败 (x/4 sensors ready) 6. **启动完成提示音** - 播放启动完成音乐(短-长-短节奏) 7. **进入正常运行** - 即使部分传感器失败也能正常工作,并开始异常监控 ### 启动界面显示 ``` Greenhouse Monitor 00:00 System Starting... Initializing Sensors AHT30... BMP180... SGP30... BH1750... 4/4 sensors ready! (或 "3/4 sensors ready" / "No sensors found") ``` ## 📖 使用指南 ### 方法一:WiFi热点Web监控(推荐) 1. **上传代码**:将代码上传到Arduino Nano ESP32 2. **查看串口信息**:打开串口监视器,查看WiFi热点信息 3. **连接WiFi**: - 热点名称:`ESP32_Greenhouse` - 密码:`12345678` 4. **打开浏览器**:访问 `http://192.168.4.1` 5. **享受监控**:现代化Web界面,支持多设备同时访问 #### 🌐 Web界面功能详解 **主要功能页面**: - **仪表板首页**:传感器数据卡片,智能颜色编码显示 - **数据图表**:实时温度、湿度、CO2趋势图(Chart.js) - **阈值设置**:可调节各传感器的警告和危险阈值 - **系统监控**:性能指标、健康状态、运行统计 - **数据导出**:CSV格式数据下载功能 **智能颜色编码系统**: - 🟢 **绿色卡片**:传感器数值在正常范围内 - 🟡 **黄色卡片**:数值接近阈值边界(10%警告区域) - 🔴 **红色卡片**:数值超出设定阈值(需要注意) - **实时更新**:每3秒自动刷新状态和颜色 **API接口**: - `/api/data` - 获取实时传感器数据 - `/api/thresholds` - 获取/设置传感器阈值 - `/api/history` - 获取历史数据 - `/api/stats` - 获取系统统计信息 - `/api/alerts` - 获取系统警报日志 - `/api/logs` - 获取系统运行日志 - `/api/status` - 获取WiFi和连接状态 **Web界面特性**: - 📱 **响应式设计**:自动适配手机、平板、电脑屏幕 - 🔄 **自动刷新**:可开启/关闭3秒自动数据更新 - 📊 **实时图表**:动态数据可视化,支持缩放和交互 - 💾 **数据导出**:支持CSV格式下载历史数据 - 🎨 **现代UI**:简洁美观的界面设计,直观易用 ### 方法二:本地LCD显示 - LCD屏幕直接显示传感器数据、状态和温度趋势图 - WiFi状态和连接设备数量显示 ### 系统启动流程 1. **LCD优先初始化** - 确保屏幕能立即显示状态 2. **WiFi热点启动** - 创建ESP32_Greenhouse热点 🆕 3. **蜂鸣器初始化** - 初始化报警系统 4. **显示启动界面** - "System Starting..." 和传感器初始化进度 5. **传感器初始化** - 每个传感器有3秒超时保护: - AHT30温湿度传感器 - BMP180气压传感器 - SGP30 CO2传感器 - BH1750光照传感器 6. **状态反馈** - 显示哪些传感器成功/失败 (x/4 sensors ready) 7. **启动完成提示音** - 播放启动完成音乐(短-长-短节奏) 8. **进入正常运行** - 即使部分传感器失败也能正常工作,并开始异常监控 ### 启动界面显示 ``` Greenhouse Monitor 00:00 WiFi: ESP32_Greenhouse ★ System Starting... Initializing Sensors AHT30... BMP180... SGP30... BH1750... 4/4 sensors ready! (或 "3/4 sensors ready" / "No sensors found") ``` ## 🔧 配置和安装 ### 硬件连接 按照上面的引脚分配连接LCD和所有传感器 ### 安装库 在Arduino IDE中安装必要的库 ### 配置Arduino IDE - 确保选择正确的开发板:工具 → 开发板 → Arduino ESP32 Boards → **Arduino Nano ESP32** - 设置引脚编号模式:工具 → Pin Numbering → **By GPIO number** - 配置编程器:工具 → 编程器 → **Esptool** - 选择正确的COM端口 ### 修改引脚 如需修改引脚,在对应的传感器文件中修改: - AHT30引脚:在 `sensors_temp_humid.ino` 中修改 `NEW_SDA_PIN` 和 `NEW_SCL_PIN` - BMP180引脚:在 `sensors_pressure.ino` 中修改 `BMP_SDA_PIN` 和 `BMP_SCL_PIN` - SGP30引脚:在 `sensors_co2.ino` 中修改I2C引脚 - BH1750引脚:在 `sensors_light.ino` 中修改 `LIGHT_SDA_PIN`、`LIGHT_SCL_PIN` 和 `LIGHT_ADDR_PIN` ### 上传代码 - 在Arduino IDE中打开`Greenhouse_monitor.ino` - **首次上传**:项目 → **使用编程器上传** - **后续上传**:直接点击上传按钮即可 ## 🌐 Web界面功能 访问 `http://192.168.4.1` 后,你将看到: ### 📊 实时数据显示 - 温度(°C) - 湿度(%) - 气压(hPa) - CO2浓度(ppm) - 光照强度(lux) - 系统运行时间 ### 🎛️ 控制功能 - **刷新数据**:手动刷新传感器数据 - **自动刷新**:开启/关闭自动刷新(默认3秒间隔) - **状态监控**:实时显示系统状态(正常/警告/错误) - **连接统计**:显示当前连接的设备数量 ### 📱 响应式设计 - 自动适配手机、平板、电脑屏幕 - 现代化界面设计 - 彩色状态指示器 - 流畅的用户体验 ## 📊 Chart.js文件系统功能 🆕 ### 功能概述 系统支持完整的Chart.js图表库,提供专业级的数据可视化体验。 ### 文件系统支持 - **自动检测**:系统启动时自动检测并挂载文件系统 - **多文件系统支持**: - LittleFS(首选,Nano ESP32推荐) - SPIFFS(传统选择) - FFat(FAT文件系统) - **容错设计**:如果文件系统不可用,自动使用内置简化版Chart.js ### Chart.js文件上传 1. **访问上传页面**:http://192.168.4.1/upload 2. **查看系统状态**: - 显示当前文件系统类型(LittleFS/SPIFFS/FFat) - 显示可用存储空间 - 显示chart.min.js文件状态 3. **上传文件**: - 选择项目中的 `data/chart.min.js` 文件(约199KB) - 点击上传,系统会自动验证文件 4. **享受完整功能**:上传完成后,图表将支持所有Chart.js功能 ### 技术特性 - **流式传输**:大文件通过streamFile高效传输 - **文件验证**:上传后自动验证文件大小和完整性 - **缓存优化**:Chart.js设置24小时缓存,提升加载速度 - **诊断API**:`/api/fs` 提供文件系统状态诊断信息 ### 故障排除 - 如果文件系统挂载失败,检查分区方案是否包含SPIFFS支持 - 如果上传失败,可能是存储空间不足,清空设备后重试 - 串口监视器会显示详细的挂载和上传日志 ## 显示界面说明 ``` ┌─────────────────────────┐ │ Greenhouse Monitor 01:23│ ← 标题栏(带实时时间) ├─────────────────────────┤ │ Temperature 25.3°C ● │ ← 温度(实际读取) │ Humidity 65.2% ● │ ← 湿度(实际读取) │ Pressure 1013hPa ● │ ← 气压(实际读取) │ CO2 800ppm ● │ ← CO2浓度(实际读取) │ Light 25000lux● │ ← 光照强度(实际读取) ├─────────────────────────┤ │ Temperature Trend (°C) │ ← 图表标题 │ ┌─────────────────────┐ │ │ │ /\ /\ /\ │ │ ← 温度趋势曲线图 │ │ / \ / \ / \ │ │ │ │ / \/ \/ \ │ │ │ └─────────────────────┘ │ │ Min: 22.1°C Max: 26.8°C │ ← 最高/最低温度 └─────────────────────────┘ ``` ### 状态指示器颜色 - 🟢 绿色:数值正常 - 🟡 黄色:数值接近阈值边界 - 🔴 红色:数值超出正常范围或传感器未连接 - **disconnected**:传感器初始化失败或未连接 ## 配置说明 如需修改传感器引脚,直接在对应的传感器文件中修改: ### WiFi热点配置 (`wifi_manager.ino`) ```cpp const char* hotspot_ssid = "ESP32_Greenhouse"; // WiFi热点名称 const char* hotspot_password = "12345678"; // WiFi热点密码(最少8位) const IPAddress local_ip(192, 168, 4, 1); // ESP32 IP地址 const IPAddress gateway(192, 168, 4, 1); // 网关地址 const IPAddress subnet(255, 255, 255, 0); // 子网掩码 ``` ### Web服务器端点 - **主页**:`http://192.168.4.1/` - 显示监控界面 - **API数据**:`http://192.168.4.1/api/data` - 获取传感器数据(JSON) - **API状态**:`http://192.168.4.1/api/status` - 获取系统状态(JSON) - **API重启**:`http://192.168.4.1/api/restart` - 重启ESP32(POST) ### API数据格式 ```json { "temperature": 25.3, "humidity": 65.2, "pressure": 1013.25, "co2": 850, "light": 1234.5, "uptime": 12345, "status": "normal" } ``` ### AHT30温湿度传感器 (`sensors_temp_humid.ino`) ```cpp #define NEW_SDA_PIN 7 // SDA引脚 #define NEW_SCL_PIN 6 // SCL引脚 ``` ### BMP180气压传感器 (`sensors_pressure.ino`) ```cpp #define BMP_SDA_PIN 6 // SDA引脚 #define BMP_SCL_PIN 5 // SCL引脚 ``` ### SGP30 CO2传感器 (`sensors_co2.ino`) ```cpp #define CO2_SDA_PIN 6 // SDA引脚 #define CO2_SCL_PIN 5 // SCL引脚 ``` ### BH1750光照传感器 (`sensors_light.ino`) ```cpp #define LIGHT_SDA_PIN 6 // SDA引脚 #define LIGHT_SCL_PIN 5 // SCL引脚 #define LIGHT_ADDR_PIN 8 // 地址选择引脚 ``` ### 蜂鸣器报警系统 (`device_control.ino`) ```cpp #define BUZZER_PIN 9 // 蜂鸣器信号引脚 static bool buzzerEnabled = true; // 蜂鸣器启用状态 ``` ### 传感器阈值 所有传感器的正常范围阈值在主文件的 `thresholds` 结构体中定义: ```cpp struct Thresholds { float tempMin = 18.0, tempMax = 29.0; // 温度范围 (°C) float humidityMin = 45.0, humidityMax = 80.0; // 湿度范围 (%) int co2Min = 300, co2Max = 1200; // CO2范围 (ppm) float pressureMin = 1000.0, pressureMax = 1030.0; // 气压范围 (hPa) int lightMin = 100, lightMax = 10000; // 光照范围 (lux) - 适合室内环境 } thresholds; ``` ### 统一状态判断系统 系统使用四级状态分类,LCD、网页端、蜂鸣器保持完全一致: **状态分级**: - **🟢 NORMAL (正常)**:数值在安全范围内 - **🟡 WARNING (警告)**:数值接近阈值边界(10%警告区域) - **🔴 CRITICAL (危险)**:数值超出设定的最小或最大阈值 - **🔴 DISCONNECTED (未连接)**:传感器失效或断线 **警告边界计算**: - **温度/湿度/气压/光照**:阈值范围的10%作为警告区域 - **CO2**:固定100ppm作为警告边界 - **示例**:温度18-29°C,警告区域为18-19.1°C和27.9-29°C ### 异常报警阈值 蜂鸣器报警的触发条件(统一后): - **警告状态**(短提示音,30秒间隔):数值在警告边界区域 - **危险状态**(长报警音,30秒间隔):数值超出阈值范围或传感器断线 ### 图表配置 (`display_manager.ino`) ```cpp #define GRAPH_UPDATE_INTERVAL 10000 // 图表数据更新间隔(毫秒) #define MAX_POINTS 50 // 最大数据点数量 #define GRAPH_WIDTH 220 // 图表宽度 #define GRAPH_HEIGHT 80 // 图表高度 ``` ## 时间显示说明 ### 当前时间显示模式 默认显示的是**运行时间**,即从ESP32启动开始计算的时间,格式为 `HH:MM`。 ### 时间显示选项 1. **运行时间模式**(默认) - 显示从设备启动开始的累计时间 - 格式:00:00 ~ 23:59,然后重新循环 - 简单可靠,不需要外部依赖 2. **简单计数模式** - 基于毫秒计数的简单时间显示 - 可通过串口命令切换模式 ### 切换时间模式 可以在代码中调用 `switchTimeMode()` 函数来切换显示模式,或者在串口监视器中观察不同模式的输出。 ## 调试方法 1. **串口监视器**:波特率115200,会显示: ``` === Greenhouse Monitoring System === Initializing... Sensor initialization mode: ALL SENSORS ENABLED Attempting AHT30 init... AHT30 result: SUCCESS Attempting BMP180 init... BMP180 result: SUCCESS Attempting SGP30 init... SGP30 result: SUCCESS Attempting BH1750 init... BH1750 result: SUCCESS Greenhouse Monitoring System Started Sensors: AHT30=OK, BMP180=OK, SGP30=OK, BH1750=OK Sensors: Temp:25.3C Humid:65.2% Pressure:1013.2hPa CO2:450ppm Light:25678.5lux Soil:55.0% ``` 2. **常见问题排查**: - **代码上传失败**: - 确认选择了正确的开发板:Arduino Nano ESP32 - 确认选择了正确的COM端口 - 确认引脚编号设置为"By GPIO number" - 确认编程器设置为"Esptool" - **首次上传必须使用"项目 → 使用编程器上传"** - 如果仍然失败,尝试降低上传速度到115200 - 检查USB线缆质量,某些充电线可能无法传输数据 - **传感器读取失败**:检查I2C接线,确认库已安装,查看I2C地址冲突 - **LCD无显示**: - 检查SPI接线和电源,确认LovyanGFX库已安装 - 确认LCD引脚配置与实际接线一致 - 检查LCD电源是否为3.3V - **部分传感器disconnected**:查看串口输出确认哪个传感器失效,检查对应的接线 - **图表显示异常**:检查温度数据是否正常,图表需要至少2个有效数据点 - **I2C冲突**:多个传感器共享I2C总线,确保地址不冲突 - **引脚编号错误**:确保Arduino IDE中设置了"By GPIO number",代码中的引脚号对应GPIO号 - **蜂鸣器无声音**: - 检查蜂鸣器接线:信号线连接到GPIO 9 - 确认蜂鸣器电源连接正确(3.3V或5V) - 检查蜂鸣器类型:需要有源蜂鸣器或无源蜂鸣器 - 通过串口查看蜂鸣器是否被禁用 - **蜂鸣器响个不停**: - 检查传感器数据是否异常,导致持续报警 - 可以通过代码临时禁用蜂鸣器:`setBuzzerEnabled(false)` 3. **传感器状态指示**: - **绿色圆点**:传感器工作正常,数值在正常范围内 - **黄色圆点**:传感器工作正常,但数值接近阈值边界 - **红色圆点**:数值超出正常范围或传感器连接失败 - **"disconnected"文字**:传感器初始化失败或通信中断 4. **蜂鸣器提示音说明**: - **启动音**(短-长-短):系统启动完成 - **成功音**(两次短音):操作成功确认 - **警告音**(三次短音):轻微异常,60秒间隔 - **报警音**(长音):严重异常,30秒间隔 - **错误音**(长-短-长):操作失败或错误 ## 扩展计划 ### 🔮 未来可添加的功能 - **网络连接**:WiFi模块,支持远程监控和数据上传 - **数据存储**:SD卡存储历史数据 - **更多图表**:湿度、CO2、光照强度趋势图 - **报警系统**:蜂鸣器、LED指示、短信通知 - **自动控制**:基于传感器数据的智能设备控制 ### 📡 传感器扩展 后续可以添加的传感器模块: - **土壤传感器**:电容式土壤湿度传感器 - **pH传感器**:土壤酸碱度检测 - **EC传感器**:土壤电导率检测 - **风速传感器**:环境风速监测 - **雨滴传感器**:降雨检测 ### ⚙️ 设备控制扩展 - **继电器控制模块**:水泵、风扇、补光灯的自动控制 - **PWM调光**:补光灯亮度调节 - **步进电机**:自动窗户开关 - **电磁阀**:精确浇水控制 ### 💻 软件功能扩展 - **Web界面**:通过浏览器访问设备状态 - **手机App**:Android/iOS应用 - **数据分析**:历史趋势分析和预测 - **配置界面**:通过触摸屏或Web界面调整参数 每个新传感器只需要: 1. 创建对应的`.ino`文件(参考现有传感器模块) 2. 在主文件的`readSensors()`中调用读取函数 3. 在`setup()`中添加初始化调用 4. 在显示管理器中添加显示项目 ## 技术规格 ### 硬件规格 - **微控制器**:ESP32 (双核,WiFi/蓝牙) - **显示屏**:240x320 ST7789 LCD (65K色彩) - **传感器**: - AHT30:温湿度传感器 (±0.3°C, ±2%RH) - BMP180:气压传感器 (±0.12hPa) - SGP30:CO2/TVOC传感器 (400-60000ppm) - BH1750:光照传感器 (1-65535lux) - **通信协议**: - SPI(LCD显示) - I2C(传感器,支持多设备) - **更新频率**:2秒传感器读取,10秒图表更新 - **工作电压**:3.3V - **工作温度**:-10°C ~ +60°C ### 软件特性 - **模块化架构**:每个传感器独立模块,便于维护和扩展 - **WiFi热点Web服务**:现代化Web界面,支持多设备访问 🆕 - **RESTful API**:标准化JSON数据接口 🆕 - **容错设计**:单个传感器故障不影响系统运行 - **实时图表**:温度趋势显示,支持50个数据点历史 - **智能阈值**:可配置的传感器阈值和状态指示 - **蜂鸣器报警**:智能异常检测和多种提示音 - **调试友好**:详细的串口输出和状态显示 ### 内存使用 - **Flash**:约200KB(包含所有传感器库和Web服务器) - **RAM**:约40KB(包含图表数据缓存和Web服务器) - **图表数据**:200字节(50个float数据点) ## 💡 使用技巧 ### WiFi连接技巧 1. **信号范围**:ESP32热点覆盖范围约10-20米 2. **多设备连接**:支持最多4个设备同时连接 3. **浏览器兼容**:支持Chrome、Firefox、Safari、Edge 4. **移动设备**:iPhone、Android都可以正常访问 5. **离线使用**:不需要互联网连接,完全本地运行 ### 监控最佳实践 1. **Web监控**:适合远程监控,多人同时查看 2. **LCD显示**:适合现场快速查看,无需额外设备 3. **数据更新**:Web界面3秒自动刷新,LCD 2秒更新 4. **电源稳定**:建议使用稳定的5V/2A电源适配器 ## ❓ 常见问题解答 ### Q: 无法连接到WiFi热点? **A**: 检查以下几点: - 确保ESP32已正常启动(LCD显示正常) - 查看串口监视器确认热点已启动 - 热点名称:`ESP32_Greenhouse`,密码:`12345678` - 尝试重启ESP32或重启连接设备 ### Q: 浏览器无法打开监控页面? **A**: 请检查: - 确保已连接到ESP32热点 - 访问地址:`http://192.168.4.1`(不是https) - 尝试关闭其他网络连接(WiFi/移动数据) - 清除浏览器缓存或尝试无痕模式 ### Q: 传感器显示"disconnected"? **A**: 可能原因: - 传感器未正确连接或引脚配置错误 - I2C地址冲突(查看技术规格中的地址分配) - 电源供电不足 - 传感器损坏 ### Q: 如何修改WiFi热点名称和密码? **A**: 在`wifi_manager.ino`文件中修改: ```cpp const char* hotspot_ssid = "你的热点名称"; const char* hotspot_password = "你的密码"; // 最少8位 ``` ### Q: 为什么Web界面比LCD显示的数据稍有延迟? **A**: 这是正常现象: - LCD直接从传感器读取(2秒更新) - Web界面通过API获取(3秒自动刷新) - 可以点击"刷新数据"按钮立即更新 ### Q: 能否同时使用WiFi连接到路由器? **A**: 当前版本使用热点模式,如需连接路由器需要修改代码: - 将WiFi模式改为Station模式 - 配置路由器的SSID和密码 - 获取动态IP地址访问 ## 🔄 版本历史 ### v3.0 (完整图表版本) - 2025.09.17 - ✅ 新增24小时数据趋势图 - ✅ 动态X轴范围显示 - ✅ 移动端图表兼容性优化 - ✅ 阈值参数调整优化 - ✅ 内存使用分析和优化 ### v2.0 (WiFi热点版本) - 2025.09.16 - ✅ 新增WiFi热点功能 - ✅ 现代化Web监控界面 - ✅ RESTful API支持 - ✅ 多设备同时访问 - ✅ 响应式设计 - ✅ 移除蓝牙依赖 ## 📈 高级功能详解 ### 24小时数据趋势图 #### 功能概述 Web界面现在包含完整的24小时传感器数据趋势图,支持实时更新和多参数显示。 #### 数据存储系统 - **循环缓冲区**: 288个数据点存储24小时历史数据 - **采样间隔**: 每5分钟记录一次数据点 - **存储参数**: 温度、湿度、CO2、气压、光强度 - **内存占用**: 约6.7KB (仅占ESP32总内存的1.5%) - **自动覆盖**: 超过24小时的数据自动被新数据覆盖 #### 动态X轴范围 图表X轴会根据系统运行时间动态调整显示范围: **启动初期 (0-60分钟)**: - X轴标签: `15m`, `20m`, `25m` (分钟标记) - 标题: "传感器数据趋势 (运行: 25分钟, 共5个数据点)" **运行中期 (1-24小时)**: - X轴标签: `14:30`, `14:35`, `14:40` (小时:分钟) - 标题: "传感器数据趋势 (运行: 3小时15分钟, 共39个数据点)" **稳定阶段 (超过24小时)**: - X轴标签: `9/17 14:30`, `9/17 14:35` (月/日 小时:分钟) - 标题: "传感器数据趋势 (运行: 25小时30分钟, 共288个数据点)" #### 交互式控制 - **全部视图**: 同时显示所有5个传感器参数 - **单参数视图**: 可选择查看温度、湿度、CO2、气压或光强 - **颜色编码**: 每个参数使用不同颜色区分 - **实时更新**: 每30秒自动刷新图表数据 ### 阈值管理系统 #### 5个核心参数 系统现在专注于监控5个核心环境参数: 1. **温度** (°C) - 默认范围: 18-29°C 2. **湿度** (%) - 默认范围: 45-80% 3. **CO2浓度** (ppm) - 默认范围: 300-1200ppm 4. **气压** (hPa) - 默认范围: 1000-1030hPa 5. **光强度** (lux) - 默认范围: 5000-50000lux #### Web界面阈值设置 - **设置面板**: 点击"设置阈值"按钮打开设置界面 - **独立设置**: 每个参数可独立设置最小值和最大值 - **植物预设**: 提供5种植物的优化阈值配置 - **实时保存**: 设置立即生效,无需重启 #### 植物预设配置 | 植物 | 温度(°C) | 湿度(%) | CO2(ppm) | 气压(hPa) | 光强(lux) | |------|----------|---------|----------|-----------|-----------| | 🍅 番茄 | 18-26 | 60-80 | 400-1000 | 1000-1030 | 10000-50000 | | 🥒 黄瓜 | 20-28 | 70-85 | 400-1200 | 1000-1030 | 8000-40000 | | 🥬 生菜 | 15-22 | 50-70 | 300-800 | 1000-1030 | 5000-25000 | | 🌶️ 辣椒 | 22-30 | 55-75 | 400-1000 | 1000-1030 | 12000-60000 | | 🌿 香草 | 16-24 | 40-60 | 300-800 | 1000-1030 | 6000-30000 | ### 移动端兼容性 #### 自动检测和优化 - **Chart.js加载检测**: 自动检测图表库是否成功加载 - **优雅降级**: 图表无法加载时显示友好提示信息 - **响应式CSS**: 专门的移动端样式优化 - **触控优化**: 适配触摸屏操作 #### 错误处理机制 - **CDN失败**: 显示"图表功能暂不可用,请使用电脑浏览器查看完整功能" - **渲染失败**: 显示"图表加载失败,请刷新页面重试" - **数据异常**: 显示加载状态和调试信息 - **兼容性问题**: 自动回退到基础功能 ### 内存管理分析 #### 历史数据存储 ```cpp struct HistoryDataPoint { unsigned long timestamp; // 4字节 float temperature; // 4字节 float humidity; // 4字节 int co2; // 4字节 float pressure; // 4字节 float lightIntensity; // 4字节 }; // 单个数据点: 24字节 // 288个数据点: 6,912字节 (约6.7KB) ``` #### ESP32内存规格 - **总SRAM**: 512KB - **可用内存**: 约400-450KB - **图表数据占用**: 6.7KB (约1.5%) - **安全性评估**: ✅ 内存使用安全,不会影响系统稳定性 #### 优化特性 - **循环缓冲区**: 防止内存泄漏 - **有效数据过滤**: 跳过无效时间戳的数据点 - **动态标签生成**: 避免预先分配大量字符串内存 ### API接口文档 #### RESTful API端点 - **GET /api/data**: 获取当前传感器数据 - **GET /api/status**: 获取系统状态信息 - **GET /api/thresholds**: 获取当前阈值设置 - **POST /api/thresholds**: 更新阈值设置 - **GET /api/history**: 获取24小时历史数据 - **GET /api/stats**: 获取系统性能统计信息 🆕 - **GET /api/alerts**: 获取系统警报日志 🆕 - **GET /api/logs**: 获取系统运行日志 🆕 #### 历史数据API格式 ```json { "data": [ { "timestamp": 1694995200000, "temperature": 25.3, "humidity": 65.2, "co2": 450, "pressure": 1013.25, "lightIntensity": 25000 } ], "interval": 300000 } ``` ### 技术架构优势 #### 双显示系统 - **LCD屏幕**: 50个数据点的温度趋势图,10秒更新间隔 - **Web界面**: 288个数据点的完整趋势图,30秒更新间隔 - **智能颜色编码**: 基于阈值的实时状态颜色反馈 🆕 - **独立运行**: 两个系统使用不同的变量名,避免冲突 #### 监控系统架构 🆕 - **系统性能监控**: CPU使用率、内存统计、WiFi信号强度 - **健康状态检测**: 传感器状态、连接质量、运行时间 - **日志系统**: 警报事件记录、系统状态变化追踪 - **统计分析**: 24小时数据趋势、最值统计、可靠性分析 - **实时仪表板**: 系统概况、性能指标、状态监控 #### 智能UI系统 🆕 - **动态颜色编码**: 传感器卡片根据阈值状态变色 - **状态分级显示**: 正常(绿色)、警告(黄色)、危险(红色) - **实时状态更新**: 每3秒刷新传感器状态和颜色 - **视觉反馈优化**: 边框指示器、文字颜色同步、平滑过渡 - **三端状态统一**: LCD圆点、网页卡片、蜂鸣器使用一致判断逻辑 #### 统一阈值系统 🆕 - **状态枚举**: NORMAL/WARNING/CRITICAL/DISCONNECTED四级状态 - **自动警告边界**: 阈值范围10%区域自动计算警告状态 - **CO2专用逻辑**: 固定100ppm警告边界适配CO2特性 - **断线处理**: -999特殊值统一表示传感器未连接状态 - **一致性保证**: 所有显示端使用相同的`getSensorStatus()`函数 #### 交互式图表系统 🆕 - **竖线跟随**: Chart.js自定义插件绘制跟随鼠标的虚线 - **实时tooltip**: 内置气泡显示精确时间点的传感器数值 - **移动端优化**: 触摸拖动支持,响应式交互设计 - **性能优化**: 删除冗余数据面板,界面简洁高效 #### 模块化设计 - **传感器模块**: 每个传感器独立的.ino文件 - **显示管理**: LCD显示逻辑分离 - **WiFi管理**: Web服务器功能独立 - **数据管理**: 历史数据存储独立 #### 扩展性设计 - **新传感器**: 只需添加对应模块文件 - **新功能**: API端点易于扩展 - **新界面**: Web界面组件化设计 - **配置灵活**: 阈值和参数可动态调整 ## 📋 更新日志 ### v2.2.0 (2024-12-22) - 统一阈值系统与交互优化 🆕 - 🎯 **统一阈值判断逻辑** - LCD、网页端、蜂鸣器使用完全一致的状态判断标准 - 解决了"网页变黄但LCD还绿"的不一致问题 - 统一的传感器状态枚举(NORMAL/WARNING/CRITICAL/DISCONNECTED) - 📈 **交互式图表功能** - 鼠标悬停/触摸显示跟随竖线 - Chart.js内置tooltip显示精确时间点数据 - 移动端触摸拖动支持 - 删除冗余的数据详情面板,界面更简洁 - 🔧 **传感器阈值优化** - 光照传感器阈值调整为100-10000lux(更适合室内环境) - 所有传感器状态计算逻辑统一 - 警告边界自动计算(10%阈值区域) - 🐛 **Bug修复** - 修复LCD光照和气压传感器状态显示不准确问题 - 统一蜂鸣器警报触发条件 - 完善传感器断线状态处理 ### v2.1.0 (2024-12-19) - 智能UI更新 - ✨ **新增智能传感器颜色编码系统** - 绿色:正常状态,数值在安全范围内 - 黄色:警告状态,数值接近阈值边界 - 红色:危险状态,数值超出设定阈值 - 🎨 **优化Web界面视觉效果** - 传感器卡片动态背景色变化 - 彩色边框指示器 - 数值文字颜色同步 - 平滑的颜色过渡动画 - 🔄 **改进状态判断逻辑** - 实时获取阈值配置 - 智能警告区域计算(阈值范围的10%边界) - 每3秒自动更新颜色状态 ### v2.0.0 (2024-12-18) - 系统监控大更新 - 🌐 **全面的系统监控功能** - 性能监测:CPU使用率、内存使用、WiFi信号强度 - 健康检测:传感器状态、连接质量、系统运行时间 - 系统日志:警报事件记录、状态变化追踪 - 统计分析:24小时数据趋势、最值统计 - 实时仪表板:系统概况、性能指标 - 📊 **新增API端点** - `/api/stats` - 系统性能统计 - `/api/alerts` - 系统警报日志 - `/api/logs` - 系统运行日志 - 🎛️ **增强的Web界面** - 系统监控面板 - 实时状态显示 - 数据导出功能 ### v1.0.0 (2024-12-15) - WiFi热点版本 - 🌐 **WiFi热点功能** - 📱 **现代化Web界面** - 📊 **实时数据图表** - 🔧 **阈值配置功能** - 📈 **历史数据记录** --- ## 💡 技术支持 如有问题或建议,欢迎提交Issue或Pull Request! **开发环境**:Arduino IDE 2.x,ESP32 Arduino Core **测试硬件**:Arduino Nano ESP32,240x320 ST7789 LCD --- ## 🌐 多设备监控扩展方案 ### 主从架构设计(推荐方案) 如果你需要用一个手机监控多个温室,可以采用主从架构:用其中一个ESP32作为数据中心,其他ESP32作为传感器节点。 #### 架构概述 - **主节点(数据中心)**:一个ESP32作为WiFi热点 + 数据收集器 - **从节点(传感器节点)**:其他ESP32只负责传感器数据采集 + 数据上报 #### 主节点功能 1. **WiFi热点**:提供`ESP32_Greenhouse_Master`热点 2. **Web服务器**:提供统一的监控界面 3. **数据接收**:接收其他节点上报的数据 4. **本地传感器**:同时监控自己的传感器 5. **数据存储**:汇总所有节点的历史数据 6. **统一显示**:一个界面显示所有温室数据 #### 从节点功能 1. **WiFi客户端**:连接到主节点的热点 2. **传感器采集**:读取本地传感器数据 3. **数据上报**:定期向主节点POST数据 4. **简化显示**:LCD只显示本地数据和连接状态 #### 通信协议设计 **从节点上报数据格式:** ```json { "nodeId": "greenhouse_02", "nodeName": "温室2号", "timestamp": 1694995200, "data": { "temperature": 25.3, "humidity": 65.2, "co2": 450, "pressure": 1013.25, "light": 25000 }, "status": "normal" } ``` **主节点API端点:** - `POST /api/node/data` - 接收从节点数据上报 - `GET /api/nodes` - 获取所有节点列表 - `GET /api/node/{nodeId}/data` - 获取特定节点数据 - `GET /api/dashboard` - 获取所有节点汇总数据 #### Web界面效果 主节点的Web界面将显示: ``` 温室监控中心 ┌─────────────────┬─────────────────┬─────────────────┐ │ 主节点(本机) │ 温室2号 │ 温室3号 │ │ 🟢 在线 │ 🟢 在线 │ 🔴 离线 │ │ 温度: 25.3°C │ 温度: 26.1°C │ 温度: -- │ │ 湿度: 65% │ 湿度: 68% │ 湿度: -- │ │ CO2: 450ppm │ CO2: 420ppm │ CO2: -- │ └─────────────────┴─────────────────┴─────────────────┘ ``` #### 实现优势 1. **成本效益**:无需额外硬件,充分利用现有ESP32 2. **网络简单**:所有设备连接一个热点,无需路由器 3. **数据集中**:主节点统一存储和管理所有数据 4. **扩展性好**:容易添加新的从节点 5. **故障隔离**:从节点故障不影响其他节点 6. **移动友好**:手机只需连接一个WiFi即可看所有数据 #### 部署建议 1. **主节点选择**:选择位置居中、信号覆盖最好的ESP32作为主节点 2. **节点编号**: - 主节点:`greenhouse_master` - 从节点:`greenhouse_01`, `greenhouse_02`, `greenhouse_03`... 3. **通信频率**:从节点每30秒向主节点上报一次数据 4. **故障处理**:从节点连接失败时显示离线状态 --- ## 📚 文档说明 本README.md包含了项目的完整文档,涵盖: - 基础硬件连接和软件安装 - WiFi热点Web监控使用指南 - 24小时数据趋势图功能详解 - 阈值管理和植物预设系统 - 移动端兼容性优化说明 - 内存使用分析和系统架构 - API接口文档和扩展指南 如有问题或需要进一步定制,请参考代码注释或联系开发者。 ### v1.0 (本地LCD版本) - ✅ 240x320 LCD显示界面 - ✅ 多传感器集成 - ✅ 温度趋势图表 - ✅ 蜂鸣器报警系统 - ✅ 智能传感器管理 - ✅ 模块化架构设计 ### 性能指标 - **启动时间**:约5-8秒(包含传感器初始化) - **响应时间**:<100ms(传感器读取) - **显示刷新**:60FPS(理论值,实际约30FPS) - **功耗**:约200-300mA @3.3V(LCD背光开启) ![alt text](image.png)