Close

Hydroponics Nutrient feeder unit

rohit-sharmaRohit Sharma wrote 01/06/2022 at 15:00 • 7 min read • Like

I have been growing leafy greens using Hydroponics for the last 3 years. I was tiered checking out for the nutrient levels and pH level of the nutrient water solution, so I decided to make a nutrient feeding unit to maintain the optimal nutrient level and PH 

To measure th EC I needed to get a EC sensor, the EC sensor available in market were quite expensive so I decided to check if I can make DIY it. Luckily I found one project on hackaday (3 dollar Ec Meter) so  I made my own EC sensor
I bought  EC sensor from an Electronics Ecommerce for about 20 USD


So the total components used were :
1 Arduino Mega
2 DS18B20 temperature sensor
3 2 Peristaltic Pump
4 Seven Segment LCD display 
5 pH sensor probe 
6 Ec sensor 
7 tubes to feed nutrient solution
8 Relay Board to control Peristaltic Pump

Arduino Code 

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define set A0   //set pin on A0
#define inc A1  //increment pin on A1
#define dec A2  //decrement pin on A2
//********Serial_Data**************
float data1 = 0;
float data2 = 0;
float data3 = 0;

//######################SETTINGS_FOR_EC_MEASUREMENT##############################

#define ECPump 10 
#define ONE_WIRE_BUS 6                    // Data wire For Temp Probe is plugged into pin 2 on the Arduino 
int R1=450;                                 //resistance provided for the votage 
int Ra=25;                                  //Resistance of powering Pins
int ECPin= A3;
int ECGround=A4;
int ECPower =A5;

float TemperatureCoef = 0.019;             //this changes depending on what chemical we are measuring
float K=3.3;                               //value from the calibration test
OneWire oneWire(ONE_WIRE_BUS);             // Setup a oneWire instance to communicate with any OneWire devices
const int TempProbePossitive =9;           //Temp Probe power connected to pin 9
const int TempProbeNegative=8;             //Temp Probe Negative connected to pin 8
DallasTemperature sensors(&oneWire);       // Pass our oneWire reference to Dallas Temperature.
float Temperature=0;
float EC=0;
float EC25 =0;
float finalEC=0;
float raw= 0;
float Vin= 5;
float Vdrop= 0;
float Rc= 0;
float buffer=0;
int ecMaxStatus=0; //flag to check if the Ec has reached its maximum value

//#################################LCD_SETTINGS###############################################


const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // pin number on arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//void screen1(int ec,int ph,int temp);
//#################################PH_SETTINGS################################################
#define PHPump 7
float ph=0;
#define SensorPin A6            //pH meter Analog output to Arduino Analog Input 0
#define Offset -9.45            //deviation compensate
unsigned long int avgValue;     //Store the average value of the sensor feedback
//################################CHECK_TIMES################################################
long int EC_CheckTime=10000; // 30 seconds
long int PH_CheckTime=12000;
unsigned long int previousMillis = 0;
//################SET_EC&PH####################################################
float setEC=2.7;
float setPH=1;


void setup(){
  //***************LCD_SETUP****************
  lcd.begin(16,2);
  lcd.print("T  F  C");
  //****************EC&TEMP_SETUP*******************
  pinMode(TempProbeNegative , OUTPUT );             //seting ground pin as output for tmp probe
  digitalWrite(TempProbeNegative , LOW );           //Seting it to ground so it can sink current
  pinMode(TempProbePossitive , OUTPUT );            //ditto but for positive
  digitalWrite(TempProbePossitive , HIGH );  
  pinMode(ECPin,INPUT);
  pinMode(ECGround,OUTPUT);                         //setting pin for sinking current
  digitalWrite(ECGround,LOW);                      //We can leave the ground connected permanantly
  pinMode(ECPump,OUTPUT);
  digitalWrite(ECPump,LOW);
  pinMode(PHPump,OUTPUT);
  digitalWrite(PHPump,LOW);                                      // gives sensor time to settle
  
  sensors.begin();
  delay(100);
  R1=(R1+Ra);         
  //************************************************
  Serial.begin(9600);

}

