Hola y buenas, hace tiempo que estoy intentando hacer algo que alomejor les parecerá simple, pero me estoy empezando a liar mucho con la parte de la barra de progreso.
Ahora es explico lo de la barra de progreso y en que consiste todo.
En primer lugar contaros que lo que quiero hacer es lo siguiente:
Tengo una LCD y 5 pulsadores en la protoboard y el arduino ya conectados (los pines se ven en el codigo)
Una vez iniciado se muestra un mensage inicial y tras esto se pone una pantalla para configurar el tiempo
este tiempo se controla mediante 4 de los 5 botones: 2 para subir y bajar de 5 segundos en 5 segundos y los otros dos para subir y bajar un minuto, todo con su correspondiente control para que no meta numeros negativos, que cuando llegue a 55 seg +5 se sume un minuto, etc... Hasta aqui todo funciona perfectamente
Una vez configurado el tiempo con el ultimo boton mi intencion final es que se muestre una barra de progreso en funcion del tiempo seleccionado, con lo que haciendo una serie de calculos mi idea era poner un timer cada 62,5ms con lo que para todas las posibles combinaciones de tiempo introducidas por el usuario, me diera un numero entero de ticks en el timer con los que poder ir dibujando las barritas en el lcd.
Bueno, configurando las interrupciones y haciendo pruebas queria simplemente que cuando le diera al quinto boton comenzara a contar el timer a un ciclo de tiempo lento y que se me parase y volviera a la seleccion de tiempo al llegar a un numero de ticks X (en el ejemplo del codigo mostrado es 21). Pues bueno, esto no me sale, usando el cli(); el timer sigue contando y no vuelve a nada... he probado mil cosas y no se que hacer.
Os dejo el código a ver si podeis ayudarme, lo agradeceria mucho!!
un saludo
Código:
//------------------------------------------------------------------------
/*
* Codigo de control para insoladora con lcd y programacion de tiempo
* Autor: Gabriel Garcia Garrido
* Fecha: Noviembre 2015
*/
//------------------------------------------------------------------------
// (Conexiones)
/*
* RS: pin 7
* EN: pin 8
* D4: pin 9
* D5: pin 10
* D6: pin 11
* D7: pin 12
*/
//incluir la libreria LiquidCrystal
#include <LiquidCrystal.h>
#include <avr/io.h>
#include <avr/interrupt.h>
LiquidCrystal lcd(7,8,9,10,11,12);
//Creacion de los caracteres para la cuenta atras
byte p20[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
byte p40[8] = {
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
};
byte p60[8] = {
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
};
byte p80[8] = {
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
};
byte p100[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
int SegProg=0;
int MinProg=0;
int SegProgAnt=0;
int MinProgAnt=0;
int estadoactual=0;
int estadoanterior=0;
int estadoactual1=0;
int estadoanterior1=0;
int estadoactual2=0;
int estadoanterior2=0;
int estadoactual3=0;
int estadoanterior3=0;
int estadoactual4=0;
int estadoanterior4=0;
int pulsador1=3;
int pulsador2=4;
int pulsador3=5;
int pulsador4=6;
int pulsador5=13;
int ticks=0;
void setup(){
Serial.begin(9600);
pinMode(pulsador1,INPUT);
pinMode(pulsador2,INPUT);
pinMode(pulsador3,INPUT);
pinMode(pulsador4,INPUT);
pinMode(pulsador5,INPUT);
lcd.begin(16,2);
MostrarMensageInicio();
InterruptConfig();
ImpIniSet();
}
void loop(){
SeleccionDeTiempo();
ImprSetTime();
estadoactual4=digitalRead(pulsador5);
if(estadoanterior4==LOW && estadoactual4==HIGH){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
sei();
}
if(estadoanterior==HIGH && estadoactual==LOW){
estadoanterior=estadoactual;
}
}
void MostrarMensageInicio(){
lcd.setCursor(0,0);
lcd.print(" Firmware v1.0 ");
lcd.setCursor(0,1);
lcd.print(" Starting up ");
delay(3000);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
}
//-----------------------------funcion de configuracion de tiempo------------------------
void SeleccionDeTiempo(){
//lectura del flanco del pulsador de seg ascendente
estadoactual=digitalRead(pulsador1);
if(estadoanterior==LOW && estadoactual==HIGH){
SegProg=SegProg+5;
if(SegProg==60){
SegProg=0;
MinProg+=1;
}
lcd.print(" ");
estadoanterior=estadoactual;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior==HIGH && estadoactual==LOW){
estadoanterior=estadoactual;
}
//lectura del flanco del pulsador de seg descendente
estadoactual1=digitalRead(pulsador2);
if(estadoanterior1==LOW && estadoactual1==HIGH){
SegProg-=5;
if(SegProg==-5){
if(MinProg==0){
SegProg=0;
MinProg=0;
}
else{
SegProg=55;
MinProg-=1;
}
}
lcd.print(" ");
estadoanterior1=estadoactual1;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior1==HIGH && estadoactual1==LOW){
estadoanterior1=estadoactual1;
}
//lectura del flanco del pulsador de min ascendente
estadoactual2=digitalRead(pulsador3);
if(estadoanterior2==LOW && estadoactual2==HIGH){
MinProg+=1;
lcd.print(" ");
estadoanterior2=estadoactual2;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior2==HIGH && estadoactual2==LOW){
estadoanterior2=estadoactual2;
}
//lectura del flanco del pulsador de min descendente
estadoactual3=digitalRead(pulsador4);
if(estadoanterior3==LOW && estadoactual3==HIGH){
MinProg-=1;
lcd.print(" ");
estadoanterior3=estadoactual3;
Serial.print(MinProg);
Serial.print(SegProg);
}
if(estadoanterior3==HIGH && estadoactual3==LOW){
estadoanterior3=estadoactual3;
}
// Imposicion para tiempos negativos o mayor de 100
if (SegProg<0)
{
SegProg =0;
}
if (MinProg<0)
{
MinProg =0;
}
if(MinProg>99){
MinProg=99;
}
}
//-------------------- -Instrucciones de LCD- ----------------------------------
void ImpIniSet(){
lcd.setCursor(0,0);
lcd.print(" Set Time: ");
lcd.setCursor(0,1);
lcd.print(" 00:00 ");
}
void ImprSetTime(){
if(MinProg!=MinProgAnt || SegProg!=SegProgAnt){
lcd.setCursor(0,0);
lcd.print(" Set Time: ");
lcd.setCursor(5,1);
if(MinProg<10){
lcd.print("0");
lcd.print(MinProg);
if(SegProg<10){
lcd.print(":0");
lcd.print(SegProg);
}
else{
lcd.print(":");
lcd.print(SegProg);
}
}
else{
lcd.print(MinProg);
if(SegProg<10){
lcd.print(":0");
lcd.print(SegProg);
}
else{
lcd.print(":");
lcd.print(SegProg);
}
}
MinProgAnt=MinProg;
SegProgAnt=SegProg;
}
}
//-------------------- -Instrucciones de interrupciones- -----------------------
void InterruptConfig(){
cli();
TCCR1A=0;
TCCR1B=0;
// para lo s 62,5 ms OCR1A=975;
OCR1A=15675;
TCCR1B |= (1<<WGM12);
TCCR1B |= (1<<CS10);
TCCR1B |= (1<<CS12);
TIMSK1=(1<<OCIE1A);
}
ISR(TIMER1_COMPA_vect){
ticks++;
Serial.print(ticks);
if(ticks==21){
ticks=0;
cli();
}
}