Hola, tengo un proyecto en marcha sobre el control de luces y algunos elementos con Arduino.
Tengo el código hecho y funcional, pero como no soy experto tengo algunas dudas y problemas respecto a este proyecto.
Explico el proyecto y dejo el código al final:
El proyecto consta de un temporizador que encienda la luz X horas al día, pudiendo elegir tu la hora desde el código. También controla la luz de la pantalla LCD y una bomba de agua durante x minutos al día.
Lleva una pantalla LCD en la que se puede visualizar:
- La hora
- La fecha
- Si la luz esta en ON u OFF.
- Si la luz esta encendida a través del interruptor manual
- Si la bomba está activada
El codigo es el siguiente:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);// si no te sale usar (0x3f,16,2)||(0x20,16,2)
#include "Sodaq_DS3231.h"
char DiaSemana[][4] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
// La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga del codigo
// Ejemplo 2020 noviembre 12, 08:00:00 dia 0-Domingo (0=Dom, 1=Lun, 2=Mar, 3=Mie, 4=Jue, 5=Vie, 6=Sab)
//DateTime dt(2020, 11, 12, 18, 40, 20, 1);
int estado = 0;
void setup() {
pinMode(2,OUTPUT);
pinMode(4,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,INPUT); //boton
pinMode(5,INPUT); //boton
rtc.begin();
Wire.begin();
lcd.init();
lcd.backlight();
lcd.setCursor (0,1);
lcd.print ("iniciando");
delay(2000);
lcd.clear();
// hay que marcar como texto la linea de abajo en la segunda carga del codigo
// rtc.setDateTime(dt);
}
void loop() {
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print(DiaSemana[now.dayOfWeek()]);
lcd.print(' ');
lcd.print(now.date(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print('/');
lcd.setCursor(4,1);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
delay(1000);
lcd.clear();
int hora =now.hour();
int minuto =now.minute();
int segundo = now.second();
if(minuto >=12 && minuto <=14 ){ //añade minuto u hora en palabras para cambiar la unidad del temporizador, y cambia los numeros
digitalWrite(2,LOW); //cambia los numeros despues del = para determinar el minuto o la hora en la que quiere que actue
lcd.setCursor(0,1);
lcd.print( 'O' );
lcd.print( 'N' );
}
else {
digitalWrite(2,HIGH );
lcd.setCursor(0,1);
lcd.print('O');
lcd.print('F');
lcd.print('F');
}
//para pantalla
if(minuto >=11 && minuto <=15 ){ // la pantalla se enciende X hora antes que la luz y se apaga X hora despues
digitalWrite(4,HIGH); // para servir de reloj y calendario fulcional mientras no esté la luz encendida
// con esto evitamos que la luz de la pantalla este siempre encencida y moleste por la noche
}
else {
digitalWrite(4,LOW );
}
//para bomba de agua anti estanque
if(minuto >=11 && minuto <=15 ){ // Lleva una bomba de agua que mueve el agua del bidon de auto rellenado para evitar
digitalWrite(6,HIGH); // el estancamiento de esta. esta bomba se encenderá X minutos al dia
}
else {
digitalWrite(6,LOW );
lcd.setCursor(10,1);
lcd.print ("bomb"); // escribirá ''bomb'' en la pantalla para avisar del funcionamiento de la bomba
}
//para el boton
estado = digitalRead(7);
if(estado == HIGH) // boton para encender la pantalla manualmente en caso de necesitarlo si esta apagada
{
digitalWrite (4, HIGH);
lcd.setCursor(15,0);
lcd.print('.');
}
estado = digitalRead(5);
if(estado == HIGH) // boton para encender la luz manualmente
{
digitalWrite (2, LOW);
lcd.setCursor(12,1);
lcd.print ("M"); // muestra en la pantalla ''MANUAL''
}
}
Mi duda y problema principal es: no se como poder cambiar la hora en caso de horario verano/invierno. me gustaria poder hacerlo a través de pulsadores o algún método no muy caro sin conectarlo al pc.
He pensado en un pulsador que al mantenerlo pulsado x segundos , añada +1h y al pulsarlo otra vez reste -1h.
int hora =now.hour();
int minuto =now.minute();
int segundo = now.second();
if(minuto >=12 && minuto <=14 ){ //añade minuto u hora en palabras para cambiar la unidad del temporizador, y cambia los numeros
digitalWrite(2,LOW); //cambia los numeros despues del = para determinar el minuto o la hora en la que quiere que actue
lcd.setCursor(0,1);
lcd.print( 'O' );
lcd.print( 'N' );
}
Necesito que sea simple pero no se como cambiar esa parte del código a través de un pulsador.
Mi intención mas adelante es añadirle sensor de temperatura con control de relé y tal...
El proyecto está en un RTC DS3231, Arduino nano y pantalla lcd 2x16
Lo siento mucho si puede ser un código poco desastroso o lioso pero llevo meses contados con esto de Arduino.
Muchas gracias de antemano a quien me lea y conteste.