1.简介
阳台上,美丽的鲜花,让人赏心悦目,翠绿的多肉植物周围似乎充满了新鲜空气。
但是有时却不太想打理,或者没时间打理这些盆栽。最终漂亮的花朵和多肉植物在你这般照料下,变成了金黄色的枯草。
为了拯救你的盆栽,我们推出了一款简单实用的自动浇花装置,装置配有4个土壤湿度传感器和水泵,意味着它能同时帮你照料4个盆栽,还配备了个显示屏,能让你清楚的知道盆栽土壤的湿度值。
2.总接线图
水管接到水泵上:
母对母的杜邦线接到水泵的正极也就是红色线,再与主板的5V排针连接。
代码编写教程
实验一:控制继电器和水泵
(1)实验说明:
继电器就是个电动开关,水泵是动力装置。通过继电器开关来控制水泵是否抽水。
(2 规格参数:
水泵 |
继电器 |
||
工作电压: |
2.5V~6V |
工作电压 |
DC5V |
配对的水管内径 |
6mm |
通过最大电流 |
10A(AC) 5A(DC) |
当电压为5V时 |
水管离水泵的高度不能高于105cm |
通过最大开关电压 |
250VAC 30VDC |
触发信号 |
高电平触发 |
(3)实验代码:
#define IN2 5 #define IN3 6 #define IN4 9 void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { digitalWrite(IN1, HIGH);//打开水泵1 digitalWrite(IN2, HIGH);//打开水泵2 digitalWrite(IN3, HIGH);//打开水泵3 digitalWrite(IN4, HIGH);//打开水泵4 delay(3000); //延时3S digitalWrite(IN4, LOW);//关闭水泵1 digitalWrite(IN3, LOW);//关闭水泵2 digitalWrite(IN2, LOW);//关闭水泵3 digitalWrite(IN1, LOW);//关闭水泵4 delay(1000); //延时1S } |
(4)实验现象:
烧录代码之后,可以看到4个继电器同时打开,水泵开始抽水,3秒后停止。
实验二 读取土壤传感器检测数值
(1)实验说明:
土壤湿度传感器就是用来检测土壤湿度值的,也就是通过检测到的值可以判断盆栽是否缺水;读取4个土壤湿度传感器,并且在arduino IDE的串口监视器中打印出来。
- 规格参数
控制芯片:TLC555
通信接口:输出模拟值
额定电压:3.3 ~ 5.5 VDC
输出电压:0 ~ 3.0 VDC
工作电流:<5mA
工作温度范围:1°C ~ 50°C
(3)实验代码:
#define soilPin1 A0 //定义土壤传感器引脚 #define soilPin2 A1 #define soilPin3 A2 #define soilPin4 A3 void setup() { Serial.begin(9600); pinMode(soilPin1, INPUT); //设置引脚输出 pinMode(soilPin2, INPUT); pinMode(soilPin3, INPUT); pinMode(soilPin4, INPUT); } void loop() { int val1 = analogRead(soilPin1); int val2 = analogRead(soilPin2); int val3 = analogRead(soilPin3); int val4 = analogRead(soilPin4); Serial.print(“SoilSensor 1 = “); //串口打印土壤湿度值 Serial.print(val1); Serial.print(” “); Serial.print(“SoilSensor 2 = “); Serial.print(val2); Serial.print(” “); Serial.print(“SoilSensor 3 = “); Serial.print(val3); Serial.print(” “); Serial.print(“SoilSensor 4 = “); Serial.println(val4); } |
(4)实验现象:
烧录好代码,打开arduino IDE的串口监视器,可以看到打印出4个土壤湿度传感器检测到的值,用手触摸土壤湿度传感器的探测部分,可以看到对应的值变小,这是因为人的手皮肤上有水分,也就意味着土壤越湿测到的值越小。
实验三 简单自动浇花装置
(1)实验介绍:
既然学会了控制水泵和读取土壤湿度传感器的值,那就可以通过判断土壤湿度传感器检测到的值来开关继电器,实现简单的自动浇花装置。
(2)实验代码:
#define soilPin1 A0 //定义土壤传感器引脚 #define soilPin2 A1 #define soilPin3 A2 #define soilPin4 A3 #define IN1 3 //定义继电器引脚 #define IN2 5 #define IN3 6 #define IN4 9 void setup() { Serial.begin(9600); pinMode(soilPin1, INPUT); //设置引脚为输入 pinMode(soilPin2, INPUT); pinMode(soilPin3, INPUT); pinMode(soilPin4, INPUT); pinMode(IN1, OUTPUT); //设置引脚为输出 pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { int val1 = analogRead(soilPin1); int val2 = analogRead(soilPin2); int val3 = analogRead(soilPin3); int val4 = analogRead(soilPin4); Serial.print(“SoilSensor 1 = “); //串口打印湿度数值 Serial.print(val1); Serial.print(” “); Serial.print(“SoilSensor 2 = “); Serial.print(val2); Serial.print(” “); Serial.print(“SoilSensor 3 = “); Serial.print(val3); Serial.print(” “); Serial.print(“SoilSensor 4 = “); Serial.println(val4); if(val1 < 420){ //当土壤传感器检测到湿度值大于420时打开水泵 digitalWrite(IN1, HIGH); }else{ digitalWrite(IN1, LOW); } if(val2 < 420){ digitalWrite(IN2, HIGH); }else{ digitalWrite(IN2, LOW); } if(val3 < 420){ digitalWrite(IN3, HIGH); }else{ digitalWrite(IN3, LOW); } if(val4 < 420){ digitalWrite(IN4, HIGH); }else{ digitalWrite(IN4, LOW); } } |
(3)实验现象:
为了方便做实验,我们还是先用手触摸土壤湿度传感器来替代盆栽缺水的情况。烧录代码后,用手触摸土壤湿度传感器,对应的继电器打开,水泵抽水,放开手后,继电器关闭,水泵停止抽水。
实验四 控制LCD1602显示屏
(1)简介
这是一个可以显示2行,每行16个字符的液晶屏模块。液晶屏显示蓝底白字,自带I2C通信模块,使用时只需连接单片机I2C通信接口,大大节约了单片机资源。I2C通信模块上带有1个电位器,可用于调节显示屏背光,通信地址默认为0x27。
(2)实验代码:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); //LCD的IIC通信地址是0x27,2行显示16个字符 void setup() { lcd.init(); // 初始化LCD lcd.init(); // 将信息打印到LCD上 lcd.backlight(); lcd.setCursor(5,0); lcd.print(“keyes”); lcd.setCursor(2,1); lcd.print(“Hello, world!”); } void loop() { } |
(3)实验现象:
可以看到LCD1602显示屏第一行显示:keyes ;第二行显示: Hello World! 。
实验五 LCD1602显示土壤传感器检测到的值
(1)实验说明
土壤湿度传感器检测到的值,可以通过打开arduino IDE串口监视器查看,但是需要使用数据线连接电脑,很不方便。所以我们添加了个LCD1602显示屏,可以在显示屏上看土壤湿度传感器检测到的值。
(2)规格参数
工作电压:DC 5V
接口:间距为2.54mm排针接口
通讯方式:I2C通讯
I2C通信地址: 0x27
(3)实验代码:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); //LCD的IIC通信地址是0x27,2行显示16个字符 #define soilPin1 A0 #define soilPin2 A1 #define soilPin3 A2 #define soilPin4 A3 void setup() { lcd.init(); // 初始化LCD lcd.init(); // Print a message to the LCD. lcd.backlight(); } void loop() { int val1 = analogRead(soilPin1); int val2 = analogRead(soilPin2); int val3 = analogRead(soilPin3); int val4 = analogRead(soilPin4); // 将信息打印到LCD上 lcd.setCursor(0,0); lcd.print(“S1:”); lcd.setCursor(3,0); lcd.print(val1); lcd.setCursor(7,0); lcd.print(” “); lcd.setCursor(9,0); lcd.print(“S2:”); lcd.setCursor(12,0); lcd.print(val2); lcd.setCursor(0,1); lcd.print(“S3:”); lcd.setCursor(3,1); lcd.print(val3); lcd.setCursor(7,1); lcd.print(” “); lcd.setCursor(9,1); lcd.print(“S4:”); lcd.setCursor(12,1); lcd.print(val4); delay(100); } |
(4)实验现象:
S1代表土壤湿度传感器1,以此类推,可以看到LCD1602显示屏显示出4个传感器检测到的值,用手触摸传感器,可以看到显示屏上显示的值在改变。
实验六 自动浇花装置
(1)实验代码:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // LCD的通信地址的0x27,2行显示16个字符 #define soilPin1 A0 //定义土壤传感器引脚 #define soilPin2 A1 #define soilPin3 A2 #define soilPin4 A3 #define IN1 3 //定义水泵引脚 #define IN2 5 #define IN3 6 #define IN4 9 int count, count_flag; void setup() { lcd.init(); // 初始化lcd lcd.init(); //LCD清屏 lcd.backlight(); } void loop() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); //设置引脚为输出 pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); int val1 = analogRead(soilPin1); int val2 = analogRead(soilPin2); int val3 = analogRead(soilPin3); int val4 = analogRead(soilPin4);
//LCD上打印数值 lcd.setCursor(0,0); lcd.print(“S1:”); lcd.setCursor(3,0); lcd.print(val1); lcd.setCursor(7,0); lcd.print(” “); lcd.setCursor(9,0); lcd.print(“S2:”); lcd.setCursor(12,0); lcd.print(val2); lcd.setCursor(0,1); lcd.print(“S3:”); lcd.setCursor(3,1); lcd.print(val3); lcd.setCursor(7,1); lcd.print(” “); lcd.setCursor(9,1); lcd.print(“S4:”); lcd.setCursor(12,1); lcd.print(val4); delay(200); count = count + 1; if(count >= 50) //10秒钟后,关闭lCD1602背光 { count = 50; lcd.noBacklight(); } if(val1 > 550){ //当土壤的湿度大于550时水泵开始抽水(实际的土壤湿度越大数值越小,数值小于550就停止抽水) lcd.backlight(); count = 0; digitalWrite(IN1, HIGH); //打开水泵 1 delay(3000); //延时3S digitalWrite(IN1, LOW); //关闭水泵1 delay(5000); //延时5S }else{ digitalWrite(IN1, LOW); } if(val2 > 550){ lcd.backlight(); count = 0; digitalWrite(IN2, HIGH); delay(3000); digitalWrite(IN2, LOW); delay(5000); }else{ digitalWrite(IN2, LOW); } if(val3 > 550){ lcd.backlight(); count = 0; digitalWrite(IN3, HIGH); delay(3000); digitalWrite(IN3, LOW); delay(5000); }else{ digitalWrite(IN3, LOW); } if(val4 > 550){ lcd.backlight(); count = 0; digitalWrite(IN4, HIGH); delay(3000); digitalWrite(IN4, LOW); delay(5000); }else{ digitalWrite(IN4, LOW); } } |
(2)实验现象:
上传好程序,接上DC端供电,四个土壤湿度传感器分别插到4个盆栽土壤里,对应的控制的水泵水管也放到盆栽里,可以看到LCD1602显示屏显示出盆栽的土壤湿度值。如果盆栽不缺水,10秒后LCD1602显示屏的背景灯会关闭,达到省电作用。如果有盆栽缺水了,LCD1602显示屏背景灯会亮起,对应盆栽的继电器打开水泵抽水到盆栽,3秒后继电器关闭,水泵停止抽水,等待5秒给水渗透时间,然后土壤湿度传感器再继续检测。(因土壤传感器的检测原理是:湿度越大数值越小,所以当土壤的湿度大于550时水泵开始抽水,数值小于550就停止抽水)
相关资料下载链接
Arduino C教程链接:https://pan.baidu.com/s/1AwhJonZ-wSfFrJSXyPpalQ
提取码:keye
Mixly图形化编程链接:https://pan.baidu.com/s/1opzlvPQ3u2X5HwDyF7IpbA
提取码:keye