lainez

:slight_smile: Hola, estoy trabajando en un programa aparentemente sencillo y necesitaba un poco de ayuda :
Trabajo con una placa arduino mega, es programa funciona asi: un sensor ultrasonico conectado a la placa, una lcd 16x2 y un rele. la idea es un temporizador que se muestra en tiempo real en el lcd, cuando el temporizador se acaba se ejecuta un metodo con un nuevo temporizador para volver a hacer la lectura con el sensor, si el sensor no detecta nada el temporizador termina, el rele se activa y cortamos paso de corriente.
funciona bien, el simple… o no tan simple detalle es que muestro minutos y segundos, estos valores los almacene en un sola variable, pero cuando los segundos pasan a ser menor que 10, el 9 se posiciona a la izquierda y se deja ver como 90,80,70,60,50,40,30,20,10. hice una version diferente almacenando los valores en variables diferentes pero salio igual… aqui dejo el codigo espero me puedan ayudar.

#include <LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

#define trigPin 10 // definiendo una constante llamada trigPin para el pin 10 de la placa
#define echoPin 12 // igual definicion
#define ledPin 13 //…
int segundos, minutos, count = 0; // variables para el calculo del temporizador
long duration; // variables para el calculo del sensor
float distance; //…

void setup() { // espacio de nombre, aqui se declaran las variables que necesitemos,de tipo pin, ETC. correspondientes a la protoboard

Serial.begin (9600); // abrimos el canal para que se pueda realizar la transmision por el. es un dato imprescindible
lcd. begin(16,2); // definimos la cantidad de caracteres y las filas del lcd, conociendo sus especificaciones tecnicas

pinMode(trigPin, OUTPUT); // definimos el pin trig en modo de salida
pinMode(echoPin, INPUT); // pin echo modo entrada
pinMode(ledPin,OUTPUT); // pin led modo salida
}

void loop() { // viene a ser el constructor por defecto, se ejecuta n veces
digitalWrite(trigPin, LOW);
delayMicroseconds(3);
digitalWrite(trigPin, HIGH); // definiendo el pin en alto (activamos la señal binaria)
delayMicroseconds(10); // esta directiva es opcional, un retardo despreciable
digitalWrite(trigPin, LOW); // En esta redundancia simulamos un reinicio del sketch…

duration = pulseIn(echoPin, HIGH); // al activar el pin de echo automaticamente enviamos la rafaga
distance = (duration/2)/29.1; // calculamos
digitalWrite(ledPin,HIGH); // activamos el rele, en su funcionamiento, cortando el paso de voltaje
if (distance >= 200 || distance <= 0) {
lcd.clear();

}
else{
int secondstotal = 0;
lcd.setCursor(0,0);
lcd.print(“Distancia:”);
lcd.setCursor(11,0);
lcd.print(distance);
digitalWrite(ledPin,LOW); // este pin corresponde al rele
minutos = 1; segundos = 15;

secondstotal = segundos + (minutos * 60);
while( secondstotal > 0) {
secondstotal–;
delay(1000);
minutos = (secondstotal/ 60) % 60;
segundos = secondstotal%60;
if(minutos > 0) { if( segundos == 1 ) { secondstotal -= 1; } }

String(count) = String(minutos) + “:” + String(segundos);
lcd.setCursor(1,1);
lcd.print(“Restante:”);
lcd.setCursor(11,1);
lcd.print(count);

}
}
calculo();
}

void calculo() { // este metodo se ejecutara las n veces que se detecte movimiento
lcd.clear();
int aux = 10;
while(aux > 0 ) {
aux–; delay(1000);
int timer = aux%60;
digitalWrite(trigPin, LOW);
delayMicroseconds(3);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);
distance = (duration/2)/29.1;
if (distance >= 200 || distance <= 0){

}
else{
int secondstotal = 0;
lcd.setCursor(0,0);
lcd.print(“Distancia:”);
lcd.setCursor(11,0);
lcd.print(distance);
digitalWrite(ledPin,LOW);
minutos = 1; segundos = 15;

secondstotal = segundos + (minutos * 60);
while( secondstotal > 0) {
secondstotal–;
delay(1000);
minutos = (secondstotal/ 60) % 60;
segundos = secondstotal%60;
if(minutos > 0) { if( segundos == 1 ) { secondstotal -= 1; } }

String(count) = String(minutos) + “:” + String(segundos);
lcd.setCursor(1,1);
lcd.print(“Restante:”);
lcd.setCursor(11,1);
lcd.print(count);

}
calculo();
}
lcd.setCursor(4,0);
lcd.print(“Sleep In:”);
lcd.setCursor(7,1);
lcd.print(timer);
}

digitalWrite(ledPin,HIGH);
lcd.clear();

}

usa esta funcion

char buffer[20];       // la defines como global o como local 

sprintf(buffer, "%02d:%02d", minutos, segundos);
lcd.print(buffer);

en lugar de

if(minutos > 0) { if( segundos == 1 ) { secondstotal -= 1; } }
     String(count) =  String(minutos) + ":" + String(segundos); 
  lcd.setCursor(1,1);
  lcd.print("Restante:");
  lcd.setCursor(11,1);
  lcd.print(count);

usas

if (minutos > 0) { 
   if (segundos == 1 ) { 
      secondstotal -= 1; 
   } 
 }
 lcd.setCursor(1,1);
 sprintf(buffer, "Restante %02d:%02d", minutos, segundos);
lcd.print(buffer);