¡Hola estimados!
Estoy comenzando a utilizar Arduino y mi primer proyecto es hacer un programa de riego automático. Lo cierto es que soy nuevo y mucho no entiendo, pero quería ver si podían opinar del código que preparé.
La idea es dividir el riego en 2 circuitos (1 por electrovávula), y que una parte del riego se acciones 2 veces por día (si la humedad es baja) y que la otra parte del circuito riegue 1 vez por día.
Mi mayor duda es en un delay de 24hs. Quiero poner un pulsador que en caso de apretarlo, el riego no funcione por 24hs, y no se me ocurrió otra manera de hacerlo. No logré entender cómo funciona la función millis().
Los componentes que voy a usar son:
1 Arduino UNO
3 Relay (manejan 1 bomba de lavarropas y 2 electroválvulas de lavarropas)
1 led
1 LDC 16x2
1 pulsador
1 sensor de temperatura
1 sensor de humedad
1 RTC 1307
Por otro lado, al ponerle un RTC al Arduino, ¿éste deja de usar su reloj interno y pasa a sincronizarse con el RTC?
Gracias
Saludos
#include <LiquidCrystal.h>
#include "RTClib.h"
#include <Wire.h>
RTC_DS1307 rtc;
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
const int sensortemperatura=A0;
const int sensorhumedad=A1;
const int relebomba=6;
const int relevalv=7;
const int relevalv2=8;
const int led=9;
const int pulsador=10; //Pulsador que me permite cancelar el riego en caso de que llueva
DateTime hora; //defino una variable para que tome la hora del RTC
//inicializo las distintas variables
int lecttemp=0;
int lecthum=0;
float volttemp=0;
float temperatura=0;
float humedad=0;
int estadorele=0;
int rainstop=0; //inicializo el pulsador como bajo
void setup() {
//Especifico entradas y salidas
Serial.begin(9600);
delay(3000);
pinMode(sensortemperatura,INPUT);
pinMode(sensorhumedad,INPUT);
pinMode(relebomba,OUTPUT);
pinMode(relevalv,OUTPUT);
pinMode(relevalv2,OUTPUT);
pinMode(led,OUTPUT);
pinMode(pulsador,INPUT);
// wire.begin;
rtc.begin();
lcd.begin(16,2);
lcd.clear();
lcd.home();
lcd.print("Encendiendo");
delay(2000);
lcd.clear();
delay(100);
//verifico que el RTC esté conectado
if (!rtc.begin()){
lcd.print("Reloj no conectado"); //Esta parte no entiendo para qué es, pero vi en foros que es necesaria.
while(1);
}
//Pongo en hora el reloj, siempre voy a tener que reiniciar el riego a las 20hs
rtc.adjust(DateTime(2019,12,15,20,0,0));
}
void loop() {
lcd.clear();
lcd.setCursor(0,0);
DateTime hora=rtc.now(); //defino a "hora" como la hora del momento y la imprimo en la pantalla
lcd.print(hora.hour(),DEC);
lcd.setCursor(0,3);
lcd.print(":");
lcd.setCursor(0,4);
lcd.print(hora.minute(), DEC);
lcd.setCursor(0,6);
lcd.print(":");
lcd.print(hora.second(), DEC);
lcd.setCursor(0,1);
lcd.print("Humedad: ");
//tomo los valores de temperatura y humedad
lecttemp=analogRead(sensortemperatura);
volttemp=5.0/1024*lecttemp;
temperatura=volttemp*100-50;
lecthum=analogRead(sensorhumedad);
humedad=map(lecthum,0,1023,100,0); //verificar con el sensor para ver si la cuenta es la correcta
//Imprimo en la pantalla el valor de humedad
lcd.setCursor(9,1);
lcd.print(humedad);
delay(1000);
//Le indico que riegue a las 01hs durante 15 minutos
if (hora.hour()==01 && hora.minute()==00 && hora.second()<= 5){
digitalWrite(relebomba,HIGH);
digitalWrite(relevalv,HIGH);
digitalWrite(relevalv2,HIGH);
delay(1000);
}
if (hora.hour()==01 && hora.minute()==15 && hora.second()<= 59){
digitalWrite(relebomba,LOW);
digitalWrite(relevalv,LOW);
digitalWrite(relevalv2,LOW);
}
//Le indico que si la humedad es menor al 24% entre las 10 y las 15, riegue las macetas chicas conectadas a la válvula 2 durante 10 minutos
if (humedad<24 && hora.hour()>=10 && hora.hour<=19 && hora.minute()==00 && hora.second()<= 10){ //1 vez por hora revisa si la humedad es menor a 24% y en ese caso riega durante 10min, entre las 10hs y las 19hs.
digitalWrite(relevalv2,HIGH); //Luego de las 19 no quiero que siga porque a la 1am, comenzará a regar.
digitalWrite(relebomba,HIGH);
delay(600000);
digitalWrite(relevalv2,LOW);
digitalWrite(relebomba,LOW);
delay(100);
}
if (hora.hour()>=19 && hora.minute()==00 && hora.second()<= 10){
digitalWrite(relevalv2,HIGH);
digitalWrite(relebomba,HIGH);
delay(600000);
digitalWrite(relevalv2,LOW);
digitalWrite(relebomba,LOW);
delay(100);
//Le indico que si apreto el botón, no debe regar por 24hs (cierra todos los reles) y ademas prenda el LED.
//leo la posición del pulsador
rainstop=digitalRead(pulsador);
if (rainstop==HIGH){
digitalWrite(led,HIGH);
digitalWrite(relevalv2,LOW);
digitalWrite(relebomba,LOW);
digitalWrite(relevalv,LOW);
delay(86400000); //24hs de espera
digitalWrite(led,LOW); //apago el LED cuando pasan las 24hs para indicar que el Arduino volvió a funcionar
delay(100);
}
}