Bueno esto es un problema de programación, mas que del hardware de arduino, pero aunque resulte una tonteria llevo ya bastante tiempo liado. Estoy montando un temporizador para una insoladora casera. En principio ira con una pantalla lcd, un par de botones de control para seleccionar tiempos etc. De momento solo he implementado la parte del contador de tiempo y es ahi donde tengo dificultades, me gustaría añadir "ceros a la izquierda" porque por ejemplo como vereis en el "cutre-código" que adjunto al poner por ejemplo 5 minutos de temporización, cuando se encuentra en 4:11, 4:10, 4:9, 4:8, los segundos de un solo dígito pues eso los muestra con un solo dígito y querría que fuera algo como 4:09, 4:08 etc.
int ledPin = 13; //pin led
int minutos = 5; //variable de minutos
int segundos = 0; //variable almacena conversion en segundos
int minLcd = 0; //variable visualizacion en pantalla minutos
long int segLcd = 0; //variable visualizacion en pantalla segundos
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
segundos = (minutos * 60); //paso de minutos a segundos
}
void loop() {
while (segundos > 0) { //itera con el led encendido hasta que se agota el tiempo
digitalWrite (ledPin, HIGH);
delay (1000);
segundos--;
minLcd = segundos / 60; //conversion del tiempo para debug minutos
segLcd = segundos % 60; //conversion del tiempo para debug segundos
/*Debug*/
Serial.print(minLcd);
Serial.print(":");
Serial.print(segLcd);
Serial.println();
}
digitalWrite (ledPin, LOW); //led off al final del timer
}
si (segLCD <10)
{
Serial.print (0);
Serial.print(segLCD);
}else{
Serial.print(segLCD);
}
Si quieres más elaborado, puedes buscar funciones que te permiten dar formato al número, por ejemplo, sprintf.
Arduino por detrás tiene la librecia libc de C.avr-libc: <stdio.h>: Standard IO facilities
Muchisimas gracias Igor, era justamente lo que estaba buscando, lo estaba implementando a estas horas en una pantalla lcd de 16x2 y la solucion que le había dado era directamente según que casos incluirle de forma estática 0's en posiciones concretas, pero no cabe duda que lo que me has comentado es mucho mas eficiente.
Y Cristal probe el (..., DEC) y seguía igual, pero aun así gracias por el aporte cualquier cosa siempre es bienvenida cuando uno se encuentra atascado.
Es el mismo programa, pero he incluido el LCD con la mejora de los ceros junto a que puedes incluir horas:
Esta listo para utilizar con el "LCD Keypad Shield".
// Inicializacion Dispositivos
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte lcdNumCols = 16; // -- numero de columnas en el LCD
// Fin Inicializacion Dispositivos
int ledPin = 13; //pin led
int horas = 1; //variable de horas
int minutos = 0; //variable de minutos
int segundos = 10; //variable de segundos
int horLcd = 0; //variable visualizacion en pantalla horas
int minLcd = 0; //variable visualizacion en pantalla minutos
int segLcd = 0; //variable visualizacion en pantalla segundos
String horT;
String minT;
String segT;
void setup()
{
pinMode(ledPin, OUTPUT);
lcd.begin(2, lcdNumCols); // -- dos filas y el valor lcdNumCols en columnas
lcd.clear(); // -- deja pantalla en blanco
segundos = (horas * 60 * 60) + (minutos * 60) + segundos; //paso del tiempo total a segundos
}
void loop() {
while (segundos > 0) { //led encendido hasta que se agota el tiempo
digitalWrite (ledPin, HIGH);
delay (1000);
segundos--;
horLcd = ((segundos / 60)/ 60); //conversion del tiempo para debug horas
minLcd = (segundos / 60) % 60; //conversion del tiempo para debug minutos
segLcd = segundos % 60; //conversion del tiempo para debug segundos
String horT = String(horLcd); // -- crea variables de cadena de texto utilizando
String minT = String(minLcd); // los valores numericos de hora minuto y segundos
String segT = String(segLcd);
/*Debug*/
lcd.setCursor(0, 0); // situa el inicio de escritura en columna 0 fila 0
lcd.print("Quedan:");
// añade a los valores un cero a la izquierda si son inferiores a 10
if (horLcd < 10) horT = "0" + String(horLcd);
if (minLcd < 10) minT = "0" + String(minLcd);
if (segLcd < 10) segT = "0" + String(segLcd);
lcd.setCursor(8, 0);
lcd.print( horT + ":" + minT + ":" + segT );
}
digitalWrite (ledPin, LOW); //led off al final del timer
lcd.setCursor(0,0);
lcd.print("Fin de la cuenta");
}
Como dices, ahora solo falta incluir el tiempo deseado por menu utilizando pulsadores.
Supongamos que queremos hacer una cuenta atrás de 8 horas... segundo a segundo... si utilizamos delay(1000) en realidad cada segundo que nosotros contamos es un segundo más el tiempo que tarda en ejecutarse el programa...
Mi duda es... en una cuenta atrás (o adelante) de varias horas sería significativo ese desfase o más bien despreciable?? (vamos que si el desfase en 24 horas es de medio segundo o por el contrario podría ser de varios minutos??)
Todo ello suponiendo que el programa es relativamente complejo (muchas lineas de código).
Para estos casos se usa la función millis(), con la que se conseguiría que el retraso máximo que pueda existir, independientemente del tiempo seleccionado, sea lo que cuesta actualizar la LCD.