void loop(){
  GetEC();
  GetPH();
  Data(Temperature,finalEC,ph);
  
  screen1(finalEC,ph,Temperature);
  delay(5000);
  
  
  unsigned long currentMillis=millis();
  if(currentMillis-previousMillis >= EC_CheckTime && Temperature>0)
  {
    previousMillis=currentMillis;
    if(finalEC<setEC)
    {
      increaseEC();
    }
    if(ph>setPH)
    {
      decreasePH();
    }
  }
  if(Temperature<=0)
  {
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("Error in Temp!");
  lcd.setCursor(1,1);
  lcd.print("Waiting....");
  delay(200);
  }
  /*if(currentMillis-previousMillis >= PH_CheckTime)
  {
    previousMillis=currentMillis;
    if(ph>setPH)
    {
      decreasePH();
      delay(5000);
    }
  }
  screen1(finalEC,ph,Temperature);*/
  
 


}

//************************************************LCD FUNCTIONS****************************************************************************************************
void screen1(float ec,float ph,float temp){
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("EC");
  lcd.setCursor(5, 0 );
  lcd.print("Ph");
  lcd.setCursor(9, 0 );
  lcd.print("Temp");

  lcd.setCursor(1,1);
  lcd.print(ec,1);
  lcd.setCursor(5,1);
  lcd.print(ph,0);
  lcd.setCursor(9,1);
  lcd.print(temp,1);
  delay(200);
  
}

//*************************************************************************SERIAL_DATA_TRANSFER*******************************************************************************************
void Data( float a, float b, float c)    
{
  data1 = a;
  data2 = b;
  data3 = c;
  
  Serial.print("t ");
  Serial.println(data1);
  
  Serial.print("e ");
  Serial.println(data2);
  
  Serial.print("p ");
  Serial.println(data3);
  
}
//***************************************************************ELECTRONIC_CONDUCTIVITY********************************************************************************
void increaseEC(void)
{
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("EC Low!");
  lcd.setCursor(1,1);
  lcd.print("Increasing EC..");
  delay(200);
  digitalWrite(ECPump,HIGH);
  delay(5000);
  digitalWrite(ECPump,LOW);
  }
//****************************************************************
void GetEC(){
 
 
//*********Reading Temperature Of Solution *******************//
sensors.requestTemperatures();// Send the command to get temperatures
Temperature=sensors.getTempCByIndex(0); //Stores Value in Variable
 
//************Estimates Resistance of Liquid ****************//
digitalWrite(ECPower,HIGH);
raw= analogRead(ECPin);
raw= analogRead(ECPin);// This is not a mistake, First reading will be low beause if charged a capacitor
digitalWrite(ECPower,LOW);
delay(10);
 
//***************** Converts to EC **************************//
Vdrop= (Vin*raw)/1024.0;
Rc=(Vdrop*R1)/(Vin-Vdrop);
Rc=Rc-Ra; //acounting for Digital Pin Resitance
EC = 1000/(Rc*K);
 
 
//*************Compensating For Temperaure********************//
EC25  =  EC/ (1+ TemperatureCoef*(Temperature-25.0));
finalEC=EC25/10;
finalEC=finalEC*(-1);
 ;}
 //************************************************PH_FUNCTIONS********************************************************************************************

 void GetPH(){
  int buf[10];                //buffer for read analog
  for(int i=0;i<10;i++)       //Get 10 sample value from the sensor for smooth the value
  {
    buf[i]=analogRead(SensorPin);
    delay(10);
  }
  for(int i=0;i<9;i++)        //sort the analog from small to large
  {
    for(int j=i+1;j<10;j++)
    {
      if(buf[i]>buf[j])
      {
        int temp=buf[i];
        buf[i]=buf[j];
        buf[j]=temp;
      }
    }
  }
  avgValue=0;
  for(int i=2;i<8;i++)                      //take the average value of 6 center sample
    avgValue+=buf[i];
  float phValue=(float)avgValue*5/1024/6; //convert the analog into millivolt
  ph=8.10*phValue+Offset;                      //convert the millivolt into pH value

   
  delay(800);
}
 
 void decreasePH(void)
{
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("PH High!");
  lcd.setCursor(1,1);
  lcd.print("Decreasing PH..");
  delay(200);
  digitalWrite(PHPump,HIGH);
  delay(5000);
  digitalWrite(PHPump,LOW);
  }

  

 Let me know if you have any queries! Happy to help!

Like

Discussions