Hola! iré directo al grano, la idea del programa es hacer un conteo de los generos de peliculas que el usuario ha visto. Este es mi codigo. Para agregar generos a los respectivos acumuladores, hay que apretar 3 teclas, f para ficcion , t para terror y c para comedia. Mi problema es que al apretar, por ejemplo, T, para sumar UNA pelicula, debido al void loop se ejecuta infinitamente, y, a menos que yo oprima otra tecla rapidamente, seguirá aumentando peliculas a terror infinitamente, hasta que aprete M, que lo programé para que termine el ciclo y muestre los acumuladores de todos los generos.
Lo que yo quiero es que, al apretar T, se ilumine el led que puse, sume uno al acumulador, y que ahí se interrumpa el void loop, para poder apretar cualquier otra tecla, e ir sumando uno por uno, pero no se como ayuda pls, les adjunto mi codigo.
int verde = 5;
int azul = 8;
int amarillo = 3;
int rojo = 2;
int acumuladorTerror = 0;
int acumuladorComedia = 0;
int acumuladorFiccion = 0;
char letra;
boolean leoLetra=false;
void setup(){
Bienvenido();
}
void loop(){
lecturadedatos();
menu();
mostrar();
}
//CÓDIGO
void menu(){
if(letra=='t' || letra=='T'){
ledPower(amarillo,500,500);
acumuladorTerror++;
}
else if(letra=='c' || letra=='C'){
ledPower(rojo,500,500);
acumuladorComedia++;
}
else if(letra=='f' || letra=='F'){
ledPower(verde,500,500);
acumuladorFiccion++;
}
}
//MÉTODOS
void ledPower(int led, int delayhigh, int delaylow){
digitalWrite(led, HIGH);
delay(delayhigh);
digitalWrite(led, LOW);
delay(delaylow);
}
void mostrar(){
if (letra=='m' || letra=='M'){
Serial.println("Peliculas de terror:");
Serial.println(acumuladorTerror);
Serial.println("Peliculas de comedia:");
Serial.println(acumuladorComedia);
Serial.println("Peliculas de ficcion:");
Serial.println(acumuladorFiccion);
while(1);
}
}
void lecturadedatos(){
if(Serial.available()>0){
letra = Serial.read();
leoLetra=true;
}
}
void Bienvenido(){
pinMode(5,OUTPUT);
pinMode(8,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
Serial.begin(9600);
Serial.println("T para sumar pelicula a terror.");
delay(500);
Serial.println("C para sumar pelicula a comedia.");
Serial.println("F para sumar pelicula a ficcion.");
delay(500);
Serial.println("M para mostrar cuantas peliculas de cada genero has visto.");
delay(1000);
Serial.println("Las peliculas de cada genero se representan con la cantidad de veces que ilumine un led.");
}
Moderador:
Lee las normas del foro y edita lo siguiente:
1-el titulo no puede usar la palabra "Ayuda". Las explicaciones en las normas.
2-los códigos deben postearse con etiquetas.
Tu problema es que letra conserva el valor hasta que ingresas una letra nueva entonces, lógicamente, continuamente incrementa el contador correspondiente.
Lo que tienes que hacer es, luego de realizar la acción correspondiente a cada tecla, asignarle a letra un caracter que no utilices para desencadenar alguna acción, por ej. ' ' (espacio), '#', etc.
Algo así
void loop(){
lecturadedatos();
menu();
mostrar();
letra = ' ';
}
Saludos
PD: por favor haz las correcciones que te solicitó @Surbyte
Ya que recién empiezas, intenta dejar de lado el uso de delay()
Ve a Documentación y mira los tutoriales de como emplear millis() y las máquinas de estado. Haran que tu código funcione de manera mas rápida y te quitarás un lastre (delay) que siempre queda a la espera de complicar un código.
Se porque te lo digo.
El flag o bandera leoLetra te puede servir como control para tu código. Cuando terminas actuar por una letra recibida pones
leoLetra=false;
Y lo último, al final de mostrar tienes un while(1) que significa que tu código se queda ahi para siempre.
Es es un error pero ya sabrás como cambiarlo.
Hola! muchas gracias por tus consejos, tengo un par de dudas al respecto:
1.- Por que el delay() es un lastre? la verdad me acomoda mucho, afecta a la eficiencia del codigo?
2.- A que te refieres que el leoLetra sirva como CONTROL?
3.- Si, como sabia como interrumpir el codigo y el amigo de arriba me comentó lo de poner una letra distinta, ponia while(1) para que se mostraran los acumuladores y no se siguieran mostrnado infinitamente, pero ahora ya sabré como arreglarlo!
1- Si, delay() queda cómodo pero durante ese tiempo el micro no hace otra cosa entonces es ineficiente y, por ejemplo, si pulsas otra tecla el micro ni se entera hasta que pase ese tiempo.
2- Lo del flag se me escapó, es otra forma de resolverlo e incluso es mejor.
Algo así
3- Lo del while() no te lo hice notar porque descarté que como era una solución momentánea ya lo ibas a eliminar. Pero como bien dice @Surbyte , "mandalo al diablo"
Muchas gracias a vosotros 2! gracias a ustedes me siento mucho mas preparado para explayar mis ideas en un código, me ayudaron demasiado <3.
Ahora tengo 2 soluciones para mi problema jeje, gracias denuevo!