#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// 引脚定义
#define DHTPIN 2 // DHT传感器连接的数字引脚2
#define DHTTYPE DHT22 // 使用DHT22型号温湿度传感器
#define SOIL_MOISTURE_PIN A0 // 土壤湿度传感器(电位器)连接的模拟引脚A0
#define LIGHT_SENSOR_PIN A1 // 光照传感器(电位器)连接的模拟引脚A1
#define PUMP_PIN 3 // 水泵控制引脚(继电器)
#define LED_RED 4 // 红色LED指示灯引脚(浇水)
#define LED_GREEN 5 // 绿色LED指示灯引脚(系统正常)
#define HEATER_PIN 6 // 紫色加热器控制引脚(低温时启动)
#define FAN_PIN 7 //黄色 风扇控制引脚(高温时启动)
#define GROW_LIGHT_PIN 8 // 蓝色植物生长灯控制引脚(光照不足时启动)
#define SHADE_PIN 9 //棕色 遮阳系统控制引脚(光照过强时启动)
#define BUZZER_PIN 10 // 蜂鸣器控制引脚
// 创建传感器和LCD对象
DHT dht(DHTPIN, DHTTYPE); // 初始化DHT传感器对象
LiquidCrystal_I2C lcd(0x27, 16, 2); // 初始化LCD对象,I2C地址0x27,16列2行显示
// 系统参数配置
const int DRY_THRESHOLD = 500; // 土壤干燥阈值(值越大越干燥)
const int WATERING_TIME = 5000; // 浇水持续时间(毫秒)
const float TEMP_LOW_THRESHOLD = 15; // 低温阈值(低于此温度启动加热器)
const float TEMP_HIGH_THRESHOLD = 30;// 高温阈值(高于此温度启动风扇)
const int LIGHT_LOW_THRESHOLD = 20; // 低光照阈值(低于此值启动生长灯)
const int LIGHT_HIGH_THRESHOLD = 80; // 高光照阈值(高于此值启动遮阳系统)
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率9600
// 设置所有引脚模式
pinMode(PUMP_PIN, OUTPUT); // 水泵控制
pinMode(LED_RED, OUTPUT); // 红色LED(浇水指示)
pinMode(LED_GREEN, OUTPUT); // 绿色LED(系统正常)
pinMode(HEATER_PIN, OUTPUT); // 加热器控制
pinMode(FAN_PIN, OUTPUT); // 风扇控制
pinMode(GROW_LIGHT_PIN, OUTPUT);// 植物生长灯控制
pinMode(SHADE_PIN, OUTPUT); // 遮阳系统控制
pinMode(BUZZER_PIN, OUTPUT); // 蜂鸣器控制
// 初始化所有设备状态
digitalWrite(PUMP_PIN, LOW); // 关闭水泵
digitalWrite(LED_RED, LOW); // 关闭红色LED
digitalWrite(LED_GREEN, HIGH); // 开启绿色LED(系统正常)
digitalWrite(HEATER_PIN, LOW); // 关闭加热器
digitalWrite(FAN_PIN, LOW); // 关闭风扇
digitalWrite(GROW_LIGHT_PIN, LOW); // 关闭生长灯
digitalWrite(SHADE_PIN, LOW); // 关闭遮阳系统
digitalWrite(BUZZER_PIN, LOW); // 关闭蜂鸣器
dht.begin(); // 初始化DHT传感器
lcd.init(); // 初始化LCD显示屏
lcd.backlight(); // 打开LCD背光
// 显示启动信息
lcd.setCursor(0, 0); // 设置光标位置(第0列, 第0行)
lcd.print("Advanced SmartFarm"); // 显示系统名称
lcd.setCursor(0, 1); // 设置光标位置(第0列, 第1行)
lcd.print("Temp & Light Ctrl"); // 显示"温光控制版本"
delay(2000); // 显示2秒后进入主循环
}
void loop() {
// 读取传感器和电位器数据
int soilMoisture = analogRead(SOIL_MOISTURE_PIN); // 读取土壤湿度电位器值
int lightLevel = analogRead(LIGHT_SENSOR_PIN); // 读取光照强度电位器值
float temp = dht.readTemperature(); // 读取温度值(摄氏度)
float humidity = dht.readHumidity(); // 读取湿度值(百分比)
// 计算映射后的百分比值
int soilMoisturePercent = map(soilMoisture, 0, 1023, 100, 0); // 土壤湿度百分比
int lightLevelPercent = map(lightLevel, 0, 1023, 0, 100); // 光照强度百分比
// 自动灌溉控制逻辑
if (soilMoisture > DRY_THRESHOLD) { // 检查土壤是否干燥
lcd.clear(); // 清除LCD显示
lcd.print("Watering Plants..."); // 显示浇水提示
// 启动浇水
digitalWrite(PUMP_PIN, HIGH); // 打开水泵
digitalWrite(LED_RED, HIGH); // 点亮红色LED(浇水指示)
digitalWrite(LED_GREEN, LOW); // 关闭绿色LED
digitalWrite(BUZZER_PIN, HIGH); // 打开蜂鸣器(持续响)
// 保持浇水状态设定的时间,蜂鸣器持续响
unsigned long startTime = millis();
while (millis() - startTime < WATERING_TIME) {
// 在这里可以添加其他需要实时响应的功能
// 例如:检查紧急停止按钮等
}
// 停止浇水
digitalWrite(PUMP_PIN, LOW); // 关闭水泵
digitalWrite(LED_RED, LOW); // 关闭红色LED
digitalWrite(LED_GREEN, HIGH); // 点亮绿色LED(系统正常)
digitalWrite(BUZZER_PIN, LOW); // 关闭蜂鸣器
}
// 温度调控系统
if (temp < TEMP_LOW_THRESHOLD) {
// 温度过低,启动加热器
digitalWrite(HEATER_PIN, HIGH); // 打开加热器
digitalWrite(FAN_PIN, LOW); // 确保风扇关闭
} else if (temp > TEMP_HIGH_THRESHOLD) {
// 温度过高,启动风扇降温
digitalWrite(FAN_PIN, HIGH); // 打开风扇
digitalWrite(HEATER_PIN, LOW); // 确保加热器关闭
} else {
// 温度在正常范围内
digitalWrite(HEATER_PIN, LOW); // 关闭加热器
digitalWrite(FAN_PIN, LOW); // 关闭风扇
}
// 光照调控系统
if (lightLevelPercent < LIGHT_LOW_THRESHOLD) {
// 光照不足,启动生长灯
digitalWrite(GROW_LIGHT_PIN, HIGH); // 打开生长灯
digitalWrite(SHADE_PIN, LOW); // 确保遮阳系统关闭
} else if (lightLevelPercent > LIGHT_HIGH_THRESHOLD) {
// 光照过强,启动遮阳系统
digitalWrite(SHADE_PIN, HIGH); // 打开遮阳系统
digitalWrite(GROW_LIGHT_PIN, LOW); // 确保生长灯关闭
} else {
// 光照在正常范围内
digitalWrite(GROW_LIGHT_PIN, LOW); // 关闭生长灯
digitalWrite(SHADE_PIN, LOW); // 关闭遮阳系统
}
// 在LCD上显示传感器数据
lcd.clear(); // 清除LCD显示
// 第一行: 温度状态 + 实际温度
lcd.setCursor(0, 0); // 设置光标到第0行开头
if (digitalRead(HEATER_PIN)) {
lcd.print("HEAT ON "); // 显示加热状态
} else if (digitalRead(FAN_PIN)) {
lcd.print("COOL ON "); // 显示降温状态
} else {
lcd.print("TEMP OK "); // 显示温度正常
}
lcd.print("T:"); // 显示温度标签
lcd.print(temp, 1); // 显示温度值(保留1位小数)
lcd.print("C"); // 显示摄氏度符号
// 第二行: 光照状态 + 实际光照
lcd.setCursor(0, 1); // 设置光标到第1行开头
if (digitalRead(GROW_LIGHT_PIN)) {
lcd.print("LIGHT+ "); // 显示补光状态
} else if (digitalRead(SHADE_PIN)) {
lcd.print("SHADE ON"); // 显示遮阳状态
} else {
lcd.print("LIGHT OK"); // 显示光照正常
}
lcd.print(" L:"); // 显示光照标签
lcd.print(lightLevelPercent); // 显示光照百分比
lcd.print("%"); // 显示百分比符号
// 通过串口输出详细数据(用于调试)
Serial.print("Temperature: ");
Serial.print(temp, 1); // 温度保留1位小数
Serial.print("°C | Humidity: ");
Serial.print(humidity, 1); // 湿度保留1位小数
Serial.print("% | Soil: ");
Serial.print(soilMoisturePercent);
Serial.print("% | Light: ");
Serial.print(lightLevelPercent);
Serial.print("% | Systems: ");
// 输出系统状态
if (digitalRead(HEATER_PIN)) Serial.print("[HEATER] ");
if (digitalRead(FAN_PIN)) Serial.print("[FAN] ");
if (digitalRead(GROW_LIGHT_PIN)) Serial.print("[GROW_LIGHT] ");
if (digitalRead(SHADE_PIN)) Serial.print("[SHADE] ");
if (digitalRead(PUMP_PIN)) Serial.print("[PUMP] ");
Serial.println(); // 结束当前行输出
delay(1000); // 等待1秒后再次读取数据和更新显示
}