当前位置: 首页 > news >正文

用ESP32+DHT22+BH1750做个智能养花养鱼小管家(附完整代码和接线图)

ESP32+DHT22+BH1750智能养花养鱼系统实战指南

家里养了几盆绿植和小鱼缸的朋友们,是否经常遇到这样的困扰:出差几天回来,发现心爱的植物蔫了,鱼缸水质变差?今天我们就用ESP32开发板搭配DHT22温湿度传感器和BH1750光照传感器,打造一个智能养护系统,让您的绿植和鱼儿得到全天候呵护。

1. 系统设计与核心功能

这个智能养护系统的核心在于实时监测环境参数并做出智能响应。不同于市面上昂贵的商业解决方案,我们的DIY方案成本低廉但功能全面,特别适合家庭场景使用。

系统主要功能模块:

  • 环境监测:通过DHT22获取空气温湿度,BH1750测量光照强度
  • 土壤湿度管理:使用土壤湿度传感器监测盆栽水分状况
  • 水温监控:DS18B20防水温度传感器负责鱼缸水温监测
  • 智能控制:根据传感器数据自动控制水泵和照明设备
  • 报警系统:当参数超出设定范围时触发蜂鸣器报警
  • 数据显示:OLED屏幕实时展示各项环境数据

提示:系统采用模块化设计,您可以根据实际需求选择安装部分传感器。比如只养花可以去掉水温监测模块,只养鱼则可以省略土壤湿度检测。

2. 硬件准备与接线指南

2.1 所需材料清单

组件型号数量备注
主控板ESP32开发板1推荐使用ESP32-WROOM-32
温湿度传感器DHT221也可用DHT11替代
光照传感器BH17501数字I2C接口
土壤湿度传感器模拟量输出1需配合ADC使用
水温传感器DS18B201防水封装
OLED显示屏0.96寸SSD13061I2C接口
继电器模块5V1控制水泵/灯光
蜂鸣器有源1报警提示用
水泵微型3-5V1根据需求选择流量
面包板/PCB-1建议使用PCB更稳定
杜邦线-若干建议使用不同颜色区分

2.2 接线示意图

以下是主要传感器的接线方式(ESP32引脚可根据实际情况调整):

DHT22温湿度传感器: DATA → GPIO32 VCC → 3.3V GND → GND BH1750光照传感器: SCL → GPIO22 SDA → GPIO21 VCC → 3.3V GND → GND DS18B20水温传感器: DATA → GPIO4 VCC → 3.3V GND → GND 土壤湿度传感器: SIG → GPIO34 VCC → 3.3V GND → GND OLED显示屏: SCL → GPIO22 SDA → GPIO21 VCC → 3.3V GND → GND 继电器模块: IN → GPIO2 VCC → 5V GND → GND 蜂鸣器: I/O → GPIO19 VCC → 3.3V GND → GND

注意:多个I2C设备可以共用SCL/SDA引脚,但需要确保地址不冲突。BH1750默认地址是0x23,SSD1306通常是0x3C。

3. 软件开发环境搭建

3.1 PlatformIO环境配置

推荐使用VS Code+PlatformIO组合进行开发,相比Arduino IDE具有更好的代码管理功能。

  1. 安装VS Code(Visual Studio Code)
  2. 在扩展商店搜索并安装PlatformIO IDE
  3. 创建新项目,选择ESP32开发板(如ESP32 Dev Module)
  4. 在platformio.ini中添加必要的库依赖:
[env:esp32dev] platform = espressif32 board = esp32dev framework = arduino lib_deps = adafruit/Adafruit BH1750 Library@^1.2.0 adafruit/DHT sensor library@^1.4.3 olikraus/U8g2@^2.32.15 milesburton/DallasTemperature@^3.9.1 paulstoffregen/OneWire@^2.3.7

3.2 核心代码实现

以下是系统的主框架代码,包含传感器初始化和数据读取逻辑:

