#include <TimerOne.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define MODOINICIAL 0
#define ESPERAR_REGAR 1
#define COMPROBAR_TIEMPO 2
#define REGAR_BOTON 3
#define ESPERAR_VOLVER_MODOINICIAL 4
#define COMPROBAR_TIEMPO_MODOINICIAL 5
#define TULIPAN 6
#define TULIPAN_PRENDIDO 10
#define ROSA 7
#define ROSA_PRENDIDO 11
#define JAZMIN 8
#define JAZMIN_PRENDIDO 12
#define APAGADO 9
#define BOTON1 2
#define BOTON2 3
#define BOTON3 4
#define BOTON4 5
#define SONIDO 6
#define SWITCH 8
#define RELE_BOMBA 10
#define SENSOR_HUMEDAD A1
#define SENSOR_AGUA A0
#define LED_KEEP_ALIVE 13
//Se definen los pines de Arduino
LiquidCrystal_I2C lcd(0x27, 16, 2);
int estadoActivo = MODOINICIAL;
float agua;
int agua2;
float humedad;
int tiempo = 0;
int humedad2;
int tiempoLedKeepAlive=0;
void setup() {
pinMode(BOTON1, INPUT_PULLUP);
pinMode(BOTON2, INPUT_PULLUP);
pinMode(BOTON3, INPUT_PULLUP);
pinMode(BOTON4, INPUT_PULLUP);
pinMode(SWITCH, INPUT_PULLUP);
pinMode(SENSOR_HUMEDAD, INPUT);
pinMode(SENSOR_AGUA, INPUT);
pinMode(RELE_BOMBA, OUTPUT);
pinMode(SONIDO, OUTPUT);
pinMode(LED_KEEP_ALIVE,OUTPUT);
Wire.begin();
lcd.init();
lcd.backlight();
Timer1.initialize(1000);
Timer1.attachInterrupt(funcionTiempo);
Serial.begin(9600);
}
void loop() {
if(tiempoLedKeepAlive>=1000){
tiempoLedKeepAlive=tiempoLedKeepAlive-1000;
digitalWrite(LED_KEEP_ALIVE,!digitalRead(LED_KEEP_ALIVE));
}
if (digitalRead(SWITCH) == 0) {
lcd.setCursor(12, 0);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print("A:");
agua = analogRead(SENSOR_AGUA) / 10.23;
agua2 = agua;
lcd.setCursor(12,0);
lcd.print(agua2);
lcd.setCursor(15, 0);
lcd.print("%");
lcd.setCursor(10, 1);
lcd.print("H: ");
lcd.setCursor(12, 1);
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
lcd.print(humedad2);
lcd.setCursor(15, 1);
lcd.print("%");
agua = analogRead(SENSOR_AGUA) / 10.23;
if (agua < 30) {
digitalWrite(SONIDO, HIGH);
} else {
digitalWrite(SONIDO, LOW);
}
maquinaEstado();
} else {
estadoActivo = APAGADO;
lcd.clear();
lcd.noDisplay();
maquinaEstado();
}
delay(100);
}
void maquinaEstado() {
Serial.println(estadoActivo);
switch (estadoActivo) {
case MODOINICIAL:
lcd.setCursor(0, 0);
lcd.print("B.A");
lcd.setCursor(0, 1);
lcd.print("E.M");
if (digitalRead(BOTON1) == 0) {
estadoActivo = TULIPAN;
lcd.setCursor(0, 1);
lcd.print("TUL");
}
if (digitalRead(BOTON2) == 0) {
estadoActivo = ROSA;
lcd.setCursor(0, 1);
lcd.print("ROS");
}
if (digitalRead(BOTON3) == 0) {
estadoActivo = JAZMIN;
lcd.setCursor(0, 1);
lcd.print("JAZ");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_REGAR;
lcd.setCursor(0, 1);
lcd.print(" ");
}
break;
case ESPERAR_REGAR:
if (tiempo > 15) {
estadoActivo = REGAR_BOTON;
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_REGAR;
tiempo = 0;
}
break;
case REGAR_BOTON:
lcd.setCursor(0, 0);
lcd.print("B.P");
lcd.setCursor(0, 1);
lcd.print("R.A");
analogWrite(RELE_BOMBA, 100);
if (digitalRead(BOTON1) == 0) {
estadoActivo = TULIPAN;
lcd.setCursor(0, 1);
lcd.print("TUL");
}
if (digitalRead(BOTON2) == 0) {
estadoActivo = ROSA;
lcd.setCursor(0, 1);
lcd.print("ROS");
}
if (digitalRead(BOTON3) == 0) {
estadoActivo = JAZMIN;
lcd.setCursor(0, 1);
lcd.print("JAZ");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
}
break;
case ESPERAR_VOLVER_MODOINICIAL:
if (tiempo > 15) {
estadoActivo = MODOINICIAL;
analogWrite(RELE_BOMBA,0);
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
tiempo = 0;
}
break;
case TULIPAN:
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
if (humedad2 < 70) {
analogWrite(RELE_BOMBA, 100);
lcd.setCursor(0, 0);
lcd.print("B.P");
estadoActivo = TULIPAN_PRENDIDO;
}
if (digitalRead(BOTON2) == 0) {
estadoActivo = ROSA;
lcd.setCursor(0, 1);
lcd.print("ROS");
}
if (digitalRead(BOTON3) == 0) {
estadoActivo = JAZMIN;
lcd.setCursor(0, 1);
lcd.print("JAZ");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
lcd.setCursor(0, 1);
lcd.print("E.M");
}
break;
case TULIPAN_PRENDIDO:
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
if (humedad2 > 80) {
analogWrite(RELE_BOMBA, 0);
lcd.setCursor(0, 0);
lcd.print("B.A");
estadoActivo = TULIPAN;
}
if (digitalRead(BOTON2) == 0) {
estadoActivo = ROSA;
lcd.setCursor(0, 1);
lcd.print("ROS");
}
if (digitalRead(BOTON3) == 0) {
estadoActivo = JAZMIN;
lcd.setCursor(0, 1);
lcd.print("JAZ");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
}
break;
case ROSA:
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
if (humedad2 < 70) {
analogWrite(RELE_BOMBA, 100);
lcd.setCursor(0, 0);
lcd.print("B.P");
estadoActivo = ROSA_PRENDIDO;
}
if (digitalRead(BOTON1) == 0) {
estadoActivo = TULIPAN;
lcd.setCursor(0, 1);
lcd.print("TUL");
}
if (digitalRead(BOTON3) == 0) {
estadoActivo = JAZMIN;
lcd.setCursor(0, 1);
lcd.print("JAZ");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
}
break;
case ROSA_PRENDIDO:
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
if (humedad2 > 75) {
analogWrite(RELE_BOMBA, 0);
lcd.setCursor(0, 0);
lcd.print("B.A");
estadoActivo = ROSA;
}
if (digitalRead(BOTON1) == 0) {
estadoActivo = TULIPAN;
lcd.setCursor(0, 1);
lcd.print("TUL");
}
if (digitalRead(BOTON3) == 0) {
estadoActivo = JAZMIN;
lcd.setCursor(0, 1);
lcd.print("JAZ");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
}
break;
case JAZMIN:
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
if (humedad2 > 75) {
analogWrite(RELE_BOMBA, 0);
lcd.setCursor(0, 0);
lcd.print("B.A");
estadoActivo = JAZMIN;
}
if (humedad2 < 60) {
analogWrite(RELE_BOMBA, 100);
lcd.setCursor(0, 0);
lcd.print("B.P");
estadoActivo = JAZMIN_PRENDIDO;
}
if (digitalRead(BOTON1) == 0) {
estadoActivo = TULIPAN;
lcd.setCursor(0, 1);
lcd.print("TUL");
}
if (digitalRead(BOTON2) == 0) {
estadoActivo = ROSA;
lcd.setCursor(0, 1);
lcd.print("ROS");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
}
break;
case JAZMIN_PRENDIDO:
humedad = analogRead(SENSOR_HUMEDAD) / 10.23;
humedad2 = humedad;
if (humedad2 > 75) {
analogWrite(RELE_BOMBA, 0);
lcd.setCursor(0, 0);
lcd.print("B.A");
estadoActivo = JAZMIN;
}
if (digitalRead(BOTON1) == 0) {
estadoActivo = TULIPAN;
lcd.setCursor(0, 1);
lcd.print("TUL");
}
if (digitalRead(BOTON2) == 0) {
estadoActivo = ROSA;
lcd.setCursor(0, 1);
lcd.print("ROS");
}
if (digitalRead(BOTON4) == 0) {
estadoActivo = ESPERAR_VOLVER_MODOINICIAL;
}
break;
case APAGADO:
analogWrite(RELE_BOMBA, 0);
lcd.clear();
lcd.noDisplay();
if (digitalRead(SWITCH) == 0) {
estadoActivo = MODOINICIAL;
analogWrite(RELE_BOMBA,0);
lcd.display();
lcd.setCursor(0, 1);
lcd.print("E.M");
}
break;
}
}
void funcionTiempo() {
tiempo++;
tiempoLedKeepAlive++;
}