14 Mayıs 2015 Perşembe

Automatic plant watering project on Arduino

     In this project our aim is to build an automatic watering system with using hydrometer sensor and arduino in the basis. System gets the information about humidity from hydrometer sensor in the soil and starts to water if plant becomes dry and thirsty to keep it alive. Auto Plant project has also temperature sensor for measuring the temperature in the air and alarm and automatic email service to warn the owner if water is finished. This project was built on Arduino IDE and with using hydrometer sensor, wifi module, temperature sensor, servo, buzzer and Arduino Uno board.







Equipment List:
·        YL-69 Soil Hydrometer Humidity Detection Module
·        ESP8266 Serial WIFI Module
·        LM35 Temperature Sensor
·        Servo
·        Arduino Uno
·        Buzzer
·        Server
·        Jumpers

·        Board

      We designed the project according to an idea which is about keeping the plants living with automatic running system. This system can be used by people who has limited time and who has to travel frequently. So, we took this idea as an infrastructure for the project and we designed an automatic watering system with some equipment which is convenient to use with Arduino. First we figured out which kind of warning system can be useful. We built an email service with using ESP8266 wifi module and we send a message for the owner with the information about water in the system and temperature. The project has two measured part which is temperature and humidity, so our smart system measures them in every five minutes. We store the information about normal humidity level and temperature rate on EEPROM and when system read the values then it compares them.
               An automatic watering system is activated when water level is under the normal level. Movement is provided by servo and some other equipment. Water is filled by the owner and system starts an alarm if watering action is not handled. We designed the alarm time as playing 3 times in 1 minute interval. When the user doesn’t fill the water then system sends an email to the owner.

               In the designing part, we chose the TimerOne library for interrupts and time intervals. Also we thought EEPROM was convenient for the project as a storage position to keep the normal values of humidity and temperature.

Requirements :

Project has overall six requirements in particular areas:

-        In extra, hydrometer sensor, wifi module, temperature sensor and buzzer will be used in this project.

-        In this project, EEPROM will be used to keep the plant moisture ratio and temperature level that it requires. Data will be used in comparison of read value which comes from sensor reading and normal value which is called from EEPROM.

-        Humidity level will be measure in every 5 minutes to understand it is under the normal level or not. So, timer will be used to check the time.

-        To avoid the plant dead if water in the mechanism is done, buzzer will start as an alarm until 5 minutes pass.

-        Owner will be warned by the system with the information of temperature and humidity ratio when they are not good for the plant. It will be done by wifi module and connecting with the server. For example when the temperature decreased below the normal value or humidity level then owner will be warned with using the email message.

-        System will water the plant automatically when the humidity level is less. So, movement will be done by the servo. It will be connected with the Arduino and also it has a connection with a container filled with water.


Arduino Code : 

#include <SoftwareSerial.h>
#include <Servo.h>
#include <TimerOne.h>

#define DEBUG true

SoftwareSerial esp8266(10,11); //TX RX
Servo servo;
int hydrometerSensor = 0;
int lm35Pin = 5;
int buzzerPin = 3;
int duration=1000;
int frequency = 262;
int hydrometerValue;
int hydrometerValue2;
float temperature;
int flag = 0;
int checkBuzz;
int count = 0;
int checkServo = 0;
int info; //water is finished info = 1, temp is low info = 0

void setup(){
  
  servo.attach(9);
 // analogReference(INTERNAL);
  pinMode(buzzerPin, OUTPUT);
  Timer1.initialize(8000000);
  Timer1.attachInterrupt(reread);
  Serial.begin(9600);
  esp8266.begin(9600);

}
void loop(){
  int time1, time2;

 if(checkBuzz == 1){
   if(count>2){
     noTone(buzzerPin);
     info = 1;
     sendEmail(info);
     count = 0;
     checkBuzz = 0;
   }
   else{
      buzz();
      count++;
   }
  
 }

 if(hydrometerValue>900){
     //servo
    delay(5000);
    hydrometerValue2 = analogRead(hydrometerSensor);
    if(hydrometerValue2>900){
      checkBuzz = 1;
    }
    else{
      checkBuzz = 0;
    }
 }

 /*if(temperature < 10){
   info = 0;
   sendEmail(info);
 }*/
}


void reread(){
  /*if(flag<15){
    flag++;
  }
  else{*/
    hydrometerValue = analogRead(hydrometerSensor);
    int reading = analogRead(lm35Pin);
    temperature =  (reading*5.0*100.0)/1024.0;
     Serial.print("hydro  : ");
  Serial.println(hydrometerValue);
  Serial.print("temp  : ");
  Serial.println(temperature);
   // flag = 0;
  //}
  //Serial.println(sensorValue);
  //340 - 1023
}

void buzz(){
  for(int i = 0;i<10;i++){
    tone(buzzerPin, frequency, duration/2);
    delay(duration);
  }
}

void sendEmail(int info){
   
   String response;
   String cmd = "AT+CIPSTART=4,\"TCP\",\"yeicmobil.com\",80\r\n";  //make this command: AT+CPISTART="TCP","146.227.57.195",80
   String val =  "GET http://www.yeicmobil.com/android/cse342.php?email=email@email.com&data=";
   val=val+info;
   val=val+" HTTP/1.0\r\n\r\n"; //construct http GET request
   String value = "AT+CIPSEND=4,";
   value=value+val.length();
   value=value+"\r\n";
   
  sendData("AT+RST\r\n",2000,DEBUG);
  sendData("AT+CWMODE=1\r\n",1000,DEBUG);
  sendData("AT+RST\r\n",2000,DEBUG);
  sendData("AT+CIPMUX=1",500,DEBUG);
  response=sendData("AT+CWJAP=\"modem\",\"password\"\r\n",2000,DEBUG);
  response=sendData(cmd,2000,DEBUG);
  response = sendData(value,2000,DEBUG);
  sendData(val,5000,DEBUG);
  
}
String sendData(String command, const int timeout, boolean debug){
    String response = "";
    esp8266.print(command); // send the read character to the esp8266
    long int time = millis();
    while( (time+timeout) > millis())
    {
      while(esp8266.available())
      {
        // The esp has data so display its output to the serial window 
        char c = esp8266.read(); // read the next character.
        response+=c;
      }  
    }
    if(debug)
    {
      Serial.println(response);
    }
    return response;
}



Hiç yorum yok:

Yorum Gönder