#include <Wire.h> #include <U8g2lib.h> #include <DHT.h> #include <BH1750.h> #include <OneWire.h> #include <DallasTemperature.h> // 传感器引脚定义 #define DHTPIN 32 #define DHTTYPE DHT22 #define SOIL_MOISTURE_PIN 34 #define WATER_TEMP_PIN 4 #define RELAY_PIN 2 #define BUZZER_PIN 19 // 传感器对象初始化 DHT dht(DHTPIN, DHTTYPE); BH1750 lightMeter; OneWire oneWire(WATER_TEMP_PIN); DallasTemperature waterTempSensor(&oneWire); U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); // 全局变量存储传感器数据 float temperature = 0; float humidity = 0; float lightLevel = 0; int soilMoisture = 0; float waterTemperature = 0; bool relayState = false; void setup() { Serial.begin(115200); // 初始化传感器 dht.begin(); Wire.begin(); lightMeter.begin(); waterTempSensor.begin(); // 设置继电器和蜂鸣器引脚 pinMode(RELAY_PIN, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); // 初始化OLED u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0,10,"System Initializing..."); u8g2.sendBuffer(); delay(1000); } void loop() { readSensors(); controlSystem(); displayData(); delay(2000); // 每2秒更新一次 } void readSensors() { // 读取DHT22数据 temperature = dht.readTemperature(); humidity = dht.readHumidity(); // 读取BH1750数据 lightLevel = lightMeter.readLightLevel(); // 读取土壤湿度 soilMoisture = analogRead(SOIL_MOISTURE_PIN); // 读取水温 waterTempSensor.requestTemperatures(); waterTemperature = waterTempSensor.getTempCByIndex(0); } void controlSystem() { // 自动灌溉控制 if (soilMoisture < 1500) { // 土壤干燥阈值 digitalWrite(RELAY_PIN, HIGH); // 开启水泵 relayState = true; } else if (soilMoisture > 2500) { // 土壤湿润阈值 digitalWrite(RELAY_PIN, LOW); // 关闭水泵 relayState = false; } // 水温异常报警 if (waterTemperature > 30 || waterTemperature < 18) { digitalWrite(BUZZER_PIN, HIGH); } else { digitalWrite(BUZZER_PIN, LOW); } } void displayData() { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); // 显示温湿度 u8g2.setCursor(0, 10); u8g2.print("Temp: "); u8g2.print(temperature); u8g2.print(" C"); u8g2.setCursor(0, 20); u8g2.print("Humidity: "); u8g2.print(humidity); u8g2.print(" %"); // 显示光照强度 u8g2.setCursor(0, 30); u8g2.print("Light: "); u8g2.print(lightLevel); u8g2.print(" lx"); // 显示土壤湿度 u8g2.setCursor(0, 40); u8g2.print("Soil: "); u8g2.print(soilMoisture); // 显示水温 u8g2.setCursor(0, 50); u8g2.print("Water Temp: "); u8g2.print(waterTemperature); u8g2.print(" C"); // 显示继电器状态 u8g2.setCursor(0, 60); u8g2.print("Pump: "); u8g2.print(relayState ? "ON" : "OFF"); u8g2.sendBuffer(); }

4. 系统优化与扩展功能

4.1 校准与阈值设置

不同植物和鱼类对环境参数的要求各异,系统需要根据实际情况调整阈值:

常见植物适宜环境参数:

  • 多肉植物:温度15-28°C,湿度30-50%,光照20000-50000lx
  • 观叶植物:温度18-30°C,湿度50-70%,光照10000-30000lx
  • 水生植物:水温20-28°C,光照15000-40000lx

鱼类适宜水温范围:

  • 热带鱼:24-28°C
  • 金鱼:18-24°C
  • 锦鲤:15-25°C

校准方法示例(添加到setup函数中):

// 土壤湿度传感器校准(将传感器放入空气和水中读取极值) void calibrateSoilSensor() { Serial.println("Calibrating soil sensor..."); Serial.println("Place sensor in air and press any key"); while(!Serial.available()); int dryValue = analogRead(SOIL_MOISTURE_PIN); Serial.read(); Serial.println("Place sensor in water and press any key"); while(!Serial.available()); int wetValue = analogRead(SOIL_MOISTURE_PIN); Serial.read(); Serial.print("Dry value: "); Serial.println(dryValue); Serial.print("Wet value: "); Serial.println(wetValue); }

4.2 无线连接与远程监控

通过WiFi模块可以实现远程监控和控制:

  1. 添加Web服务器功能:ESP32内置WiFi,可以创建一个简单的Web页面显示传感器数据
  2. MQTT协议接入:将数据发布到MQTT服务器,实现远程监控
  3. Telegram机器人通知:当参数异常时发送报警消息到手机

示例代码片段(WiFi连接):

#include <WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void connectWiFi() { WiFi.begin(ssid, password); Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); }

4.3 电源管理与低功耗优化

对于需要长期运行的系统,功耗优化非常重要:

  • 使用深度睡眠模式(Deep Sleep)定期唤醒采集数据
  • 关闭未使用的硬件外设(如蓝牙、WiFi模块)
  • 选择低功耗传感器型号
  • 考虑使用太阳能供电系统

深度睡眠示例:

