Calibración de sensores (I). Uso de While
En la entrada anterior vimos como ajustar un
sensor para que actuase en un rango de funcionamiento determinado. El método
era muy sencillo y sobretodo visual, lo que nos enseñaba a entender el procedimiento.
Por otro lado, tenía el inconveniente de que
necesitas del portátil para calibrarlo, con lo que pierde practicidad e impide
que la calibración la pueda realizar cualquiera, y en cualquier caso la
complica un poco.
Veamos en esta entrada otro método más
autónomo para calibrar sensores, pero primero explicaremos la instrucción que
nos ayudará a realizarlo.
While
La instrucción while, ejecuta una serie de
instrucciones, hasta que la condición a testear sea cierta. Este bucle se
repetiría indefinidamente hasta que se cumpla, por lo que hay que incluir una
condición que pueda variar para que en algún momento se cumpla, de no ser así,
entraríamos en bucle infinito, y sería un error de programación.
Esta condición, que debe estar dentro del
bucle, puede ser el incremento de una variable o el chequeo de un sensor o
entrada del Arduino.
La sintaxis de la instrucción es:
While (expresión){
Acciones en el bucle
}
Un ejemplo , sacado de la web arduino.cc,
sería el siguiente:
var = 0;
while(var < 200){
// do something repetitive 200 times
var++;
}
while(var < 200){
// do something repetitive 200 times
var++;
}
En este ejemplo, se usa la variable while para
realizar un bucle que repetirá una acción 200 veces antes de salir del bucle.
Ejemplo calibración
Para nuestro caso concreto, lo que queremos
realizar es la calibración de un sensor LDR durante los primeros segundos de
puesta en marcha, para luego modular la luminosidad de un LED en función de la
luz incidente.
El algoritmo para nuestro montaje sería algo
parecido a esto:
- Crear un bucle de un tiempo definido desde la puerta en marcha
- Comprobar en este tiempo los valores ofrecidos por el sensor almacenando los valores máximos y mínimos
- Fuera del bucle, escalar nuestros valores de salida (mapear)en función de los resultados obtenidos y generar la señal de salida correspondiente.
El montaje será idéntico a la entrada
anterior, pero refresquémoslo:
El sketch propuesto para resolverlo es el
siguiente:
Os dejo un video con el procedimiento.
/* Ejercicio Calibracion I. Procedemos a establecer los valores maximos y mínimos durante los primeros segundos de ejecución del programa */ const int ldrPin = A0; // pin conectado al LDR const int ledPin = 9; // pin conectado al LED const int settime= 5000; // Tiempo dedicado al ajuste desde // el inicio del programa int ValorLDR = 0; // Valor lectura LDR int MinLDR = 1023; // Valor mínimo de la LDR int MaxLDR = 0; // Valor máximo de la LDR void setup() { // Encendemos ell LED del Arduino durante la calibración pinMode(13, OUTPUT); digitalWrite(13, HIGH); //Iniciamos la calibración while (millis() < settime) {//Definido en principio para 10 segundos ValorLDR = analogRead(ldrPin); // Leemos el valor del sensor // Grabamos el valor máximo si es mayor que el guardado if (ValorLDR > MaxLDR) { MaxLDR = ValorLDR; } // Grabamos el valor mínimo si es menor que el guardado if (ValorLDR < MinLDR) { MinLDR = ValorLDR; } } // Apagamos el led 13 pasados los 5 segundos para indicar que // la calibracion ha finalizado digitalWrite(13, LOW); } void loop() { // read the sensor: ValorLDR = analogRead(ldrPin); //Restringimos los valores a los obtenidos durante el calibrado ValorLDR = constrain(ValorLDR, MinLDR,MaxLDR); // Escalamos los valores en la horquilla obtenida en calibracion ValorLDR = map(ValorLDR, MinLDR, MaxLDR, 0, 255); // Encendemos el LED al valor obtenido con la salida PWM analogWrite(ledPin, ValorLDR); }
El sketch o podeis descargar de aquí.
Esta vez para calibrar el sensor, a diferencia
de la entrada anterior bastará con cargar el sketch y durante los primeros
segundos ( hemos definido 5s), iluminar y oscurecer el sensor con los valores de
trabajo. Transcurrido este tiempo los valores máximo y mínimo quedarán grabados.Os dejo un video con el procedimiento.
Ya trabajamos con la función milis, en una entrada anterior, pero para refrescar, esta función cuenta el tiempo
transcurrido desde la puerta en marcha.
En nuestro bucle While, vamos comprobando los
sensores hasta que transcurra el tiempo
previsto.
Otro punto interesante del sketch, es que esta
calibración no la realizamos en el cuerpo del programa , void loop, sino en el
void setup, por lo que tan solo se realizará en una ocasión durante el arranque del Arduino. Para volver a
calibrar el sensor habría que reiniciar el Arduino, con lo que bastaría con
pulsar el reset de la placa.
Esta solución, si bien es sencilla, pierde
practicidad si se han de calibrar varios sensores, y además implica interrumpir
el programa en caso de querer recalibrarlo.
En la siguiente entrada desarrollaremos una
versión mejorada, y que serviría para la mayor parte de los montajes.
Nos vemos!