#Deedu Automated Gardening Plant (arduino Uno)
by lex1505 in Circuits > Arduino
825 Views, 2 Favorites, 0 Comments
#Deedu Automated Gardening Plant (arduino Uno)
INTRODUCTION
The automated gardening kit is a system that allows controlling and automatic watering of a small plant. This system is developed for an educational purpose, the plant shall stay at different pupil's house to be controlled.
The user will take notes every weeks from the control panel to create a database to folllow the growth of the connected plant.
What does it control ?
-The moisture of the soil, this value will be directly used to decide whether to water or not
-The CO2 concentration
-The intensity of the light
-The temperature and the humidity of ambient air
What action can be performed ?
-A water pump will get water from a small reservoir to put it on the plant
-A screen will display the information needed and 2 buttons to control what info to be displayed
List of Parts
You will need
electronic control and command part (listed below)
water tank
a plant in a pot
box for electronic (https://www.thingiverse.com/thing:4106140)
3d printed light sensor support (https://www.thingiverse.com/thing:3986667)
3d printed sprinkler (https://www.thingiverse.com/thing:3986672)
The Command & Control part The material used for the Command and Control are the following:
- 1 Arduino UNO link
- 1 moisture sensor link
- 1 CO2 Gas sensor Mq7 link
- 1 Lcd screen 2x16 (+i2c)) link
- 1 LDR light sensor (photoresistor) link
- 2 push buttons link
- 1 Temp + humidity sensor DHT11 link
- 1 5V water pump link
- 1 5v volt relay link
- 3 1k resistor link
- 1 Breadbord or prototyping PCB link
-2 5vpower supply link
Connecting Electronic
Digital pin
Pin: 7, relay
Pin: 9, button 1
Pin: 10, button 2
Pin: 13, LED
Analog pin
Pin: A0, Moisture sensor
Pin: A1, Co2 sensor
Pin: A2, Photoresistor
Pin: A3, Temperature sensor
Pin: A4, Screen Rx
Pin: A5, Screen Tx
The connection of Arduino on Water pump alimentation
The Arduino is to be connected directly on the water pump alimentation so the whole system need only one electric plug to works.
The Water pump is a 5V alimentation, the arduino can support that voltage but this lead to a warming of internal component of the arduino and possibly damage on the arduino with time. The easiest and fastest choice for now is two 5v power supply (one for arduino and one for the pump)
For using only one power supply like a 12v one, some solution are linked below
Code
In this sections is presented how shall be used Deedu system and what shall be the response for it at each cases
UC01 : Control data from sensors & Number of spraying By using one button and looking on the screen, the user shall be able to check on instant value measured by all sensors.
UC02 : Spray the plant when needed & Water tank level control
The system shall be able to water plant when it is needed (The moisture sensor value indicated watering is needed). The water pump is tricky to start (if no water is present in tube, it isn’t powerful enough to start), so the best is to prevent complete emptiness of the water tank. Therefore a solution shall be present to control water tank level and prevent water pumping if water level is too low. A warning shall indicate the user to fill the water tank.
The Arduino code
You can download in the following the arduino code used, every function is commented.
Download the code below on your arduino board
<p>//import the library to control LCD display, this library has been added manually through ZIP file<br>#include </p><p>//import library for DHT sensor #include "dht.h" #define dht_apin A3 // Analog Pin sensor is connected to</p><p>//create DHT object dht DHT;</p><p>// create LCD object LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display</p><p>//declaration of variable for buttond int ButtonOnePin = 10; //pin for button 1 int ButtonOneState =0 ; //one variable to store current button state int ButtonOnePreviousState = 0; //one variable to store previous button state int ButtonTwoPin = 9; // same for button 2 int ButtonTwoState =0 ; int ButtonTwoPreviousState = 0;</p><p>unsigned long timeBeginDisplay=0; int timeDisplayPeriod = 6000; //period the 2nd and 3rd screen are displayed int valToDisplay = 0; //variable to decide what information is to be displayed</p><p>int airTemp; //variable to store air temperature measured by DHT11 sensor int airHumidity; //variable to store air humidity measured by DHT11 sensor</p><p>int LedPin = 13; </p><p>int waterPumpPin=7; // pin on which is connected the relay that command water pump int sprayNum=0; //variable to store number of spraying int pumpOn =false; //variable used for spraying, it stays ON during the spray timing</p><p>int MoistureHigh = 800; int MoistureGood = 710; int MoistureLow = 630; //threshold that should launch water spray of the plant int valSoil ; //variable to store value measured by moisture sensor int soilPin = A0; // pin on wich is connected moisture sensor int soilPower = 12;</p><p>int timePeriod = 1000; //variable to store timing in ms, period between each display refresh, a clear is called each time display is called int humMeasurePeriod=0; unsigned long currentMillis; //variable to store current timing unsigned long debutMillis=0; //variable used to store timing at the debut of a period int timePumpPeriod = 3000; //timing for water spraying unsigned long timePumpDebut = 0; //variable used to store timing value for the debut of a spraying period</p><p>int gazPin = 1; //pin on which is connected gaz sensor int valGaz ; //variable on which is stored gaz sensor value</p><p>int lightPin = 2; //pin on which is connected the photoresistor int valLight ; //variable on which light value is stored</p><p>//function to read moisture sensor value int readSoil() {</p><p> digitalWrite(soilPower, HIGH);//turn D7 "On" delay(10);//wait 10 milliseconds valSoil = analogRead(soilPin);//Read the SIG value form sensor digitalWrite(soilPower, LOW);//turn D7 "Off" return valSoil;//send current moisture value }</p><p>//function called to refresh LCD screen, displaying wanted screen regarding value of variable "valToDisplay" int toDisplay(){</p><p> lcd.clear(); //clear the screen to remove character that might not be overwritten by new message if (valToDisplay==0){ lcd.setCursor(0,0); //to put cursor on 1rst character of 1rst line lcd.print("Temp:"); lcd.setCursor(6,0); lcd.print("Hum:"); lcd.setCursor(11,0); lcd.print("Mois:"); lcd.setCursor(0,1); //to put cursor on 1rst character of 2nd line lcd.print(airTemp); lcd.setCursor(2,1); lcd.print((char)223); //special character for temperature lcd.print("C"); lcd.setCursor(6,1); lcd.print(airHumidity); lcd.setCursor(8,1); lcd.print("%"); lcd.setCursor(11,1); lcd.print(valSoil); } else if (valToDisplay==1 && (currentMillis-timeBeginDisplay)</p><p> if((currentMillis-timeBeginDisplay)>timeDisplayPeriod){ //display original screen when display period is over valToDisplay=0; //we display in this IF condition the 1rst screen because before there was a blank screen after the timing lcd.setCursor(0,0); //to put cursor on 1rst character of 1rst line lcd.print("Temp:"); lcd.setCursor(6,0); lcd.print("Hum:"); lcd.setCursor(11,0); lcd.print("Mois:"); lcd.setCursor(0,1); //to put cursor on 1rst character of 2nd line lcd.print(airTemp); lcd.setCursor(2,1); lcd.print((char)223); //special character for temperature lcd.print("C"); lcd.setCursor(6,1); lcd.print(airHumidity); lcd.setCursor(8,1); lcd.print("%"); lcd.setCursor(11,1); lcd.print(valSoil); } }</p><p>int readTempHum (){</p><p> DHT.read11(dht_apin); //read value from DHT sensor</p><p> airTemp = DHT.temperature; //store temperature value from sensor airHumidity = DHT.humidity; // store humidity value from sensor //delay(3000);//Wait 3 seconds before accessing sensor again, without timing, sensor measurement is faulty. we commented this delay because this function isn't called often }</p><p>int waterPump(){</p><p> //the condition below to command or not the water pump if (valSoil</p><p> //once the waterpump cycle is launched, this if condition will turn ON the pump on the third of the timePumpPeriod defined, the other 2 third, the water pump will be turned OFF if (currentMillis-timePumpDebut=timePumpPeriod && pumpOn==true){ pumpOn=false; //once pump cycle is over, variable value change to make water spraying dependant on moisture value again sprayNum++; //add +1 to the number of spraying performed } }</p><p>int waterTankAlarm(){ if (sprayNum>10){ //when number of spraying is above limit, turn on led to warn user digitalWrite(LedPin,HIGH); } else { digitalWrite(LedPin,LOW); } }</p><p>void setup() { // put your setup code here, to run once: Serial.begin(9600); //defining wich pin are IN or OUT pinMode(LedPin, OUTPUT); pinMode(ButtonOnePin, INPUT); pinMode(ButtonTwoPin, INPUT); pinMode(waterPumpPin, OUTPUT); </p><p> // initialize the lcd lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Waking up");</p><p> //ready first temperature and humidity from DHT sensor to store value (since this function isn't called often) readTempHum(); delay(2000); lcd.clear();</p><p> }</p><p>void loop() {</p><p> //reading of sensor value, not DHT due to the delay needed to its measurement readSoil(); valGaz = analogRead(gazPin); valLight = analogRead(lightPin);</p><p> currentMillis=millis(); //measurement of current time</p><p> //small function to avoid button rebound, when pressing once on the button, arduino reads only one pressing... ButtonOneState=digitalRead(ButtonOnePin); //reading of button value if (ButtonOneState !=ButtonOnePreviousState){ //comparing with previous state if (ButtonOneState == HIGH){ //if previous state was 0 and current is 1, then take button pressing in account delay(200); valToDisplay=1; timeBeginDisplay=currentMillis; } ButtonOnePreviousState=ButtonOneState; } //same function for button 2 as button 1 ButtonTwoState=digitalRead(ButtonTwoPin); if (ButtonTwoState !=ButtonTwoPreviousState){ if (ButtonTwoState == HIGH){ delay(200); valToDisplay=2; //particular value for "valToDisplay" timeBeginDisplay=currentMillis; } ButtonTwoPreviousState=ButtonTwoState; } waterPump(); //calling for water pump function which launch spray cycle if needed</p><p> waterTankAlarm(); //calling function to warn user about water tank level</p><p> //small condition for screen refreshing and measurement of DHT sensor if (currentMillis-debutMillis>timePeriod){ //end of a period debutMillis=currentMillis; //define the begining of a new period toDisplay(); //refresh of the screen regarding "valToDisplay" value humMeasurePeriod++; //DHT sensor values are measured every 20 times the screens is refreshed if (humMeasurePeriod>20){ //go to measure DHT values readTempHum(); humMeasurePeriod=0; }</p><p> } </p><p>}</p>
Printing and Cutting Parts
All the files designed for this project are available on thingiverse.
Laser cutted wooden box: https://www.thingiverse.com/thing:410614
3d printed sprinkler: https://www.thingiverse.com/thing:3986672
3d printed Light sensor support: https://www.thingiverse.com/thing:3986667
Credit
This kit was made by Pralnia Makerspace, Poland under the supervision of Digijeunes.
http://pralniasokolowsko.pl/
http://www.digijeunes.com/
This tutorial has been produced as part of the DEEDU project, co-financed by the Erasmus + Programme of the European commission. Project n°: 2018-1-FR02-KA205-014144.
The content of this publication does not reflect the official opinion of the European Union. Responsibility for the information and views expressed therein lies entirely with the authors. For more information, email us at info@digijeunes.com