Arduino – Capítulo 5 – Medidor de amor

Cierto es que los pulsadores y los interruptores son grandes componentes, pero existe más mundo por descubrir a parte del On y el Off. Aún cuando Arduino es una herramienta digital, también es posible obtener información de sensores analógicos para medir cosas como la temperatura o la luz. Para realizar esto, tenemos la ventaja de disponer del Conversor Analógico-Digital de Arduino (CAD) (ADC, Analog-to-Digital Converter en inglés). Los pins analógicos del A0 al A5 pueden detectar valores comprendidos entre 0 y 1023, los cuales, son convertidos en valores de entre 0 voltios y 5 voltios.

En este proyecto vamos a utilizar un sensor de temperatura para medir el calor de nuestra piel. Este componente proporciona como valor de salida una tensión que varia en función de la temperatura que detecta. Posee tres patillas: una conectada a tierra, otra conectada a la alimentación, y la tercera que proporciona la tensión variable a Arduino. Existen multitud de diferentes sensores de temperatura. Este modelo concreto, el TMP36, nos viene de perlas porque proporciona un voltaje de salida cuya variación es directamente proporcional a la temperatura en grados Celsius.

El IDE de Arduino viene con una herramienta incorporada llamada monitor serie que nos reporta los resultados obtenidos del microcontrolador. Utilizando el monitor serie, podemos obtener información acerca del estado de los sensores, y de esta manera, tener una idea de lo que ocurre en el circuito y que código se está ejecutando.

Monitor serie

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

– 3 leds de color rojo.

– 3 resistencias de 220Ω.

– 1 sensor de temperatura TMP36.

Una vez tenemos los componentes necesarios, debemos seguir los siguientes pasos:

1 – Tal y como hemos hecho en los proyectos anteriores, conectamos la alimentación y la tierra en nuestra protoboard.

2 – Conectamos el cátodo de cada led (la patilla corta) a tierra utilizando una resistencia de 220Ω. Los ánodos de cada led irán conectados a los pins del 2 al 4 del Arduino.

3 – Colocamos en el sensor TMP36 en la protoboard con la cara redondeada mirando en dirección contraria a nuestro Arduino (el orden de los pins del sensor es importante) tal y como se muestra en la figura de más abajo.

4 – Seguidamente, conectaremos el pin izquierdo del sensor (mirando el sensor por su lado plano) a la alimentación y el pin derecho a tierra.

5 – A continuación, el pin central irá conectado al pin A0 del Arduino, el cual,  es el pin 0 de entrada analógica.

Terminado de montar el circuito, deberíamos de tener algo parecido (por no decir exacto al 100%) al mostrado en la siguiente figura.

Love o Meter - Montaje en protoboard

El esquema eléctrico correspondiente sería:

Love o Meter - Esquema electrico

El código

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

En este proyecto conoceremos un elemento nuevo en programación: las constantes. Las constantes son similares a las variables en que nos permiten identificar cosas con un nombre único, pero a diferencia de estas, las constantes no pueden cambiar de valor. Nombraremos la entrada analógica para una fácil identificación  y crearemos otra constante para establecer la temperatura de referencia. Para cada dos grados por encima de la temperatura de referencia, se encenderá un led. Utilizaremos el tipo de dato int, para identificar que pin del sensor está activado. El valor de la temperatura se almacenará como un float, o como un número de coma flotante. Este tipo de número tiene un punto decimal, y se utiliza para número que pueden ser expresados como fracciones.

 const int sensorPin = A0;
 const float baselineTemp = 20.0;

En la configuración vamos a utilizar un comando nuevo, Serial.begin(). Dicho comando inicializa una conexión entre el Arduino y el ordenador, de esta manera podemos ver los valores de la entrada analógica en nuestra pantalla del pc.

El argumento 9600 es la velocidad a la que se comunica el Arduino, 9600 bits por segundo. Debemos utilizar el monitor IDE serial para poder ver la información que hemos escogido enviar desde el microcontrolador. Cuando abrimos dicho monitor, debemos verificar que el ratio de transmisión (baud rate) es de 9600.

void setup(){
  Serial.begin(9600); // open a serial port.

La siguiente parte del código es un bucle for() que establecerá varios pins como salidas. Dichos pins son los que hemos conectado anteriormente a los leds. En lugar de ir uno por uno estableciendo cada pin con la función pinMode(), podemos utilizar el bucle for() para realizar dicha acción  mucho más rápido. Es un buen truco si tienes un gran número de cosas iguales y quieres recorrerlas todas con el programa. En este caso, utilizaremos el bucle for() para ir de los pines 2 al 4 secuencialmente.

  for(int pinNumber = 2; pinNumber<5; pinNumber++){
        pinMode(pinNumber, OUTPUT);
        digitalWrite(pinNumber, LOW);
  }
}

En el bucle, utilizaremos una variable local llamada sensorVal para almacenar los valores leídos del sensor. Para recoger los datos obtenidos del sensor, llamaremos a la función analogRead() que tiene como argumento el pin cuyo valor de tensión debe ser leído. Dicho valor, el cual está comprendido entre el 0 y el 1023, es una representación del voltaje del pin.

