Siguiendo con Arduino y el LCD, este ejemplo es algo más practico que los que hemos visto hasta ahora. Se trata de un reloj, un reloj simple, pero un reloj al fin y al cabo.
Esta programado de tal manera que no sea necesario un modulo RTC DS1307.
En realidad es un reloj que solo funciona mientras Arduino esta enchufado, en el momento que deje de recibir corriente, el reloj volverá a estar a cero. Puede no parecer muy practico, pero va muy bien para practicar con variables, el "if", y diferentes operadores.
También le pondremos un par de pulsadores para poder ponerlo en hora, uno para los minutos y otro para las horas.
También se le puede añadir una alarma por ejemplo o que ponga la fecha, pero eso os lo dejo a vuestra imaginación.
El LCD lo conectaremos como en los ejemplos anteriores, y los pulsadores en modo pul.up en los pines 6 y 7
Aquí os dejo el código, y un vídeo de como funciona
#include "LiquidCrystal.h"
// Configuramos los pines 12=RS 11=E 5,4,3,2=pines de control
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int pulsador1=6; //Cargamos un 6 "pulsador1"
int pulsador2=7; //Cargamos un 7 "pulsador2"
int u_hora=0; //Cargamos un 0 "u_hora"
int u_minuto=0; //Cargamos un 0 "u_minuto"
int u_segundo=0; //Cargamos un 0 "u_segundo"
int d_hora=0; //Cargamos un 0 "d_hora"
int d_minuto=0; //Cargamos un 0 "d_minuto"
int d_segundo=0; //Cargamos un 0 "d_segundo"
unsigned long timer1=0;
unsigned long timer2=0;
void setup (){
pinMode(pulsador1,INPUT); // El pulsador 1 en pin 6 es una entrada
pinMode(pulsador2,INPUT); // El pulsador 2 en pin 7 es una entrada
lcd.begin(16, 2); // Número de filas y de columnas en LCD
lcd.clear();
}
void loop(){ // Loop programa principal
un_seg(); // Subrutina un_seg
contador(); // Subrutina contador
escribe_hora(); // Subrutina escribe_hora
set_hora(); // Subrutina set_hora
}
void un_seg(){ // Rutina para cada segundo
timer2=(millis()/1000);
if ( timer1 != timer2 ) {
timer1=timer2;
u_segundo++; // se incrementa cada segundo
}
}
void contador(){ // Rutina para el reloj
if ( u_segundo == 10 ) {
u_segundo =0;
d_segundo++;}
if ( ( d_segundo == 6 ) && ( u_segundo == 0 ) ) {
d_segundo =0;
u_minuto++;}
// Rutina de minutos
if ( u_minuto == 10 ) {
u_minuto =0;
d_minuto++; }
if ( ( d_minuto == 6 ) && ( u_minuto == 0 ) ) {
d_minuto =0;
u_hora++;}
// Rutina de horas
if ( u_hora == 10 ) {
u_hora =0;
d_hora++; }
if ( (d_hora == 2) && (u_hora == 4) ) {
u_hora =0;
d_hora =0; }
}
void escribe_hora(){ //Rutina para escribir la hora en el LCD
lcd.setCursor(1,0); // Cursor en posición 2 linea 1 (0)
lcd.print("Reloj Arduino"); //Escribe el texto entre comillas
lcd.setCursor(3, 1); // Cursor en posición 4 línea 2 (1)
lcd.print(d_hora); // Muestra la variable d_hora
lcd.print(u_hora); // Muestra la variable u_hora
lcd.print(":"); // Escribe el texto entre comillas
lcd.print(d_minuto); // Muestra la variable d_minuto
lcd.print(u_minuto); // Muestra la variable u_minuto
lcd.print(":"); // Escribe el texto entre comillas
lcd.print(d_segundo); // Muestra la variable d_segundo
lcd.print(u_segundo); // Muestra la variable u_segundo
}
void set_hora(){ //Rutina para poner el reloj en hora
if(digitalRead(pulsador2)==LOW){ // Si presionas el pulsador2
u_minuto++; // Incrementa la variable "u_minuto" 1 unidad
delay (250); // Pausa antirebote
}
if(digitalRead(pulsador1)==LOW){ // Si presionas el pulsador1
u_hora++; // Incrementa la variable "u_hora" 1 unidad
delay(250); // Pausa antirebote
}
}
Y aquí el vídeo de como funciona:
Parte de la información la he encontrado en la web fritzing.org
Espero que les guste!!!
Saludos!!!
Si se utiliza un display LCD 1602D de 16x2 hay que
ResponderEliminaralimentar el terminal 16(K) y el terminal 15(A) a la
alimentación (-)y (+)respectivamente
y el terminal 3 (V0)conectalo el punto medio de un
potenciometro de 10 K, los extremos de los terminales
van a (-)y (+) del módulo Arduino.
En la linea 1 tuve que cargar la librería
#include
de lo contrario daba un error en la compliación.
Buenas Colegio 28, Como bien dices los terminales 16K y 15A son la alimentación de la iluminación de la pantalla(Cátodo y ánodo respectivamente)y además de conectarlos a - y + se le tiene que añadir una resistencia de 220/330 ohm. El terminal 3 corresponde a el contraste de la pantalla. Tienes más información sobre estas conexiones en esta entrada de este mismo blog: Arduino: El LCD 16x2
EliminarSi da ese error si copias y pegas el sketch por que al poner el código me hace eso y no me deja ponerlo bien, si te has fijado la ultima linea tampoco esta bien. He puesto un enlace al programa para que se pueda descargar y no de estos errores. Un Saludo y gracias por visitar Infotronikblog.com
Magnifica la noticia, voy a hacerla.
EliminarGracias.
Genial el tutorial, lo malo es que se desprograma al apagar arduino... pero es muy didactico. ¿Se podría hacer también una alarma como esta pero sin el RTC?:
ResponderEliminarhttp://www.tuelectronica.es/tutoriales/arduino/reloj-alarma-con-arduino.html o
seria muy interesante
Saludos.
Buenas FjRamirez, claro que se puede, habría que incluir otro menú para configurarlo pero para que "salte" la alarma solo habría que dar un sentencia if, if (horaAlarma==hora)&& (minutoAlarma==minuto)... Algo asi, no lo incluí en el programa porque no me hacía falta, pero haré una actualización más adelante, Saludos!!!
EliminarBuenas, me gustaria saber como usar ese codigo con el adaptador I2C.
ResponderEliminarComo podria hacerlo con un displey de 4 digitos 7 segmentos multiplexado?
ResponderEliminarBuenas, pues no he trabajado con display de ese tipo, siento no poder ayudarte, Saludos!.
EliminarNO PUEDO SABER POR QUE LOS MINUTOS PASAN VOLANDO COMO LOS SEGUNDOS ALGUIEN PODRA AYUDARME GRACIAS
ResponderEliminarme pasa lo mismo
Eliminarasta abajo en las ultimas lineas dice dealy borra eso y ponle un delay mas grande que tu creas que esta bien
EliminarLine 92 y 96 debes cambiar el estadod e los pulsadores por HIGH en lugar de LOW ya que por la configuracion del circuito, si no la haces completa y solo el display, arduino esperara esta entrada en bajo
Eliminar// Hola muy feliz día
ResponderEliminar// envió el código con la pantalla I2C
// Espero que sea de ayuda apague la configuración manual para que Dan pueda resolver el problema
/////////////////////////////////////////////////////////////////////////////////////////////////////////LCD
#include
#include
LiquidCrystal_I2C lcd(0x3F,16,4); // I2C
/////////////////////////////////////////////////////////////////////////////////
byte PINarriba=10;
byte PINabajo=9;
int u_hora=0; //Cargamos un 0 en la variable "u_hora"
int u_minuto=0; //Cargamos un 0 en la variable "u_minuto"
int u_segundo=0; //Cargamos un 0 en la variable "u_segundo"
int d_hora=0; //Cargamos un 0 en la variable "d_hora"
int d_minuto=0; //Cargamos un 0 en la variable "d_minuto"
int d_segundo=0; //Cargamos un 0 en la variable "d_segundo"
unsigned long timer1=0;
unsigned long timer2=0;
void setup (){
pinMode(PINarriba,INPUT); //El pulsador 1 en el pin 6 es un pin de entrada
pinMode(PINabajo,INPUT); //El pulsador 2 en el pin 7 es un pin de entrada
lcd.begin(20, 4);
lcd.init(); // initialize the lcd
lcd.backlight();
lcd.setBacklight(HIGH);
lcd.home();
lcd.clear();
}
void loop(){ //Programa principal
un_seg (); //Va a la rutina un_seg
contador(); //Va a la rutina contador
escribe_hora(); //Va a la rutina escribe_hora
//set_hora(); //Va a la rutina set_hora
}
void un_seg(){ //Rutina para cada segundo
timer2=millis();
if ( timer2 > (1000+timer1)) {
timer1=timer2;
u_segundo++; // unidades de segundo se incrementa cada segundo
}
}
void contador(){ // Rutina para el reloj
if ( u_segundo == 10 ) {
u_segundo =0;
d_segundo++;}
if ( ( d_segundo == 6 ) && ( u_segundo == 0 ) ) {
d_segundo =0;
u_minuto++;
lcd.clear();
}
// Rutina de minutos
if ( u_minuto == 10 ) {
u_minuto =0;
d_minuto++; }
if ( ( d_minuto == 6 ) && ( u_minuto == 0 ) ) {
d_minuto =0;
u_hora++;}
// Rutina de horas
if ( u_hora == 10 ) {
u_hora =0;
d_hora++; }
if ( (d_hora == 2) && (u_hora == 4) ) {
u_hora =0;
d_hora =0; }
}
void escribe_hora(){ //Rutina para escribir la hora en el LCD
lcd.setCursor(1,0); //Situa el cursor en la segunda posición de la primera línea
lcd.print("Reloj Arduino"); //Escribe el texto entre comillas
lcd.setCursor(3, 1); //Situa el cursor en la cuarta posición de la segunda línea
lcd.print(d_hora); //Escribe la cantidad almacenada en la variable d_hora
lcd.print(u_hora); //Escribe la cantidad almacenada en la variable u_hora
lcd.print(":"); //Escribe el texto entre comillas
lcd.print(d_minuto); //Escribe la cantidad almacenada en la variable d_minuto
lcd.print(u_minuto); //Escribe la cantidad almacenada en la variable u_minuto
lcd.print(":"); //Escribe el texto entre comillas
lcd.print(d_segundo); //Escribe la cantidad almacenada en la variable d_segundo
lcd.print(u_segundo); //Escribe la cantidad almacenada en la variable u_segundo
}
void set_hora(){ //Rutina para poner el reloj en hora
if(digitalRead(PINarriba)==LOW){ //Si el presionas el pulsador2
u_minuto++; //Incrementa la variable "u_minuto" 1 unidad
delay (250); //Pausa antirebote
}
if(digitalRead(PINabajo)==LOW){ //Si el presionas el pulsador1
u_hora++; //Incrementa la variable "u_hora" 1 unidad
delay(250); //Pausa antirebote
}
}
hola por alguna razon no me anda al pulsador, que puede ser?
EliminarSeteá en "set_hora" los pulsadores en "HIGH"
EliminarGracias por el aporte profesor Rafael-Telles!!!
ResponderEliminartienes la simulacion en virtualbreadboard??
EliminarBuenas tardes, basicamente quisiera saber si alguno aqui tiene o me puede decir donde puedo conseguir un circuito con arduino sin rtc que me active tres salidas por intervalos, tengo un compresor de aire con tres motores, quiero que solo enciendan 2 por intervalos, es decir, cuando baje la presion debejo de cierto nivel que se va a medir con un presostato mecanico normal dicha señal entrara por un pin del arduino, se activen por ejemplo el motor 1 y 2, pasada media hora de trabajo continuo, se active el 2 y 3, luego de media hora, pasa el 1 y 3, y asi suscesivamente, es para que siempre este un motor descansando.
ResponderEliminar