Go Down

Topic: Sonda temperatura relentiza el proceso (Read 1 time) previous topic - next topic

knibal

Mar 17, 2014, 01:05 am Last Edit: Mar 21, 2014, 05:17 am by knibal Reason: 1
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.

Code: [Select]

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");
 }
 
 
}




Un saludo y gracias a todos

perrociego


Hola knibal:

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.

Saludos

knibal

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?  :smiley-eek-blue:

perrociego

Hummm. Yo sigo sospechando del delay(100);

¿Y si salteas la función mando() 200 milisegundos luego de tomar algún valor del joystick?

unsigned long saltearhasta = 0;
....

if (millis() > saltearhasta) mando();
...

ejex = analogRead ( joyPin1);
ejey = analogRead ( joyPin2);
saltearhasta = millis() + 200;
...

Nota: no creo que importe en general, pero cada 50 días millis() vuelve a 0 y entonces haría este código un retorno antes de lo esperado)


knibal

#4
Mar 20, 2014, 10:54 pm Last Edit: Mar 21, 2014, 05:19 am by knibal Reason: 1
He puesto hecho pruebas y ahora va a toda pastilla. Al final es problema estaba con las sondas de temperaturas.
tenia algo tal que asi:

sensores.requestTemperatures();
temperatura[0]=sensores.getTempCByIndex(0)+1;
temperatura[1]=sensores.getTempCByIndex(1)+1;

le he puesto un retardo como el que se pone para evitar rebotes y le ha entrado el turbo  :smiley-eek:
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. :smiley-roll-sweat:
Alguna idea de como poder solucionarlo

Un saludo

noter

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.

knibal

hola noter!
Efectivamente son unas dallas. El problema esta en la lectura del las temperaturas que se queda pillado.
Al final lo he solucionado asi:

void Temperatura()
{
 
 
  tiempotemp=millis();
  if (tiempotemp-ultimotemp > 10000)
{
    ultimotemp=tiempotemp;
  sensores.requestTemperatures();
  temperatura[0] = sensores.getTempCByIndex(0)+1;
  temperatura[1] = sensores.getTempCByIndex(1)+1; 
   
   
  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.

Un saludo

Go Up