#define uS_TO_S_FACTOR 1000000 // 微秒到秒转换因子 #define TIME_TO_SLEEP 300 // 休眠时间(秒) void setup() { // ...其他初始化代码... // 配置唤醒源 esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); // 读取传感器数据并执行控制逻辑 readSensors(); controlSystem(); displayData(); // 进入深度睡眠 esp_deep_sleep_start(); } void loop() { // 由于使用了深度睡眠,loop函数不会执行 }

5. 常见问题与解决方案

在实际搭建过程中可能会遇到以下问题:

1. 传感器读数不稳定或异常

  • 检查电源:确保所有传感器供电稳定,必要时增加滤波电容
  • 验证接线:确认引脚连接正确,没有松动或接触不良
  • 添加延时:在传感器初始化后增加适当延时(特别是DHT22)
  • 软件滤波:采用滑动平均或中值滤波算法处理数据

2. OLED显示屏不工作

  • 确认I2C地址:使用I2C扫描工具检查设备地址
  • 检查上拉电阻:部分模块需要外接4.7kΩ上拉电阻
  • 验证库文件:确保使用了正确的U8g2库和初始化参数

3. 继电器无法控制水泵

  • 检查电压匹配:确认继电器和水泵的额定电压
  • 测试独立工作:先用简单代码测试继电器单独工作是否正常
  • 注意电流限制:ESP32 GPIO最大输出电流有限,可能需要驱动电路

4. 系统整体功耗过高

  • 优化采集频率:降低数据采集频率(如从1秒改为10秒一次)
  • 关闭调试输出:减少Serial.print的使用
  • 使用低功耗模式:如前面介绍的深度睡眠方案

5. 无线连接不稳定

  • 增强信号强度:调整ESP32与路由器的位置或增加中继
  • 优化重连逻辑:实现自动重连机制
  • 降低传输数据量:减少不必要的数据传输
http://www.jsqmd.com/news/565542/

相关文章:

  • 2026年3月瓦楞纸箱加工厂家推荐,瓦楞纸盒加工,彩色纸箱纸盒礼品盒加工,包装制品实力源头厂商精选 - 品牌企业推荐师(官方)
  • 如何5分钟修复Windows更新问题:Reset Windows Update Tool完整指南
  • EVA-02快速部署指南:3步完成Ubuntu环境下的模型服务搭建
  • 快速掌握Cursor Pro解锁工具:新手必备的完整操作指南
  • 2026四川阳光房厂家推荐|家装/别墅/民宿/工程精选,避坑不踩雷 - 深度智识库
  • 3步终极指南:让旧Mac重获新生的完整教程
  • 2026年冰雕制作厂家推荐:郑州远鸿冰雕技术服务,室内外冰雕/创意设计/冰雪节一站式服务 - 品牌推荐官
  • GHelper:华硕笔记本性能调校的轻量级遥控器
  • 从养鱼场到无人船:聊聊AI海浪预测模型DGWBNet在海上作业中的真实应用场景
  • 一键部署GPT-SoVITS:Docker容器化语音克隆服务搭建
  • 千元预算搭建本地大模型?手把手教你省钱又强
  • OCRmyPDF压缩架构解析:企业级实践与效能优化指南
  • Dispose 不释放?C# 资源泄漏的 3 种隐蔽场景排查
  • 2026年温州守杰包装科技包装创新设计如何,费用多少钱 - myqiye
  • GPU稳定性测试与显存故障诊断指南:从问题排查到深度优化
  • 【数据库 面试突击 · 02】大厂高频面试题:从三范式到日志机制全梳理
  • 讲讲2026年女士腰带定制供应商哪个靠谱,湖南浙江优质之选 - 工业品牌热点
  • 病毒进化追踪:系统动力学与贝叶斯天际线在疫情分析中的应用
  • 智能手环/耳机开发必看:BLE广播数据(AdvData)里到底塞了啥?从Type到Data全解析
  • SAP 企业管理软件全解析:ERP 云技术架构与商业 AI 落地实践
  • 温州守杰包装科技规模怎么样,它的满意度怎么样有答案了吗 - mypinpai
  • OpenRocket火箭仿真软件:从开源代码到精确飞行的技术深度解析
  • Qwen3-VL-2B与Gemini-Pro对比:国产轻量模型表现如何?
  • 如何让QQ空间记忆跨越平台生命周期?GetQzonehistory守护数字青春的完整指南
  • Markdown高效预览全攻略:从入门到精通
  • XMind ZEN模式深度体验:我是如何用它一周写完毕业论文开题报告的
  • Chainlit前端调用Qwen1.5-1.8B-GPTQ-Int4:图文并茂的交互式部署教程
  • 从零搭建智能交互系统:py-xiaozhi开源方案全解析
  • DriverStore Explorer:释放Windows磁盘空间的终极方案
  • 革新性车载系统定制:一站式释放Harman MIB 2.x设备潜能