¿Qué le pasa a mi programación arduino?

Hice este reloj/termómetro en mi Arduino Uno.

Soy novato y lo hice con algo de ayuda. Pero me sale muy extraña la hora. ¿Podríais corregirme el código? 16:0903:19 * Los dos primeros dígitos pasan como segundos, los siguientes como decimales y los últimos como segundos de nuevo.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int analogico_A0 = A0;
int pulsador_minutos = 13;
int pin_pwm = 9;
int valor_cc = 40;
int u_segundos; 
int d_segundos; 
int u_minutos; 
int d_minutos; 
int u_horas; 
int d_horas; 
int u_minutos_alarma; 
int d_minutos_alarma; 
int u_horas_alarma; 
int d_horas_alarma; 
int p_minutos;
float temperatura; 
unsigned long timer1;
unsigned long timer2;
void setup() {
  lcd.begin(16,2);
  lcd.clear();
  pinMode( pulsador_minutos, INPUT);
  pinMode( pin_pwm, OUTPUT);
    u_segundos=0; 
    d_segundos=0; 
    u_minutos=0; 
    d_minutos=0; 
    u_horas=0; 
    d_horas=0; 
    u_minutos_alarma=0; 
    d_minutos_alarma=0; 
    u_horas_alarma=0; 
    d_horas_alarma=0; 
    timer1=0;
    timer2=0;
    temperatura=0;
    analogWrite(pin_pwm,valor_cc);  
}
void loop() {
    unsegundo();
    puestaenhora();
    contadorhoras();
    lcdhoras();
    if ( u_segundos == 0 ) {
        //lcd.clear();
        sensorlm35();
        lcdtemperatura();
    } 
}
void unsegundo() {
    timer2=(millis()/1000);
    if ( timer1 != timer2 ) {
        timer1=timer2;
        u_segundos++;
    }
}
void puestaenhora() {
    p_minutos=digitalRead(pulsador_minutos);
    if ( p_minutos == HIGH ){
        u_minutos++;
        delay(50);
    }
}
void contadorhoras() {
    if ( u_segundos == 10 ) {
        u_segundos =0;
        d_segundos++;
    }
    if ( ( d_segundos == 6 ) && ( u_segundos == 0 ) ) {
        d_segundos =0;
        u_minutos++;
    }
    if ( u_minutos == 10 ) {
        u_minutos =0;
        d_minutos++;
    }
    if ( ( d_minutos == 6 ) && ( u_minutos == 0 ) ) {
        d_minutos =0; 
        u_horas++;
    }
    if ( u_horas == 10 ) {
        u_horas =0;
        d_horas++;
    }
    if ( (d_horas == 2) &&  (u_horas == 4) ) {
        u_horas =0; 
        d_horas =0;
    }
}
void lcdhoras() {
 lcd.setCursor(4,0);
 lcd.print(d_horas);
 lcd.print(u_horas);
 lcd.print(":");
 lcd.print(d_minutos);
 lcd.print(u_minutos);
 lcd.print(":");
 lcd.print(d_segundos);
 lcd.print(u_segundos);
}
void sensorlm35() {
    temperatura = analogRead(analogico_A0);
    temperatura = temperatura * 0.488;
}
void lcdtemperatura() {
 lcd.setCursor(1,1);
 lcd.print(temperatura);
 lcd.print(" grados C");
}

1 Respuesta

Respuesta
2

Por un lado, lo primero que haría es comentar la parte de la temperatura para asegurarte de que no está escribiendo nada adicional en el LCD.

Por otro lado, y más importante, simplificaría el código para obtener los datos a mostrar en pantalla, usando un solo timer en segundos y aprovechando el operador / para hacer la división entera sobre el valor de los segundos y así obtener de un solo timer todos los valores de horas, minutos y segundos. Además, compongo la cadena y luego la paso al final toda al LCD, creo que es más claro. Aquí el código (no lo he probado, pero compila bien):

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int analogico_A0 = A0;
int pulsador_minutos = 13;
int pin_pwm = 9;
int valor_cc = 40;   
float temperatura; 
unsigned long timer;
void setup() {
  lcd.begin(16,2);
  lcd.clear();
  pinMode( pulsador_minutos, INPUT);
  pinMode( pin_pwm, OUTPUT);
  timer=0;
  temperatura=0;
  analogWrite(pin_pwm,valor_cc);  
}
void loop() {
  unsegundo();
  puestaenhora();
  lcdhoras();
  if ( timer % 60 == 0 ) {  
    //lcd.clear();
    //sensorlm35();
    //lcdtemperatura();  
  } 
}
void unsegundo() {
  timer=(millis()/1000);
} 
void puestaenhora() {
  int p_minutos=digitalRead(pulsador_minutos);
  if ( p_minutos == HIGH ){ 
    timer = timer + 60; 
    delay(50);  
  }
}
void lcdhoras() {
  String texto = "";
  unsigned long tiempo = timer;
  int horas = tiempo / 3600;
  tiempo = tiempo - horas * 3600;
  int minutos = tiempo / 60;
  tiempo = tiempo - minutos * 60;
  int segundos = tiempo;
  if (horas < 10) {
    texto = texto + "0";
  }
  texto = texto + horas + ":";
  if (minutos < 10) {
    texto = texto + "0";
  }
  texto = texto + minutos + ":";
  if (segundos < 10) {
    texto = texto + "0";
  }
  texto = texto + segundos;
  lcd.setCursor(4,0);
  lcd.print(texto);
}
void sensorlm35() {
  temperatura = analogRead(analogico_A0);
  temperatura = temperatura * 0.488;    
} 
void lcdtemperatura() {
  lcd.setCursor(1,1);
  lcd.print(temperatura);
  lcd.print(" grados C");
}

Prueba a ver (he comendado la parte de temperatura).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas