Hola, mi problema es el siguiente:
Estoy utilizando un sensor infrarrojo para medir la velocidad de un motor DC, midiendo con interrupciones los pulsos que el eje del motor genera. Esa parte del código funciona con normalidad.
El tema es que programé un menú para que el usuario ingrese la velocidad inicial del motor (del 0 al 9, representando diferentes duty cycle para el motor). Para esperar a que el usuario ingrese un valor, utilicé
while (!Serial.available());, el cual efectivamente funciona y espera a que el usuario ingrese un valor. Hecho esto, procede al código principal, el cual en función a un swtich...case realiza las funciones de medición y arroja el valor en RPM. Hasta ahí, sin problemas. El tema es que quiero que cuando acabe una medición, se muestre el menú nuevamente y permita ingresar otro valor del 0 al 9 para realizar alguna otra medición de velocidad.
En el ejemplo, utilicé el valor de val=9 (el selector de velocidad), lo cual funciona con normalidad. Una vez terminada la medición, asigné a val el valor de 10 (val=10), para que así pueda ingresar otra vez al menú. El problema viene aquí: al abrir el menú por segunda vez, ya no espera en el monitor serial a que el usuario ingrese un valor, sino que automáticamente asigna a val el valor con el cual lo reinicié previamente (val=10), lo cual arroja un resultado en el switch...case incorrecto. Luego de ello, el menú se vuelve a abrir, esta vez sí esperando a que el usuario ingrese un número.
Quisiera saber qué es lo que está mal en mi código, pues solo quiero que se muestre el menú una vez se finalice una medición y este espere a que el usuario ingrese un valor para val, no que se quede con un valor previamente asignado.
Adjunto mi código y el resultado en el monitor serial.
int sensorpin = 2; // define pint 2 for sensor
volatile byte pulsos = 0;
unsigned int resolucion = 2;
unsigned int rpm;
int interruptor = 0;
int out1 = 5;
int val;
void isr() {
pulsos = pulsos + 1;
}
void menu() {
Serial.println("Ingrese velocidad del motor (0-9):");
while (!Serial.available()); //Espero a un ingreso del usuario
if (Serial.available()) { //Leo el ingreso del usuario y lo asigno a val.
val = Serial.read();
}
Serial.flush(); //No sé si sea adecuado, pero agregué flush para limpiar el buffer.
}
void setup() {
Serial.begin(9600);
Serial.println("Sistema iniciado.");
pinMode(sensorpin, INPUT_PULLUP);
attachInterrupt(interruptor, isr, RISING);
pinMode(out1, OUTPUT);
pulsos = 0;
rpm = 0;
}
void loop() {
menu(); //En el inicio de cada loop, llamo a menu().
Serial.print("Velocidad escogida: ");
Serial.println(val - 48, DEC);
delay(1000);
switch (val) {
case '9':
analogWrite(out1, 255);
delay(50);
analogWrite(out1, 255);
Serial.println("Speed is = 9");
Serial.println("Calculando velocidad...");
delay(5000);
rpm = (pulsos / resolucion);
Serial.print("La velocidad en RPM es:");
Serial.print(" ");
Serial.println(rpm, DEC);
pulsos = 0;
rpm = 0; //Hasta aquí funciona tal y como quiero, sin problemas.
val=10; //Le doy un nuevo valor a val, el cual debería ser
reemplazado en la siguiente llamada al menu en el
nuevo inicio del loop, sin embargo en el menu no se
lee ningún valor para asignar a val, sino
automáticamente le da este valor val =10.
break;
default:
Serial.println("Valor incorrecto.");
break;
}
Serial.flush();
Serial.println("----------------------------------------------------");
}
Monitor serial:
Sistema iniciado.
Ingrese velocidad del motor (0-9):
Velocidad escogida: 9
Speed is = 9
Calculando velocidad...
La velocidad en RPM es: 9
---------------------------------------------------- Hasta aquí todo funciona correctamente.
Ingrese velocidad del motor (0-9): Aquí se muestra el menú para una nueva medición.
Velocidad escogida: -38 ...y no espera a que el usuario ingrese un valor,
sino que le asigna automáticamente -38.
Valor incorrecto.Ingrese velocidad del motor (0-9): Luego, se vuelve a mostrar el menú, esta vez si
esperando un valor del usuario.
sketch_oct02b.ino (2.53 KB)