什么!你也喜欢种菜?我说的不是这些:
游戏里谁还没有几百亩地了?卷起衣袖就是干,干不完,根本干不完。
然而现实生活中, 当我们大多数人面对一株小小植物时:
养不活,根本养不活!
众所周知……
穷养不行就不养……
不是……
就富养!
那就给他们造个温室吧。
硬件&工具- Arduino Nano R3 x1
- Arduino 4路继电器扩展板 x1
- 超声波传感器 - HC-SR04(通用)x1
- PIR 运动传感器(通用)x1
- LED (通用)x1
- Adafruit 标准 LCD - 16x2 蓝底白字 (12C 接口焊接在上面) x1
- DFRobot Gravity : 模拟电容式土壤湿度传感器- 耐腐蚀 x2
- RobotGeek 直流液体泵 - 大型 x2
- 液体阀x1
- 水箱 x1
- DHT22 温度传感器 x1
- 烙铁(通用)
主要结构:箱柜(按需添加间隔层)
下图是一个宜家的便携式衣柜,内外包裹着泡沫塑料隔热层。共设三层,最低一层主要用于种子开始:有一个加热垫,另外两层是针对植物的。
空气循环、加热以及温湿度测量都是通过一个ABS管道”加热器”来完成的。其中,使用DHT22传感器来测量温度和湿度。
“加热器”和一个额外的加热元件
湿度控制由一个小型 12V “鼠笼式”风扇完成。
当被板触发时,它会将新鲜空气泵入温室内
一块Arduino Nano(兼容板)作为控制单元的核心。系统配备了一个I2C接口的LCD屏,用于显示所有必要的参数和状态。当有人进入区域时,红外运动传感器会触发LCD屏的背光。
LCD 显示:区域 1(Z1)和区域 2(Z2)的温度(Temperature)、湿度(Humidity)、水(Water level)和土壤湿度(Soil moisture)
系统中有一个RTC继电器时钟,它通过一个数字引脚为整个系统提供”昼夜”参考信号。内部温度设有”夜间”和”白天”两个设定点,以模拟真实环境条件。在”白天”时段,灯光会持续保持开启状态约15小时。
灌溉系统
一个雨水(雪水)桶通过电磁阀和过滤器连接到双泵组。水位由超声波传感器测量。两个电容式土壤湿度传感器分别监测各自区域的湿度,并独立触发水泵工作。当桶中水位降至临界点时,灌溉会自动停止,同时一个LED灯会显示”水位低”警告。
一个双泵浇水块
土壤湿度传感器和灌溉喷头
水位超声波传感器
代码
- //===GreenHouse sketch created by Victor Onofrei. 2019===
- #include <DHT.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include <HCSR04.h>
- #include <SandTimer.h>
- #define DHTPIN 2
- #define DHTTYPE DHT22
- DHT dht(DHTPIN, DHTTYPE);
- LiquidCrystal_I2C lcd(0x27,20,4);
- HCSR04 watersens(5,6);
- SandTimer timersensor;
- SandTimer backlightimer;
- SandTimer pump1timer;
- SandTimer pump2timer;
- const int lowaterled=4;
- const int venthum=7;
- const int irsensor=8;
- const int pump2=9;
- const int heaterpin=10;
- const int lightpin=11;
- const int pump1=12;
- const int timerpin=13;
- int h=0;
- int t=0;
- int Soil1=0; //lower soil moisture sensor
- int Soil2=0;
- int settemp;
- int daytemp=26;
- int nightemp=23;
- int timervalue;
- int motiondetect;
- int waterlevel;
-
-
- void setup() {
- dht.begin();
- lcd.init();
- timersensor.start(2000);
- backlightimer.start(30000);
- pump1timer.start(10000);
- pump2timer.start(10000);
- pinMode(heaterpin, OUTPUT);
- pinMode(timerpin, INPUT);
- pinMode(lightpin, OUTPUT);
- pinMode(lowaterled, OUTPUT);
- pinMode(venthum, OUTPUT);
- pinMode(irsensor, INPUT);
- pinMode(pump1, OUTPUT);
- pinMode(pump2, OUTPUT);
- digitalWrite(pump1, HIGH);
- digitalWrite(pump2, HIGH);
- }
-
- void loop() {
- sensorcheck();
- lowater();
- settempset();
- humidcontrol();
- runheat();
- runlights();
- lcdprint();
- lcdbacklight();
- watering();
- }
-
- //===========Functions=============
-
- void sensorcheck(){
- if (timersensor.finished()){
- h=dht.readHumidity();
- t=dht.readTemperature();
- timervalue=digitalRead(timerpin);
- Soil1=analogRead(6);
- Soil2=analogRead(7);
- Soil1=map(Soil1,560,270,01,99);
- Soil2=map(Soil2,545,270,01,99);
- motiondetect=digitalRead(irsensor);
- waterlevel=watersens.dist();
- waterlevel=map(waterlevel,3,57,99,01);
- timersensor.startOver();
- }
- }
-
- void lowater(){
- if (waterlevel<=3){
- digitalWrite(lowaterled, HIGH);
- }
- else{
- digitalWrite(lowaterled, LOW);
- }
- }
-
- void watering(){
- if ((waterlevel>=3)&&(Soil1<=24)){
- digitalWrite(pump1, LOW);
- // if (pump1timer.finished()){
- // digitalWrite(pump1, HIGH);
- // pump1timer.startOver();
- // }
- }
- else{
- digitalWrite(pump1, HIGH);
- }
-
- if ((waterlevel>=3)&&(Soil2<=24)){
- digitalWrite(pump2, LOW);
- // if (pump2timer.finished()){
- // digitalWrite(pump2, HIGH);
- // pump2timer.startOver();
- // }
- }
- else {
- digitalWrite(pump2, HIGH);
- }
- }
-
- void settempset(){
- if (timervalue==HIGH){
- settemp=daytemp;
- }
- else{
- settemp=nightemp;
- }
- }
-
- void lcdbacklight(){
- if (motiondetect==1){
- lcd.backlight();
- }
- else if ((motiondetect==0)&&(backlightimer.finished())){
- lcd.noBacklight();
- backlightimer.startOver();
- }
- }
-
- void humidcontrol(){
- if(h>=72){
- digitalWrite(venthum, HIGH);
- }
- else if (h<=65){
- digitalWrite(venthum, LOW);
- }
- }
-
- void runheat(){
- if(t>=settemp){
- digitalWrite(heaterpin, HIGH);
- }
- else{
- digitalWrite(heaterpin, LOW);
- }
- }
-
- void runlights(){
- if (timervalue==LOW){
- digitalWrite(lightpin, HIGH);
- }
- else{
- digitalWrite(lightpin, LOW);
- }
- }
-
- void lcdprint(){
- lcd.setCursor(0,0);
- lcd.print("T/H:");
- lcd.print(t);
- lcd.print("/");
- lcd.print(h);
- lcd.setCursor(10,0);
- lcd.print("WL:");
- lcd.print(waterlevel);
- lcd.print("%");
- lcd.setCursor(0,1);
- lcd.print("Z1:");
- lcd.print(Soil1);
- lcd.print("%");
- lcd.print(" ");
- lcd.print("Z2:");
- lcd.print(Soil2);
- lcd.print("%");
- }
复制代码
快去救救你的植物吧。
原文地址:https://www.hackster.io/vinikon/ ... king-project-946f6e
项目作者:Victor Onofrei
译文首发于:DF创客社区
转载请注明来源信息
|