赞
踩
目录
阳台上,美丽的鲜花,让人赏心悦目,翠绿的多肉植物周围似乎充满了新鲜空气。
但是有时却不太想打理,或者没时间打理这些盆栽。最终漂亮的花朵和多肉植物在你这般照料下,变成了金黄色的枯草。
为了拯救你的盆栽,我们推出了一款简单实用的自动浇花装置,装置配有4个土壤湿度传感器和水泵,意味着它能同时帮你照料4个盆栽,还配备了个显示屏,能让你清楚的知道盆栽土壤的湿度值。
物料清单
我们先了解浇花系统的核心:控制板
控制板的主控芯片是ATmega328PU。和官网的Arduino uno对比,控制板使用的USB转串口芯片为CH340,其他的使用方法完全一样。它具有14路数字输入/输出口(其中6路可作为PWM输出),8路模拟输入,通信IO有IIC、SPI、UART;为了方便接线扩展了传感器排针接口。其中ICSP接口用来给控制板烧录固件。供电方式有USB线供电或DC端供电。
主控芯片:ATmega328PU
USB转串口芯片:CH340
工作电压:5V
外接电源: DC 6-12V(建议9V)
数字I/O引脚: 14 (D0-D13)
PWM通道: 6 (D3 D5 D6 D9 D10 D11)
模拟输入通道(ADC): 86A0-A5)
每个I/O直流输出能力: 20 mA
3.3V端口输出能力: 最大150 mA
Flash Memory: 32 KB
SRAM:2 KB (ATmega328PU)
EEPROM:1 KB (ATmega328PU)
时钟速度: 16MHz
板载LED引脚: D13
串口通信接口:D0为RX、D1为TX
PWM接口(脉宽调制):D3 D5 D6 D9 D10 D11
外部中断接口:D2(中断0)和D3 (中断1)
SPI通信接口:D10为SS、D11为MOSI、D12为MISO、D13为SCK
IIC通信端口:A4为SDA、A5为SCL
(1)首先,进入arduino官方网站:Arduino - Home ,点击“SOFTWARE”进入下载页面,如下图所示:
(2)然后,根据你的操作系统选择并下载相应的安装程序。如果你是Windows用户,请选择“Windows安装程序”下载正确的安装驱动程序。
选择点击Windows Win7 and newer下载Arduino 1.8.16版本的安装程序,需要手动安装。当我们点击,代表直接下载1.8.16版本Arduino IDE,是一个压缩文件,解压就可以使用,无需安装。
一般情况下,点击JUST DOWNLOAD就可以下载了,当然如果你愿意,你可以选择小小的赞助,以帮助伟大的Arduino开源事业。
(3)Arduino软件下载完成后,继续安装,当你收到操作系统的警告时,请允许驱动程序安装。首先点击I Agree, 然后选择好要安装的组件后再点击Next。
(4)选择安装目录(我们建议保持默认目录),然后点击Install。
(5)如果出现以下界面,则应选择Install。
该过程将提取并安装所有必需的文件,以正确执行Arduino软件(IDE)。
安装完成后,会在桌面上生成一个Arduino 软件快捷方式。
(注意:如果电脑已经安装了CH340驱动程序,则不需要再安装驱动;如果没有,则需要进行以下操作)
安装Arduino IDE后,我们就开始安装驱动。将控制板用USB线连接在电脑上后,如果是Windows10系统电脑,电脑会自动安装驱动。如果是其他系统电脑,如Windows7系统电脑,需要手动安装驱动。
控制板的USB转串口芯片为CH340我们需要安装这芯片的驱动,驱动为usb_ch341_3.1.2009.06。第一次将控制板连接电脑时,点击计算机--属性--设备管理器,显示如下图。
点击 后,点击“更新驱动程序” ,开始安装驱动,如下图。
进入下图,选择
在电脑中找到usb_ch341_3.1.2009.06文件夹。
安装驱动完成,出现下图点击关闭。
这样驱动就装好了。点击计算机--属性--设备管理器,我们可看见如下图。
驱动程序安装成功后,接下来配置Arduino IDE 设备和端口。对于328 PLUS主板,单击Tools→Board;选择Arduino Uno (如下图所示)。
然后选择正确的COM端口。驱动安装成功后,可以看到对应的COM口。
单击Tools→Port→COM6
将代码程序上传到控制板之前,必须演示Arduino IDE工具栏中出现的每个符号的功能。
A - 用于检查是否存在任何编译错误。
B - 用于将程序上传到Arduino控制板。
C - 用于创建新草图的快捷方式。
D - 用于直接打开示例草图之一。
E - 用于保存草图。
F - 用于从板接收串行数据并将串行数据发送到板的串行监视器。
打开“File”选择“Examples”,从“Basics”中选择“Blink”,如下图所示:
当草图(Blink)窗口打开时,你可以在窗口中看到整个程序。
设置板型和COM口,对应的板型和COM口会显示在IDE的右下角。
点击开始编译程序,检查错误。
点击上传程序,几秒种后,上传成功。
上传程序成功,利用USB线上电,328 PLUS主板上的板载LED灯点亮1秒,熄灭1秒,循环进行。恭喜你,完成了第一个项目。
下载安装说明与1.1章相同,如下图所示:
(1)点击V1.5 CH340 MaxOS驱动程序包
(2)单击安装包并点击继续
(3)点击安装
(4)输入用户密码,然后单击“安装软件
(5)点击继续安装
(6)等待安装
(7)安装完成后,单击“重新启动”
除了COM端口之外,设置方法与第1.4章相同,如下图所示:
在开始课程之前我们还需要安装课程里面代码需要的Arduino库文件。
库是一组代码,可以方便地连接到传感器、显示器、模块等。例如,内置的LiquidCrystal库可以帮助与LCD显示器对话。Internet上还有数百个额外的库可供下载。参考资料(https://www.arduino.cc/en/Reference/Libraries)中列出了内置库和其中一些附加库。
这里我们将介绍一种最简单的添加库的方法 .
第一步:打开文件的安装目录,如下所示:
第二步: 单击打开安装目录下的libraries文件夹,你可以看到library这个文件夹里面含有一些Arduino的库文件。
第三步:打开我们提供的资料里面的Arduino Libraries文件夹,将文件夹中的库文件都复制粘贴到第二步我们打开的libraries文件夹内。
复制好了之后我们的库文件就添加成功了。
这样,库文件就手动添加完成了。
接线时注意看引脚标识:控制板的红色排针是VCC,黑色排针是GND,黄色排针接信号线
水管接到水泵上:
(1)实验说明:
控制板的主要是控制作用驱动能力较弱,水泵是动力装置,需要用驱动模块驱动水泵抽水。
(2 规格参数:
水泵 | 驱动模块 | ||
工作电压: | 2.5V~6V | 工作电压 | DC 1.8V-6.8V |
配对的水管内径 | 6mm | 通过最大电流 | 低待机电流 0.01uA 、低静态工作电流0.2mA、连续输出电流1.2A |
当电压为5V时 | 水管离水泵的高度不能高于105cm | 控制信号 | 数字信号或PWM信号 |
(3)实验代码:
/* 良芯小店 链接:https://item.taobao.com/item.htm?ft=t&id=679403226914 */ int INA = 4; //接电机1的IN- int INB = 5; //接电机1的IN+ int INC = 6; //接电机2的IN+ int IND = 7; //接电机2的IN- int INE = 8; //接电机3的IN- int INF = 9; //接电机3的IN+ int ING = 10; //接电机4的IN+ int INH = 11; //接电机4的IN- void setup() { pinMode(INA, OUTPUT);//设置引脚为输出模式 pinMode(INB, OUTPUT); pinMode(INC, OUTPUT); pinMode(IND, OUTPUT); pinMode(INE, OUTPUT); pinMode(INF, OUTPUT); pinMode(ING, OUTPUT); pinMode(INH, OUTPUT); } void loop() { digitalWrite(INA, LOW); //打开水泵1 analogWrite(INB, 255); analogWrite(INC, 255); //打开水泵2 digitalWrite(IND, LOW); digitalWrite(INE, LOW); //打开水泵3 analogWrite(INF, 255); analogWrite(ING, 255); //打开水泵4 digitalWrite(INH, LOW); delay(3000); //延时3S digitalWrite(INA, LOW); //关闭水泵1 analogWrite(INB, 0); analogWrite(INC, 0); //关闭水泵2 digitalWrite(IND, LOW); digitalWrite(INE, LOW); //关闭水泵3 analogWrite(INF, 0); analogWrite(ING, 0); //关闭水泵4 digitalWrite(INH, LOW); 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)实验代码:
/* 良芯小店 链接:https://item.taobao.com/item.htm?ft=t&id=679403226914 */ #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)实验代码:
/* 良芯小店 链接:https://item.taobao.com/item.htm?ft=t&id=679403226914 */ #define soilPin1 A0 //宏定义土壤传感器引脚 #define soilPin2 A1 #define soilPin3 A2 #define soilPin4 A3 int INA = 4; //接电机1的IN- int INB = 5; //接电机1的IN+ int INC = 6; //接电机2的IN+ int IND = 7; //接电机2的IN- int INE = 8; //接电机3的IN- int INF = 9; //接电机3的IN+ int ING = 10; //接电机4的IN+ int INH = 11; //接电机4的IN- void setup() { Serial.begin(9600); pinMode(soilPin1, INPUT); //设置引脚为输入模式 pinMode(soilPin2, INPUT); pinMode(soilPin3, INPUT); pinMode(soilPin4, INPUT); pinMode(INA, OUTPUT);//设置引脚为输出模式 pinMode(INB, OUTPUT); pinMode(INC, OUTPUT); pinMode(IND, OUTPUT); pinMode(INE, OUTPUT); pinMode(INF, OUTPUT); pinMode(ING, OUTPUT); pinMode(INH, 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 > 550) { //当土壤传感器检测到湿度值大于550时打开水泵 digitalWrite(INA, LOW); //打开水泵1 analogWrite(INB, 255); } else { digitalWrite(INA, LOW); //关闭水泵1 analogWrite(INB, 0); } if (val2 > 550) { analogWrite(INC, 255); //打开水泵2 digitalWrite(IND, LOW); } else { analogWrite(INC, 0); //关闭水泵2 digitalWrite(IND, LOW); } if (val3 > 550) { digitalWrite(INE, LOW); //打开水泵3 analogWrite(INF, 255); } else { digitalWrite(INE, LOW); //关闭水泵3 analogWrite(INF, 0); } if (val4 > 550) { analogWrite(ING, 255); //打开水泵4 digitalWrite(INH, LOW); } else { analogWrite(ING, 0); //关闭水泵4 digitalWrite(INH, LOW); } } |
(3)实验现象:
为了方便做实验,我们还是先用手触摸土壤湿度传感器来替代盆栽缺水的情况。烧录代码后,水泵开始抽水,用手触摸土壤湿度传感器,对应的水泵关闭,水泵停止抽水,放开手后,水泵抽水。
(由前面的实验可知,土壤传感器检测到的湿度越大输出的数值就越小,所以我们用手触摸相当于湿度大,水泵停止抽水)
(1)简介
这是一个可以显示2行,每行16个字符的液晶屏模块。液晶屏显示蓝底白字,自带I2C通信模块,使用时只需连接单片机I2C通信接口,大大节约了单片机资源。I2C通信模块上带有1个电位器,可用于调节显示屏背光,通信地址默认为0x27。
(2)实验代码:
/* 良芯小店 链接:https://item.taobao.com/item.htm?ft=t&id=679403226914 */ #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("haha"); lcd.setCursor(2,1); lcd.print("Hello, world!"); } void loop() { } |
(3)实验现象:
可以看到LCD1602显示屏第一行显示:haha ;第二行显示: Hello World! 。
(1)实验说明
土壤湿度传感器检测到的值,可以通过打开arduino IDE串口监视器查看,但是需要使用数据线连接电脑,很不方便。所以我们添加了个LCD1602显示屏,可以在显示屏上看土壤湿度传感器检测到的值。
(2)规格参数
工作电压:DC 5V
接口:间距为2.54mm排针接口
通讯方式:I2C通讯
I2C通信地址: 0x27
(3)实验代码:
/* 良芯小店 链接:https://item.taobao.com/item.htm?ft=t&id=679403226914 */ #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)实验代码:
/* 良芯小店 链接:https://item.taobao.com/item.htm?ft=t&id=679403226914 */ #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 int INA = 4; //接电机1的IN- int INB = 5; //接电机1的IN+ int INC = 6; //接电机2的IN+ int IND = 7; //接电机2的IN- int INE = 8; //接电机3的IN- int INF = 9; //接电机3的IN+ int ING = 10; //接电机4的IN+ int INH = 11; //接电机4的IN- int count, count_flag; void setup() { pinMode(INA, OUTPUT);//设置引脚为输出模式 pinMode(INB, OUTPUT); pinMode(INC, OUTPUT); pinMode(IND, OUTPUT); pinMode(INE, OUTPUT); pinMode(INF, OUTPUT); pinMode(ING, OUTPUT); pinMode(INH, OUTPUT); lcd.init(); // 初始化lcd lcd.init(); //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(200); count = count + 1; if (count >= 50) //10秒钟后,关闭lCD1602背光 { count = 50; lcd.noBacklight(); } if (val1 > 600) //当土壤传感器1检测的湿度大于600时水泵1以最大速度开始抽水 { count = 0; digitalWrite(INA, LOW); analogWrite(INB, 255); } else if (val1 >= 450 && val1 <= 600) { //当土壤的湿度大于等于450且小于等于600时水泵1抽水速度减慢 count = 0; digitalWrite(INA, LOW); analogWrite(INB, 100); } else { //否则水泵1停止抽水 count = 0; digitalWrite(INA, LOW); analogWrite(INB, 0); } if (val2 > 600) //当土壤传感器2检测的湿度大于600时水泵2以最大速度开始抽水 { count = 0; analogWrite(INC, 255); digitalWrite(IND, LOW); } else if (val2 >= 450 && val2 <= 600) { //当土壤传感器2检测的湿度大于等于450且小于等于600时水泵2抽水速度减慢 count = 0; analogWrite(INC, 100); digitalWrite(IND, LOW); } else { //否则水泵2停止抽水 count = 0; analogWrite(INC, 0); digitalWrite(IND, LOW); } if (val3 > 600) //当土壤传感器3检测的湿度大于600时水泵3以最大速度开始抽水 { count = 0; digitalWrite(INE, LOW); analogWrite(INF, 255); } else if (val3 >= 450 && val3 <= 600) { //当土壤传感器3检测的湿度大于等于450且小于等于600时水泵3抽水速度减慢 count = 0; digitalWrite(INE, LOW); analogWrite(INF, 100); } else { //否则水泵3停止抽水 count = 0; digitalWrite(INE, LOW); analogWrite(INF, 0); } if (val4 > 600) //当土壤传感器4检测的湿度大于600时水泵4以最大速度开始抽水 { count = 0; analogWrite(ING, 255); digitalWrite(INH, LOW); } else if (val4 >= 450 && val4 <= 600) { //当土壤传感器4检测的湿度大于等于450且小于等于600时水泵4抽水速度减慢 count = 0; analogWrite(ING, 100); digitalWrite(INH, LOW); } else { //否则水泵4停止抽水 count = 0; analogWrite(ING, 0); digitalWrite(INH, LOW); } } |
(2)实验现象:
上传好程序,接上DC端供电,四个土壤湿度传感器分别插到4个盆栽土壤里,对应的控制的水泵水管也放到水里,可以看到LCD1602显示屏显示出盆栽的土壤湿度值。如果盆栽不缺水,10秒后LCD1602显示屏的背景灯会关闭,达到省电作用。如果有盆栽缺水了,LCD1602显示屏背景灯会亮起,土壤传感器检测的湿度大于600时水泵以最大速度开始抽水,当土壤传感器检测的湿度大于等于450且小于等于600时水泵,抽水速度减慢给水渗透时间,然后土壤湿度传感器再继续检测,数值小于450就停止抽水。(因土壤传感器的检测原理是:湿度越大数值越小,所以当土壤的湿度大于450时水泵开始抽水,数值小于450就停止抽水)
链接:https://pan.baidu.com/s/1CLXoZpQj9ApF9wGk_EEynw
提取码:h16w
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。