void loop(){

    int sensorVal = analogRead(sensorPin);

La función Serial.print() envía la información del Arduino al pc conectado a el. Podemos ver dicha información en nuestro monitor serie. Si a la función Serial.print() le pasamos como argumento un texto entre comillas, nos mostrará dicho texto como salida. Si por el contrario, le pasamos como argumento una variable, nos mostrará en la salida el valor contenido en dicha variable.

Serial.print("Sensor Value: ");
Serial.print(sensorVal);

Con un poco de matemáticas, es posible averiguar aproximadamente cuanta tensión real hay en el pin. La tensión está comprendida entre 0 y 5 voltios, teniendo una parte fraccional (por ejemplo, pudiendo ser 2.5 voltios), tan solo necesitamos almacenar dicho valor en una variable de tipo float, la cual podemos llamarla voltage. Dividimos sensorVal entre 1024.0 y lo multiplicamos por 5.0. El nuevo número representa el voltaje del pin.

// convert the ADC reading to voltage.
float voltage = (sensorVal/1024.0) * 5.0;

Al igual que con el valor del sensor, podemos mostrar en el monitor serie dicha información.

Serial.print(" , Volts: ");
Serial.print(voltage);

Si examinamos la hoja de especificaciones del sensor, encontraremos información sobre el rango de la tensión de salida. Las hojas de especificaciones (datasheet en inglés) son los manuales de los componentes electrónicos, escritos por ingenieros para otros ingenieros. El datasheet de este sensor nos explica como para cada variación de 10 milivoltios en dicho sensor equivale a un cambio de temperatura de 1 grado Celsius. También nos informa que el sensor puede leer temperaturas por debajo de los 0 grados. Por esta razón, necesitamos crear una compensación para valores por debajo de la congelación (0 grados). Si obtenemos el voltaje, le restamos 0.5 y lo multiplicamos por 100, podemos obtener la temperatura precisa en grados Celsius. Almacenemos este nuevo valor en una variable de tipo punto flotante llamada temperature.

Ahora que ya tenemos la temperatura real, mostrémosla también por el monitor serie. Como la variable temperature es la última cosa que vamos a mostrar en el bucle, vamos a utilizar a tal efecto, un comando ligeramente diferente: Serial.println(). Este comando crea una nueva línea en el monitor serie tras haberle enviado el valor. Esto ayuda a que la información sea más fácilmente legible cuando se muestra por la pantalla.

Serial.print(" , degrees C: ");
// convert the voltage to temperature in degrees.
float temperature = (voltage - .5) * 100;
Serial.println(temperature);

Teniendo la información de la temperatura real, podemos utilizar la sentencia if()…else para encender los leds. Usando la temperatura de referencia como punto inicial, podemos encender un led cada vez que se produzca un incremento de 2 grados por encima de dicha temperatura de referencia.

if(temperature < baselineTemp){
     digitalWrite(2, LOW);
     digitalWrite(3, LOW);
     digitalWrite(4, LOW);

El operador && significa “y” (“and” en inglés) en un sentido lógico. Podemos utilizarlo para evaluar múltiples condiciones: “si la temperatura es 2 grados mayor que la temperatura de referencia, y como mínimo 4 grados por encima de la temperatura de referencia.”

}else if(temperature >= baselineTemp+2 && 
    temperature < baselineTemp+4){
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);

Si la temperatura está comprendida entre 2 y 4 grados por encima de la temperatura de referencia, el siguiente bloque de código encenderá el led correspondiente al pin 3.

}else if(temperature >= baselineTemp+4 && 
    temperature < baselineTemp+6){
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
}else if(temperature >= baselineTemp+6){
     digitalWrite(2, HIGH);
     digitalWrite(3, HIGH);
     digitalWrite(4, HIGH);

El convertidor analógico-digital puede leer datos muy rápido, por lo que debemos añadir un retardo al final de cada bucle loop(). Esto es recomendable ya que, si leemos los datos con demasiada frecuencia, los valores parecerán un sin sentido.

    }

    delay(1);

}

Puesta en marcha

Una vez hayamos subido nuestro código al Arduino, hacemos clic sobre el icono del monitor serie.

Icono del monitor serie

Dicho monitor nos mostrará un flujo de valores en un formato similar al siguiente:

Sensor: 200, Volts: .70, degrees C: 17

Prueba a poner tus dedos sobre el sensor mientras está conectado a la protoboard y observa que ocurre con los valores que aparecen en el monitor serie. Anotemos el valor de la temperatura que se nos muestra cuando el sensor no está en contacto con ningún objeto ni con nuestros dedos.

Cerremos el monitor serie y cambiemos el valor de la constante baselineTemp en nuestro programa por el valor que hemos observado al dejar el sensor al aire libre. A continuación, subimos de nuevo el programa al Arduino y probemos de tocar de nuevo el sensor con nuestros dedos. Al subir la temperatura, veremos como se encienden los leds uno a uno.

Bien. En este proyecto hemos aprendido a utilizar un sensor de temperatura y el monitor serie, con el que podremos hacer un seguimiento de lo que ocurre en nuestro Arduino mientras ejecutamos nuestro código. Del mismo modo, hemos aprendido a usar la función analogRead(), la cual nos permite obtener datos del exterior a través de un sensor. En este caso se ha optado por detectar la temperatura, pero cambiando el tipo de sensor podemos obtener multitud de datos diferentes.

Espero que os haya gustado.

Un saludo y muchas gracias por leer este artículo.  ^_^

Referencias

– Artículo basado en el capítulo “Project 03 – Love-o-Meter” del libro “Arduino Projects Book” distribuido por Arduino.cc junto con su “The Arduino Starter Kit“.

– Tutorial sobre el bucle for.

– Tutorial sobre la función analogRead().

Anuncios

3 pensamientos en “Arduino – Capítulo 5 – Medidor de amor

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s