Regador automático exterior

Hola gente, les vengo a presentar mi proyecto de un riego automático para el exterior.

Como componentes voy a usar
Arduino uno r3
Relay
Sensores de humedad
Boton
Led

Mi idea es la siguiente,
Voy a a tener 3 sensores de humedad que me van a dar una lectura del suelo, la idea es que no estén tan distanciados y luego con el tiempo agregarle mas, con esas lecturas voy a hacer un promedio y dependiendo si el promedio este bajo o no va a hacer que el relay prenda la bomba un cierto tiempo.
Pero también quiero ponerle un botón para cuando lo aprete se encienda la bomba, la idea es que tenga el control automático y manual. Solo hago esto para agregarle algo mas y aprender.

De mas esta decir qeu soy nuevo y cualquier sugerencia me viene mas que bien.

Este es el codigo que arme pero el cual no me esta funcionando nose porque, cuando lo conecto el relay se vuelve loco y prende y apaga sin si quiera tocar algo!
Lo comento demasiado al codigo porque me parece mas facil despues darme cuenta de que es lo que hice.

//Regador V1
//Voy a declarar todas las constantes para luego si en algun momento voy a modificar algo solo cambio el numero y no todo el codigo.

//PINES DIGITALES
const int led = 5;
const int boton = 6;
const int s1 = 2;
const int s2 = 3;
const int s3 = 4;
const int rele1 = 7;
//PINES ANALOGICOS
const int s1A = 2 ;
const int s2A = 1 ;
const int s3A = 0 ;
//VALORES Y PROMEDIO DE LECTURAS DE LOS SENSORES
int valors1;
int valors2;
int valors3;
int promediovalores;
int espera = 50; // el valor e humedad que tiene que subir la bomba
//estado del boton
int estadoboton = 0;
void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(boton, INPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(rele1, OUTPUT);
  //Cuando iniciamos prendemos los 3 sensores
  digitalWrite(s1, HIGH);
  digitalWrite(s2, HIGH);
  digitalWrite(s3, HIGH);
  //Me aseguro que cuando inciie el rele y el led este apagado cuando inicio
  digitalWrite(rele1, HIGH);
  digitalWrite(led, LOW);
}

void loop()
{ //abro bucle loop
  //le asignamos a las varilables la lectura de los sensores
  valors1 = analogRead(s1A);
  valors2 = analogRead(s2A);
  valors3 = analogRead(s3A);
  //calculamos el primedio de los 3 valores y se lo asignamos a la variable
  promediovalores = ((valors1 + valors2 + valors3) / 3);
  estadoboton = digitalRead(boton);//
  /* IF para prender o apagar la bomba automaticamente
  si el promedio de la humedad de la tierra decae de cierto punto */
  if (promediovalores < 400)
  {
    digitalWrite(led, HIGH);
    digitalWrite(rele1, HIGH);
  }
  if ( promediovalores > (400 + espera)) //la bomba va a estar prendida hasta que llegue a dejar la tierra lo suficientemente humeda
  {
    digitalWrite(led, LOW);
    digitalWrite(rele1, LOW);
  }

  //IF para el modo manual de activar la bomba, mediante un boton
  if (estadoboton == HIGH)
  {
    digitalWrite(led, HIGH);
    digitalWrite(rele1, HIGH);
  }
  else
  {
    digitalWrite(led, LOW);
    digitalWrite(rele1, LOW);
  }
}//llave de cierre bucle loop

y lo e armado de esta forma

http://es.zimagez.com/zimage/avtxpde5leslye3lkisxssulcc9ww7z-seham0wsg1tg.php

http://es.zimagez.com/zimage/airuahwcrqdjfxevn8b21grixol3gjpnhn2ipibkn-.php

http://es.zimagez.com/zimage/avxqbcaxnujemvueryxwmdm5wsxx6nrx80wpdzbf2req.php

http://es.zimagez.com/zimage/asrou9uemqy2y9lmhnhwvqyxzbh2-u0qgpvrmwi0-.php

Lo del riego manual yo lo haría con un interruptor en paralelo al relé y no lo metería en royos de software así:

Te dejo el link por sin no se ve la imagen.

ardruido:
Te dejo el link por sin no se ve la imagen.

Es muy buena la idea, pero estoy buscando hacerlo del otro modo con un boton digital.
Pero lo voy a tener en cuenta si no logro hacerlo funcionar
Muchas gracias

yo usaria el boton con una interrupcion para no tener problemas !

Es decir armo una funcion y la llamo con la interrupcion eso con respecto al boton para manual

luego para la parte usaria la funcion map y convertiria a humedad relativa en porcentaje es decir en vez de tener quedaria asi map(0,1023,0,100); es decir convierto el valor analogico a un valor de 0 a 100
con esto tengo el porcentaje de humedad y despues de ahi con una condicional le digo que hacer si el valor de la variable humedad es menor a 50... else... no se si me explico bien pero seria la forma mas facil

Un boton con una interrupción?
Y si tienes mas botones que interrupciones que haces?

Lean que significa debounce o anti rebote en español.
Es solo leer un estado del pulsador y confirmarlo 10 o 20 mseg después. Si sigue en el mismo estado lo doy por válido.
Las interrupciones son para cosas mas importantes como un evento rápido, un enconder, por ejemplo.

Gabriel edita esos 3 enlaces que te quedaron con la barra mal ubicada [./url] al comienzo. Mira como hiciste la primera que quedó bien y corrige las otras 3.
Igualmente mas que esas fotos, yo hubiera hecho un croquis a mano alzada para entender como alimentas lasa cosas.
Si cuando presionas, el rele se vuelve loco puede deberse a varios motivos.

Tienes condiciones cruzadas. Tu promedio activa el rele y el led y tu boton hace lo mismo, asi que puedes estar apagando con el boton lo que prendes con el promedio y entonces por eso se vuelve loco.

Cambia todo a que la combinación de condicioines prendan o apaguen relé y led.

por ejemplo...

if (promedio && estadoboton) {
  // enciendes rele
}
else {
// apagas rele
}