Hola, tengo un sistema de riego automático que funciona bastante bien... es un arduino uno, conectado a un relé y del relé a una electroválvula para el riego. Para saber cuando regar tiene un sensor de humedad también conectado al arduino al igual que una pantalla LCD que me va mostrando los datos como la hora, la humedad del suelo y si se está regando o no... es decir, una maravilla jejejeje ahora se me ha ocurrido ampliar un poco y añadirle un conmutador toggle switch de tres posiciones como este:
Como podrán ver, es un conmutador con tres posiciones, podemos llamarlas "arriba" "centro" y "abajo". Siendo arriba el cable negro, centro cable blanco y abajo cable rojo. Pues lo que quiero hacer es que cuando esté "arriba" la electroválvula encienda independientemente del resto del código, lo que sería una apertura manual de riego. Cuando esté en el "centro" siga como está ahora, de manera automática. Y cuando esté "abajo" la electroválvula quede cerrada independientemente del resto del código.
Para empezar estaba intentando que cuando suba la palanca a la posición de "arriba" en el serial monitor me aparezca la palabra arriba, cuando ponga la palanca al "centro" en el serial monitor me aparezca la palabra centro, y cuando ponga la palanca en la posición de "abajo" en el serial monitor me aparezca la palabra abajo.
¿Alguna idea de cómo hacer eso??
Si consigo diferenciar las tres posiciones de la palanca del conmutador, luego veré cómo hacerlo funcionar con el siguiente código, ya que uso la función Alarm.alarmRepeat la cual está en el setup, y no sabría cómo meterla dentro de un if para condicionarla a dónde esté la palanca del conmutador... no sé si me habré explicado con claridad...
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
// Creamos un objeto lcd con los pines a los que está conectado
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
// Declaramos la entrada del pin del sensor de humdad de tierra
const int sensorPin = A0;
// Declaramos la salida del pin del Relé, LOW para abrir electroválvula y HIGH para cerrar.
const int relePin = 2;
void setup() {
// Iniciamos el pin del sensor de humedad del suelo como input
pinMode(sensorPin, INPUT);
//definir el pin del relé como salida
pinMode(relePin, OUTPUT);
// Preparar la interfaz serial
Serial.begin(9600);
//cargamos un objeto lcd e iniciamos la pantalla con 20 caracteres por línea y 4 líneas
lcd.begin(20, 4);
// Configurar los pines de salida de relevadores desactivados al inicio
// recordamos que los modulos de reles se activan con un estado bajo
digitalWrite(relePin, HIGH);
// Ponemos la palabra no en el LCD en la parte donde pone Regando:, para así que siempre empiece en no y se modique cuando se está regando o cuando ha parado de regar.
lcd.setCursor(9,1);
lcd.write("NO");
// Cargar la hora actual desde el RTC e indicar que esto suceda de forma automática durante loop()
// Utilizamos el método RTC.get() de la libreria DS1307RTC. El RTC debe estar conectado como se
// indica en el texto y debe tener la fecha y hora correctas
setSyncProvider(RTC.get);
if (timeStatus() != timeSet)
Serial.println("Fallo de RTC");
else
Serial.println("Sincronizado con RTC");
// Crear las alarmas y configurar las funciones correspondientes a cada una
Alarm.alarmRepeat(20, 26, 0, aperturaelectrovalvula);
Alarm.alarmRepeat(21, 59, 0, aperturaelectrovalvula);
}
void loop() {
Serial.println("");
// Mostrar el reloj en el monitor serial
Serial.print("Hora: ");
digitalClockDisplay();
// Mostrar el reloj en el LCD2004
LCD1602ClockDisplay();
// función map para ver porcentajes de humedad suelo en vez de un valor
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
int humedad = analogRead(sensorPin);
// Imprimimos por pantalla los valores de humedad y su porcentaje
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad);
// Imprimimos en pantalla si se está regando o no.
Serial.println("Regando: NO");
Serial.println("");
// llamamos a la función humedadporcentaje, pasándole el valorHumedad en porcentaje, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
humedadPorcentaje(valorHumedad);
// llamamos a la función humedadValor, pasándole la humedad, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
humedadValor(humedad);
// Esperar 1 segundo y procesar las Alarmas mientras tanto...
// El metodo Alarm.delay() procesa en el fondo las alarmas y llamara a las funciones indicadas
Alarm.delay(1000);
lcd.setCursor(0,0);
lcd.write("Hora:");
lcd.setCursor(0,1);
lcd.write("Regando: ");
lcd.setCursor(0,2);
lcd.write("Humedad: ");
lcd.setCursor(9,2);
lcd.print(humedad);
digitalWrite(relePin, HIGH);
lcd.setCursor(9,1);
lcd.write("NO");
}
void aperturaelectrovalvula(){
while(int humedad = analogRead(sensorPin) > 500)
{
// llamamos a la función humedadporcentaje, pasándole el valorHumedad en porcentaje, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
// Cogemos la información del sensor de humedad por segunda vez.
int humedad2 = analogRead(sensorPin);
// Mostrar el reloj en el monitor serial
Serial.print("Hora: ");
digitalClockDisplay();
// Imprimimos por pantalla los valores de humedad y su porcentaje tanto en LCD como en Serial Monitor.
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad2);
lcd.setCursor(9,2);
lcd.print(humedad2);
// Ponemos el relé en LOW por lo que se abrirá la electroválvula.
digitalWrite(relePin, LOW);
// Imprimimos en el LCD la palabra SI donde pone regando: y antes ponía NO.
lcd.setCursor(9,1);
lcd.write("SI");
// Imprimimos en pantalla si se está regando o no.
Serial.println("Regando: SI");
Serial.println("");
// Mostrar el reloj en el LCD2004
LCD1602ClockDisplay();
// llamamos a la función humedadValor, pasándole la humedad, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
humedadValor(humedad2);
// llamamos a la función humedadporcentaje, pasándole el valorHumedad en porcentaje, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
humedadPorcentaje(valorHumedad);
delay(1000);
}
}
/**
Funciones para la impresion del reloj al monitor serial de arduino
*/
void digitalClockDisplay() {
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void LCD1602ClockDisplay(){
lcd.setCursor(6,0);
printDigitsLCDHora(hour() );
lcd.setCursor(8,0);
lcd.print(':');
lcd.setCursor(9,0);
printDigitsLCD(minute());;
lcd.setCursor(11,0);
lcd.print(':');
lcd.setCursor(12,0);
printDigitsLCD(second());
}
// Si los minutos o segundos son inferiores a 10, pone un cero a la izquierda en la pantalla del Monitor Serie.
void printDigits(int digits) {
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}
// Si los minutos o segundos son inferiores a 10, pone un cero a la izquierda en la pantalla LCD.
void printDigitsLCD(int digits) {
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
// Si la hora es inferior a 10, pone un cero a la izquierda en la pantalla LCD
void printDigitsLCDHora(int digits) {
if (digits < 10)
lcd.print(' ');
lcd.print(digits);
}
// Si el porcentaje de humedad es inferior a 10, movemos los caracteres para que no se quede el último visualizado en pantalla y parezca un dato incorrecto.
void humedadPorcentaje(int valorHumedad){
if (valorHumedad < 10){
lcd.setCursor(15,2);
lcd.print(' ');
lcd.setCursor(16,2);
lcd.print(valorHumedad);
lcd.setCursor(17,2);
lcd.print('%');
}else{
lcd.setCursor(15,2);
lcd.print(valorHumedad);
lcd.setCursor(17,2);
lcd.print('%');
}
}
// Si el valor numérico del sensor de humedad es inferior a 1000, ajusta los caractéres para una correcta visualización en el display LCD
void humedadValor(int humedad){
if(humedad < 1000){
lcd.setCursor(12,2);
lcd.print(' ');
}
}
Muchas gracias!