ESP32教程35/55 - 植物监测器,土壤、温度和光照 | SunFounder的ESP32物联网学习套件
在本教程中,我们将使用SunFounder ESP32 IoT学习套件中的ESP32微控制器来构建一个植物监测器。该项目结合了多个组件来监测土壤湿度、温度、湿度和光照强度。通过本指南的学习,您将拥有一个功能完备的系统,能够管理和显示植物护理所需的关键参数。如需详细的视觉讲解,请务必观看视频(视频中00:00处)。

硬件详解
本项目使用的主要组件包括ESP32微控制器、DHT11传感器、土壤湿度传感器、光敏电阻(LDR)以及用于显示数据的LCD显示屏。ESP32作为整个系统的核心,负责数据处理和控制任务。它内置Wi-Fi和蓝牙功能,为远程监控提供了连接选项。
DHT11传感器用于测量温度和湿度,而土壤湿度传感器则检测土壤中的水分含量。LDR测量环境光强度,有助于了解植物的光照条件。每个组件都通过提供实时数据,在确保植物健康方面发挥着至关重要的作用。
数据手册详情
| 制造商 | SunFounder |
|---|---|
| 零件编号 | DHT11 |
| 逻辑/IO电压 | 3.3 V |
| 电源电压 | 5 V |
| 输出电流(每通道) | 20 mA |
| 峰值电流(每通道) | 50 mA |
| PWM频率指南 | 不适用 |
| 输入逻辑阈值 | 0.3 VCC(低电平),0.7 VCC(高电平) |
| 压降 / RDS(on) / 饱和电压 | 不适用 |
| 热限制 | 0°C至50°C |
| 封装 | DIP |
| 备注/变体 | 兼容DHT22 |
- 确保每个组件的电压水平正确(电机驱动器为5V,传感器为3.3V)。
- 为按钮使用下拉电阻,以防止输入引脚悬空。
- 保持布线整洁,以避免混淆和潜在的短路。
- 在给电路通电前检查连接,以防止损坏。
- 检查DHT11的接线,因为它对错误连接很敏感。
接线说明

要连接组件,首先连接电源线和地线。ESP32应使用锂电池供电,将正极连接到面包板上的VCC线,负极连接到GND线。DHT11传感器的数据引脚连接到PIN 13,其VCC连接到3.3V线,GND连接到地线。土壤湿度传感器的连接方式类似:其信号引脚连接到PIN 14,VCC连接到3.3V,GND连接到地线。
对于LDR,将一个引脚连接到3.3V线,另一个引脚连接到PIN 35,并从LDR到地线连接一个10k欧姆电阻。LCD显示屏连接到5V线供电,并使用SDA和SCL引脚分别连接到PIN 21和PIN 22。最后,将按钮连接到PIN 32,并将下拉电阻连接到地线,确保未按下时读取低电平,按下时读取高电平。
代码示例与讲解
我们程序的核心首先是为每个组件定义引脚。例如,DHTPIN被分配给PIN 13用于DHT11传感器,而MOIS_PIN被设置为PIN 14用于湿度传感器。这种组织方式有助于跟踪哪个传感器连接到哪个引脚。
#define DHTPIN 13 // 设置连接到DHT11数据引脚的引脚
#define MOIS_PIN 14 // 土壤湿度模块
#define LIGHT_PIN 35 // 光敏电阻
接下来,我们在setup()函数中初始化DHT传感器和LCD显示屏。这对于准备这些组件进行工作至关重要。确保调用dht.begin()对于DHT传感器开始正确读取数值是必不可少的。
void setup() {
Serial.begin(115200);
dht.begin(); // 初始化DHT11
lcd.init(); // 初始化LCD
lcd.backlight();
}
在loop()函数中,我们持续读取温度和湿度值,并将其显示在LCD上。如果按钮被按下,电机将被激活以浇灌植物。该逻辑使用按钮引脚的数字读取来确定是打开还是关闭电机。
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (digitalRead(BUTTON) == HIGH) {
digitalWrite(motor1A, HIGH); // 打开水泵
} else {
digitalWrite(motor1A, LOW); // 关闭水泵
}
delay(2000);
}
这种代码结构使得数据和控制的流程清晰明了,确保植物监测器平稳运行。如需更多细节,完整代码将在文章下方加载。
演示/预期效果
完成设置并上传代码后,LCD应交替显示温度和湿度读数以及土壤湿度和光照水平。按下按钮时,水泵应启动,向植物供水。确保所有连接牢固,以避免浮动输入或错误读数等问题(视频中05:30处)。
监测LCD和串口监视器上显示的值将有助于确保系统正常运行。如果遇到问题,请仔细检查接线,并确保所有组件供电正常。
视频时间戳
- 00:00 开始
- 2:23 项目介绍
- 4:02 文档页面
- 7:43 1-L293D水泵电机驱动器
- 14:30 2-水泵按钮
- 16:35 3-DHT11温湿度传感器
- 19:26 4-土壤湿度传感器
- 21:43 5-光照传感器
- 24:47 6-土壤湿度传感器
- 26:01 完整植物监测器Arduino代码
- 29:21 演示
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 13 // Set the pin connected to the DHT11 data pin
#define MOIS_PIN 14 // Soil mOisture module
#define LIGHT_PIN 35 // Photoresistor
#define motor1A 27 // Pump pin
#define motor2A 26 // Pump pin
#define BUTTON 32 // Button
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
int page = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Initialize the dht11
dht.begin();
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.clear();
// initialize digital pin as an output.
pinMode(motor1A, OUTPUT);
pinMode(motor2A, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
float humidity = dht.readHumidity();
// Read temperature as Celsius (the default)
float temperature = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
lcd.clear();
// Show message per 2 second
if ((page++) % 2) {
// Display temperature and humidity
lcd.setCursor(0, 0);
lcd.print("Humi: ");
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("\xDF");
lcd.print("C");
} else {
// Display moisture and light sensor values
lcd.setCursor(0, 0);
lcd.print("Mois: ");
lcd.print(analogRead(MOIS_PIN));
lcd.setCursor(0, 1);
lcd.print("Light: ");
lcd.print(analogRead(LIGHT_PIN));
}
// Water plant while button pressed
Serial.println(digitalRead(BUTTON));
if (digitalRead(BUTTON) == HIGH) {
// Turn on water pump if button is pressed
digitalWrite(motor1A, HIGH);
digitalWrite(motor2A, LOW);
} else {
// Turn off water pump if button is not pressed
digitalWrite(motor1A, LOW);
digitalWrite(motor2A, LOW);
}
delay(2000);
}
Common Course Links
Common Course Files
|||您可能需要的东西
-
亚马逊从亚马逊购买LCD1602-I2Camzn.to
-
易趣在eBay上购买LCD1602-I2Cebay.us
-
全球速卖通在AliExpress上购买10个LCD1602-I2Cs.click.aliexpress.com
资源与参考
-
文档ESP32教程 35/55- SunFounder文档页面植物监测器docs.sunfounder.com
文件📁
Fritzing 文件
-
DHT11 Humitidy and Temperature Sensor (3 pins)
DHT11 Humitidy and Temperature Sensor (3 pins).fzpz0.20 MB -
LCD LCD1602-I2C module with 4 wires
LCD1602-I2C.fzpz0.01 MB