/*
Sketch para lectura de humedad del suelo y riego autonomo 06/06/2015
Version del sketch: 2.2 (Con Arduino MEGA)
Agradecimientos en especial por su gran ayuda a:
- surbyte, del foro http://forum.arduino.cc por sus multiples aportaciones
- noter, Por hacer posible el uso correcto del LCD
Este sketch lee una entrada analogica en el pin 15 (A15)
e imprime el resultado. Usaremos el medidor de humedad
en suelo FC-28, un reloj RTC DS3231N y Un LCD shield.
Este sketch es Libre para mejorar y compartir! Se prohibe su uso con fines comerciales.
*/
#include <LiquidCrystal.h> // Libreria para LCD
#include <Wire.h> // Libreria comunicacion I2C
#include "RTClib.h" // Libreria RTC
// Relay:
#define RELAY_ON 0
#define RELAY_OFF 1
#define RELAY_1 30
// END relay.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Asigniacion de pines para LCD Keypad Shield.
RTC_DS1307 RTC; // Creamos objeto reloj RTC.
bool PowerON = false; // Variable booleana para el encendido.
int sensorHumedad; // Variable para SoilSensor.
int histeresis = 5; // Margen de riego.
const int bomba = 53; // Defino el pin de la mini bomba de agua.
// Array para mostrar los dias de la semana gracias a surbyte.
const char* diaDeSemana[7]= {"Domingo", "Lunes", "Martes", "Miercol","Jueves", "Viernes", "Sabado"};
// Configuracion:
void setup()
{
// Power ON/OFF ATX:
pinMode(24,OUTPUT); // Para usar un LED de encendido.
pinMode(23, OUTPUT); // Para encender la fuente con un LOW.
digitalWrite(23, HIGH); // Inicia la Fuente apagada.
pinMode(22, INPUT_PULLUP); // Para leer el boton.
// END power ON/OFF ATX.
// Relay:
pinMode(RELAY_1, OUTPUT);
// END Relay.
pinMode(bomba, OUTPUT); // Pin 2 bomba como salida.
digitalWrite(bomba, LOW); // Iniciamos con la bomba apagada.
Wire.begin(); // Inicia el puerto I2C.
RTC.begin(); // Inicia la comunicacion con el RTC.
lcd.begin(16, 2); // Inicia LCD 16X2.
lcd.clear(); // Limpiamos la pantalla.
// Establece la fecha y hora, Comentar una vez establecida la hora!! Descomentar para establecer hora.
// RTC.adjust(DateTime(2015,05,19, 12,03,00));
} // Cerramos la llave de la configuracion.
// Funciones
void loop() // Esta funcion se mantiene en bucle...
{
// Power ON OFF ATX:
bool boton = digitalRead(22);
if (boton == LOW)
{
digitalWrite(23, PowerON); // Como el pin va invertido, lo establecemos antes de cambiar el estado.
PowerON = ! PowerON ; // Ivertimos el estatus de la fuente.
digitalWrite(24, PowerON); // Encender o apagar el LED.
delay(250); // Retardo para evitar rebotes del boton.
}
// END power ON OF ATX.
sensorHumedad = analogRead(A15); // Leemos la entrada analogica pin A15:
sensorHumedad = map (sensorHumedad, 0, 1023, 100, 0); // Mapeamos el valor del sensor de 0 a 100.
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC.
lcd.setCursor(0, 0); // Cursor en fila 1 posicion 1.
char myBuffer[16]; // Creamos myBuffer para mostrar bien los dijitos del 1 al 9.
sprintf(myBuffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(myBuffer); // Muestra la hora, minutos y segundos.
lcd.setCursor(9, 0); // Cursor en fila 1 posicion 12.
lcd.print(diaDeSemana[now.dayOfWeek()]); // Muestra dia de la semana.
lcd.setCursor(0, 1); // Cursor en fila 2 posicion 1.
lcd.print("Humedad "); // Muestra (humedad) por LCD.
lcd.print(sensorHumedad); // Muestra valor leido de humedad.
lcd.print("% "); // Muestra Signo de %
delay(250); // Retardo entre lecturas para dar estabilidad.
if (sensorHumedad < 85)
{
digitalWrite(RELAY_1, RELAY_ON);
}
if (sensorHumedad > (85 + histeresis))
{
digitalWrite(RELAY_1, RELAY_OFF);
} //Cerramos la llave del if.
} // Cerramos la llave del bucle y vuelve arriba.