Hola a todos!
Tengo un arduino mega al que esta conectado un joystick a los pines 2 y 3 analogicos. Tambien tengo un par de botones y un lcd.
Quiero realizar un menu en el lcd y manejarlo a traves del joystick. He realizado pruebas de moverme con el menu por medio de los botones y una interrupciones y va perfecto en cuanto a rapidez. Al tener conectado el joystick a dos pines analogicos entiendo que no puedo utilizar las interrupciones. Por lo que he creado una funcion que recoja los movimiento del joystick y actue en el menu. El caso es que lo hace correctamente pero se me antoja muy lento cuando con los botones al ser interrupciones es inmediato. Podriais darme alguna idea de como solucionar esto. Os copio el trozo del codigo al que hago referencia.
void loop() {
control(); // funcion controla varios sensores
switch (lcd_pant)
{
case 0: menu1(); break; // hecho
case 1: menu2(); break; // hecho
case 2: menu3(); break; // hecho
case 3: menu4(); break; // hecho
case 4: menu5(); break; // hecho
case 5: menu6(); break; // hecho
case 6: menu7(); break; // hecho
case 7: menu8(); break;
case 8: break;
}
mando();
}
// Funcion mando
void mando()
{
ejex = analogRead ( joyPin1);
delay(100);
ejey = analogRead ( joyPin2);
delay(100);
if(ejex <= 200) // Avanza en el menu
{
//Serial.print("Avanza");
lcd_pant=lcd_pant+1;
if (lcd_pant >= 8)
{
lcd_pant=0;
}
}
if(ejex > 800) // retrocede en el menu
{
Serial.print("Atras");
lcd_pant=lcd_pant-1;
if (lcd_pant < 0)
{
lcd_pant=7;
}
}
if(ejey >= 509 && ejey <= 514 && ejex >= 509 && ejex <= 514) // send blinking dot to display if stick is basically centered
{
Serial.print("centro");
}
}
El llamado a analogRead para los ejes del joystick no necesita delay(100).
Supongo que lo pusiste por esto de que en el procesador (internamente) el conversor analógico digital es uno solo, y un rápido cambio de entrada puede dar valores falsos. Pero si es que requiere delay, con delay(1); sobra.
Lo que no puedo ayudarte es sobre hacerlo mediante interrupciones, pero algo se debe poder, o al menos definir una función que frecuentemente chequee los valores del joystick.
Hola Perrociego! lo primero gracias por contestar. El Delay lo puse por el efecto rebote. He probado a quitarlo tambien con el mismo efecto.
Si te fijas tengo es una funcion que chequea constatemente el estado del joystick. El caso que he probado el funcionamiento solo con el codigo del menu y va perfecto. Sospecho que se relentiza por la funcion de control que tengo que chequea todas las sondas. Porque tengo dos pulsadores con interrupciones y van perfectos pero esta en el loop va como lenta. otra que tengo para el boton del joy lo mismo le cuesta..Alguna idea de como poder solucionar esto?
le he puesto un retardo como el que se pone para evitar rebotes y le ha entrado el turbo
El problema que ahora si le pongo que lea cada segundo va como a tirones. Para cada vez que hace la lectura de las sondas.
Alguna idea de como poder solucionarlo
No sé qué tipo de sensores estás utilizando, ni en qué entorno tienes el código que dices, pero me recuerda a los Dallas a través de onewire, con los que me he peleado yo. Según el manual, creo que desde que se hace una solicitud de medida de temperatura hasta que ésta finaliza y está disponible para su lectura pasan bastantes milisegundos, osea que si nada más hacer request llamas a getTemp, este último comando va a tener que estar esperando cruzado de brazos hasta que acabe la medición.
Mi consejo es que separes el request del gettemp y mientras tanto hagas algo. Por ejemplo, si el código fuera un simple delay (500), esto sería bastante ineficiente:
delay (500); // Es un delay, pero podría ser una secuencia de código que aproveche este tiempo.
sensores.requestTemperatures(); // Pido a los termómetros que midan.
temperatura[0]=sensores.getTempCByIndex(0)+1; //aquí el programa va a parar hasta que las temperaturas estén disponibles.
temperatura[1]=sensores.getTempCByIndex(1)+1;
Sin embargo así:
sensores.requestTemperatures(); // Pido a los termómetros que midan.
delay(500); // Mientras miden aprovecho para hacer otra cosa (obviamente, en lugar del delay podría poner otro código más provechoso)
temperatura[0]=sensores.getTempCByIndex(0)+1; // Mientras se ejecutaba el código los termómetros han estado realizando la medición, que ya debería estar inmediatamente disponible.
temperatura[1]=sensores.getTempCByIndex(1)+1;
Pienso que tu problema pudiera venir por ahí. Ya me dirás si te ayudó.
Saludos.
if ((temperatura[0] < 30)|| (temperatura[1] < 30)) //Esta el simbolo al contrario > ???
{
EstadoCalent=1;
digitalWrite(PinCalentador, LOW);
}else {
EstadoCalent=0;
digitalWrite(PinCalentador, HIGH);
}
}
}
La temperatura es un dato que va a fluctuar poco asi que pidiendo la temperatura menos frecuentemente lo soluciono. si saco el requestemperature fuera del bucle se relentiza como dices.