Misbehaving automatic watering system


i'm beginner working on automatic watering system based on arduino. hardware consists of arduino mega, moisture sensors, 2 servos, lcd screen , water pump. sketch, , think problem lies, makes hardware act in unwanted way.

i want sketch check if plant dry, water plant 1 time if dry, , wait 5 minutes before doing same void loop again.

what think software doing right now, stopping of if statements of sketch met (plant dry) , repeating same if statement until not met. i'll put code down here , i'll thankful can get.

p.s. last thing did trying solve issue putting "return;" in end of each if statement, hoping make sketch "jump out" of if statement , continue down code. didn't work. maybe makes sketch start beginning of void loop?
code: [select]



#include <pcd8544.h>

#include <servo.h>

//create servo objects
servo horizontalservo; 
servo verticalservo;

static pcd8544 lcd;

//define moisture sensor pins
const int analoginpin0 = a0;   
const int analoginpin1 = a1;
const int analoginpin2 = a2;
const int analoginpin3 = a3;
const int analoginpin4 = a4;


//variables gather moisture sensor data
int moisturevalue0 = 0;       
int moisturevalue1 = 0;
int moisturevalue2 = 0;
int moisturevalue3 = 0;
int moisturevalue4 = 0;

//parameters each plant
const int hservopositiona0 = 9;
const int vservopositiona0 = 121;
const int triggervaluea0 = 20;
const int wateringtimea0 = 4000;

const int hservopositiona1 = 28;
const int vservopositiona1 = 128;
const int triggervaluea1 = 30;
const int wateringtimea1 = 4000;

const int hservopositiona2 = 78;
const int vservopositiona2 = 137;
const int triggervaluea2 = 30;
const int wateringtimea2 = 4000;

const int hservopositiona3 = 120;
const int vservopositiona3 = 129;
const int triggervaluea3 = 30;
const int wateringtimea3 = 4000;

const int hservopositiona4 = 164;
const int vservopositiona4 = 121;
const int triggervaluea4 = 30;
const int wateringtimea4 = 4000;

//water pump control pins
const int pumpanodepin = 11;
const int pumpcathodepin = 12;

const int lcdbacklight = 13;

void setup() {
 
 // set resolution of lcd screen
  lcd.begin(84, 48);
 
  // attach servo on pin 9 servo object
  // attaches servo on pin 10 servo object
  horizontalservo.attach(10); 
  verticalservo.attach(9);

  //set pins either input or output
  pinmode(analoginpin0, input);
  pinmode(analoginpin1, input); 
  pinmode(analoginpin2, input); 
  pinmode(analoginpin3, input); 
  pinmode(analoginpin4, input);     
 
  pinmode(lcdbacklight, output);

  pinmode(pumpanodepin, output);
  pinmode(pumpcathodepin, output);

  digitalwrite(lcdbacklight, low);

  digitalwrite(pumpanodepin, low);
  digitalwrite(pumpcathodepin, low);
   

}


void loop() {
   
    //gather moisture sensor data
    moisturevalue0 = analogread(analoginpin0); 
    moisturevalue1 = analogread(analoginpin1);
    moisturevalue2 = analogread(analoginpin2);
    moisturevalue3 = analogread(analoginpin3);
    moisturevalue4 = analogread(analoginpin4);

    //convert gathered data 0-100 scale
    moisturevalue0 = map(moisturevalue0, 0, 1023, 100, 0); 
    moisturevalue1 = map(moisturevalue1, 0, 1023, 100, 0);
    moisturevalue2 = map(moisturevalue2, 0, 1023, 100, 0);
    moisturevalue3 = map(moisturevalue3, 0, 1023, 100, 0);
    moisturevalue4 = map(moisturevalue4, 0, 1023, 100, 0);

  // writing moisture values on lcd
  lcd.setcursor(20, 0);
  lcd.print("moisture %");


  lcd.setcursor(0, 1);
  lcd.print("a0:");
  lcd.print(moisturevalue0);
  lcd.print("  ");
 

  lcd.setcursor(0, 2);
  lcd.print("a1:");
  lcd.print(moisturevalue1);
  lcd.print("  ");
 

  lcd.setcursor(0, 3);
  lcd.print("a2:");
  lcd.print(moisturevalue2);
  lcd.print("  ");
 
  lcd.setcursor(0, 4);
  lcd.print("a3:");
  lcd.print(moisturevalue3);
  lcd.print("  ");
 

  lcd.setcursor(0, 5);
  lcd.print("a4:");
  lcd.print(moisturevalue4);
  lcd.print("  ");

 
  //comparing gathered moisture values trigger values each respective plant
  if (moisturevalue0<triggervaluea0)
    {
      horizontalservo.write(hservopositiona0);
      delay(500);
      verticalservo.write(vservopositiona0);
      delay(500);
      digitalwrite(pumpanodepin, high);
      delay(wateringtimea0);
      digitalwrite(pumpanodepin, low);
      return; //i thought return made program/sketch exit if statement , continued down code seems not.
      }

  if (moisturevalue1<triggervaluea1)
    {
      horizontalservo.write(hservopositiona1);
      delay(500);
      verticalservo.write(vservopositiona1);
      delay(500);
      digitalwrite(pumpanodepin, high);
      delay(wateringtimea1);
      digitalwrite(pumpanodepin, low);
      return;
      }

  if (moisturevalue2<triggervaluea2)
    {
      horizontalservo.write(hservopositiona2);
      delay(500);
      verticalservo.write(vservopositiona2);
      delay(500);
      digitalwrite(pumpanodepin, high);
      delay(wateringtimea2);
      digitalwrite(pumpanodepin, low);
      return;
      }

  if (moisturevalue3<triggervaluea3)
    {
      horizontalservo.write(hservopositiona3);
      delay(500);
      verticalservo.write(vservopositiona3);
      delay(500);
      digitalwrite(pumpanodepin, high);
      delay(wateringtimea3);
      digitalwrite(pumpanodepin, low);
      return;
      }

  if (moisturevalue4<triggervaluea4)
    {
      horizontalservo.write(hservopositiona4);
      delay(500);
      verticalservo.write(vservopositiona4);
      delay(500);
      digitalwrite(pumpanodepin, high);
      delay(wateringtimea4);
      digitalwrite(pumpanodepin, low);
      return;
      }

  //center servos
  horizontalservo.write(100);
  verticalservo.write(110);

  //wait 5 minutes before doing loop again
  delay(300000);
 
}

well, it's nicely laid out code can ready easily.  :)

the 'return' does, in fact, jump out of main loop comes in @ top again , repeats same steps on again. it's poor programming practice way - better put each watering block own method , calling loop, once each plant or until response underlying method indicating has started watering process can skip remaining plant checks , wait 5 mins (at least, believe trying do).

i'd put few serial.print statement in there (i know have lcd help) it's useful see going on compared think happening!

btw did intentionally map moisture value 0-1023 reverse scale 100 0? askin'  :)


Arduino Forum > Using Arduino > Project Guidance > Misbehaving automatic watering system


arduino

Comments

Popular posts from this blog

Help with Missing Filename Error?

more info - Joomla! Forum - community, help and support

Using phone battery to power a plane.