Lectura de Temperatura y Humedad desde un Sensor SHT15: Introducción a la Interfaz GPIO

El objetivo de este proyecto es utilizar un ODROID para leer los datos de temperatura y humedad desde un sensor SHT15, y explicar cómo un ODROID se comunica con un SHT15 a través de los pines GPIO. Los sensores SHT15 son fabricados por Sensirion y miden tanto la temperatura como la humedad de un entorno. La comunicación con un sensor tiene lugar a través de los pines GPIO del ODROID. Un pin GPIO se conecta al pin SCK del sensor, que controla la rapidez con la que se produce la comunicación. El segundo pin GPIO se conecta al pin DATA del sensor, que se usa para enviar comandos y leer resultados. Una vez configurado todo, el ODROID enviará una solicitud para medir la temperatura o la humedad a través del pin de DATOS, espera a que el sensor complete su medición y luego lee el resultado sobre el pin de DATOS.

Conectar del sensor SHT15

El siguiente diagrama describe cómo conectar un sensor SHT15 a un ODROID.

Figure 1 - SHT15 Diagram
Figura 1 - Diagrama SHT15

Hay dos cosas que debemos tener presente. En primer lugar, las hojas de especificaciones técnicas son un excelente lugar para obtener información sobre cómo usar los componentes electrónicos. El circuito de la Figura 1 ha sido copiado de la hoja de datos del sensor. Se trata de una recomendación del fabricante a modo de configuración que produce buenas mediciones. En segundo lugar, soldar un SHT15 es complicado. Para facilitar las cosas, este tutorial utiliza una placa sensor SHT15 prefabricada.

Elementos necesarios

Para empezar, se necesitan las siguientes componentes y herramientas:

Una vez que tengas la placa del sensor SHT15, realiza las siguientes conexiones tras soldar los cables a la misma:

  • Conecta VCC a la fuente de alimentación +3.3V del ODROID
  • Conecta DATA al pin #100 GPIO del ODROID
  • Conecta SCK al pin #97 GPIO de ODROID
  • Conecta GND a la GND del ODROID

Deberías terminar con algo que se parezca a la Figura 2.

Figure 2 - SHT 15 Connections
Figura 2 - Conexiones SHT15

Lectura y escritura de los valores GPIO

Pin GPIO quiere decir pin de entrada/salida de propósito general. Cuantos tiene tu ODROID depende del modelo en concreto, pero en todos los casos, se utilizan para leer y escribir datos binarios. Los datos binarios son datos con solo dos estados, comúnmente denominados HIGH y LOW, o 1 y 0. Físicamente, un valor HIGH significa que el voltaje del pin es +3.3 voltios, y un valor LOW significa que el voltaje del pin es de +0.0 voltios. Ten en cuenta que el nivel de voltaje depende del dispositivo. Por ejemplo, un Arduino funciona desde los +5.0 voltios a +0.0 voltios. Si el ODROID está escribiendo datos en un pin GPIO, cambiará el voltaje entre +3.3 voltios y +0.0 voltios dependiendo de si se ha escrito HIGH o LOW. Si el ODROID está leyendo datos, registrara HIGH cuando se aplica +3.3 voltios al pin, y LOW cuando se aplica +0.0 voltios al pin. Para este proyecto, vamos a leer y escribir datos desde y hacia dos pines GPIO. Esto implica los siguientes pasos:

  • Conectar los pines GPIO ODROID al sensor
  • Iniciar sesión en Linux en el ODROID y navegar hasta el directorio GPIO
  • Iniciar una conexión con los dos pines GPIO conectados (uno para DATA y otro para SCK)
  • Cuando sea necesario, fijar los pines en modo escritura y escribir datos
  • Cuando sea necesario, fijar los pines en modo lectura y leer datos

Para empezar, inicia sesión en tu ODROID y abre un terminal de línea de comandos. Algunos de los siguientes comandos se deben ejecutar como root, lo cual se puede hacer con el siguiente comando:

$ sudo su -
Los pines GPIO se encuentran en el directorio /sys/class/gpio:
$ cd /sys/class/gpio
Un programa llamado "export" se encuentra en este directorio, que activa las conexiones con los pines GPIO. Es necesario activar un pin antes de que los datos puedan leerse o escribirse en él. Para activar una conexión, transmite el número de identificación del pin. En este tutorial, conectaremos el pin DATA del sensor SHT15 al pin 100 GPIO, y el pin SCK del sensor al pin 97 GPIO. Estas dos conexiones se activan con los comandos siguientes.
$ echo 100 > /sys/class/gpio/export
$ echo 97 > /sys/class/gpio/export
Tras completarse estos comandos, deberías observar que se han creado los siguientes directorios:
/sys/class/gpio/gpio100
/sys/class/gpio/gpio97
Estos directorios contienen todo lo necesario para leer y escribir datos desde los correspondientes pines GPIO. El primer archivo importante a tener en cuenta es "direction". Para el pin 100 GPIO, se encuentra en /sys/class/gpio/gpio100/direction. El archivo "direction" cambia un pin entre el modo lectura y el modo escritura. No puedes leer y escribir datos simultáneamente al mismo tiempo en un solo pin. Sin embargo, puede tener varios pines donde algunos están leyendo datos y otros están escribiendo datos. Un pin se puede cambiar al modo escritura escribiendo un valor "out" en el archivo de "direction". Del mismo modo, un pin se puede cambiar al modo lectura escribiendo un valor "in" en el archivo "direction". Por ejemplo, el siguiente comando cambia el pin 100 GPIO a modo escritura:
$ echo out > /sys/class/gpio/gpio100/direction
El siguiente comando cambia el pin 100 GPIO a modo lectura.
$ echo in > /sys/class/gpio/gpio100/direction
Para identificar en qué modo está un pin GPIO, puede leer el valor de "direction". Por ejemplo, el siguiente comando identifica si el pin GPIO 100 está en modo lectura o modo escritura.
$ cat /sys/class/gpio/gpio100/direction
El segundo archivo importante a tener en cuenta es "value". Para el pin 100 GPIO, se encuentra en /sys/class/gpio/gpio100/value. La lectura y escritura de datos binarios se realiza utilizando el archivo "value". Si el pin está en modo escritura, el archivo "value" se utiliza para generar datos binarios. Si el pin está en modo lectura, el archivo "value" se usa nuevamente, pero en este caso lee datos binarios del pin. Para evidenciar esto, podemos ejecutar una pequeña prueba y ver si la placa de circuitos está conectada correctamente. Cuando se conecta inicialmente, el pin DATA debe estar HIGH y el pin SCK debe estar LOW. Para determinar si este es el caso, primero cambia ambos pines al modo lectura.
$ echo in > /sys/class/gpio/gpio100/direction
$ echo in > /sys/class/gpio/gpio97/direction
Segundo, lee el valor de GPIO para cada pin.
$ cat /sys/class/gpio/gpio100/value
$ cat /sys/class/gpio/gpio97/value
El pin 100 (DATA) debe imprimir un valor "1", y el pin 97 (SCK) debe imprimir un valor "0". Si este no es el caso, la solución del problema pasa por verificar tus conexiones usando el diagrama de cables anterior como referencia, y comprobar que los pines GPIO están configurados en modo lectura verificando los valores del archivo "direction" :
$ cat /sys/class/gpio/gpio100/direction
$ cat /sys/class/gpio/gpio97/direction

Comunícanse con el sensor SHT15

Los siguientes pasos hacen que los datos de humedad o temperatura puedan leerse desde un sensor:

  1. El ODROID envía una solicitud al sensor para registrar la temperatura o la humedad. Ten en cuenta que el sensor no puede leer la temperatura y la humedad de forma simultánea. Si se necesitan tomar ambas mediciones, éstas se deben realizar de forma secuencial.
  2. El sensor empieza a tomar una medición, el ODROID espera.
  3. Una vez que se complete la medición, el ODROID lee el resultado desde sensor.
  4. El ODROID convierte la medición en algo legible por los seres humanos.

Para solicitar que se tome una medida, el ODROID envía un número binario al sensor. Por ejemplo, el número 00000011 solicita que se mida la temperatura, y el número 00000101 solicita que se mida la humedad. Los números en sí se envían bit por bit sobre el pin de DATOS. El pin SCK controla la rapidez con la que se envían los valores. Echa un vistazo a la Figura 3, muestra los valores de los pines GPIO al transmitir el número 00000101 (solicitud de medición de humedad).

Figure 3 - Humidity Measurement Request
Figura 3 - Solicitud de medición de humedad

En la figura 3 podemos diferencias tres secciones. La primera es la secuencia de inicio de la transmisión. Se trata de una combinación de valores HIGH y LOW transmitidos a través de DATA y SCK que indican que el sensor está a punto de enviar un comando. La segunda sección es el número de solicitud. En él, el pin DATA transmite cada bit 0-0-0-0-0-1-0-1 y el pin SCK varía entre 1 y 0. El pin SCK controla el tiempo de transmisión de los datos. Cuando SCK es 0, indica que no hay nada para ser leído. Cuando SCK es 1, indica que hay algo que está listo para ser leído. Alternar SCK entre 1 y 0 mientras se transmite cada bit sobre DATA permite que ODROID envíe solicitudes de medición al sensor.

La última sección del diagrama anterior es la sección ACK, también conocida como la sección de confirmación. En esta sección, el ODROID cambia el pin DATA a modo lectura. Esto hace que lea valores escritos por el sensor. Si el sensor SHT15 recibió correctamente el comando, escribirá un valor 0 en DATA durante la sección ACK, luego cambiará DATA a 1. El ODROID continúa controlando el valor de SCK en modo escritura y deja un momento para que registre una medición. Una vez completada la medición, el sensor cambia el pin DATA a 1. Esto indica que el ODROID puede leer libremente el resultado del sensor. Los resultados se componen de dos bytes, con un total de 16 bits. La Figura 4 muestra el ODROID leyendo el resultado de una medición de ejemplo.

Figure 4 - Measurement Reading
Figura 4 - Lectura de mediciones

Tal y como se puede apreciar en la Figura 4, el ODROID lee el número en dos trozos, 00000100 y 00110001. Cada uno de estos trozos se denomina byte. Esto sucede en tres secciones. Las secciones primera y tercera transmiten los bytes reales. Estas transmisiones se producen poco a poco ya que el ODROID alterna SCK entre 0 y 1 mientras lee DATA. La segunda sección es otra señal ACK. Una vez enviado el primer byte, el sensor cambia DATA a 1. Para enviar una señal ACK, ODROID necesita cambiar DATA a 0 y alternar SCK entre 0 y 1. Esto le dice al sensor que el ODROID está listo para leer el segundo byte. El número leído desde sensor está en formato binario y debe convertirse a un sistema numérico de base 10. Más adelante, usaremos un software para hacer esto. Pero por ahora, simplemente ten en cuenta que 00000100 00110001 equivale a 1073. Tras registrar una medición y ser convertida a un sistema numérico de base 10, debe ser añadida a una ecuación para obtener el resultado final. Si se ha tomado una medición de temperatura, se usa la siguiente ecuación:

T = -39.7 + 0.04x
En estas ecuaciones, x es el número de base 10 registrado desde el sensor SHT15 y T es el resultado final. Por ejemplo, un valor de 1617.5 registrado desde el sensor tras una medición de temperatura indica una temperatura de 25 °C. Si se toma una medición de humedad, se usa la siguiente ecuación.
H = -2.0468 + 0.0367x – 0.0000015955x2
En esta ecuación, x es el número de base 10 registrado desde el sensor SHT15 y H es el resultado final. Por ejemplo, un valor de 1073 registrado desde el sensor tras una medición de humedad indica una humedad del 35.5%

Usar PHP para leer datos de humedad y temperatura

Después de echar un vistazo a la sección anterior, la idea de controlar los pines SCK y DATA a través de la línea de comandos de Linux para solicitar y leer las mediciones podría no parecer muy atractiva. Si ese es el caso, ¡Estoy totalmente de acuerdo contigo! Para hacer todo esto más manejable, he escrito dos scripts PHP para que hagan el trabajo duro. Para descargar estos scripts, dirígete al directorio donde quieres que se guarden y ejecuta los siguientes comandos:

$ sudo apt-get install git php5
$ git clone git@github.com:jon-petty/shtx_php_example.git
El primer comando instala PHP, que es necesario para ejecutar los scripts. El comando también instala un programa llamado git, que se suele usar para descargar repositorios de código. El segundo comando usa git para descargar realmente los scripts. Si quieres echar un vistazo a los scripts antes de descargarlos, los pueden ver en http://bit.ly/1OGGK5Q. Para ejecutar estos scripts, primero cambia a los directorios, luego sigue las instrucciones del archivo README.md. Contiene las instrucciones más actualizadas sobre cómo ejecutar los scripts:
$ cd shtx_php_example
$ less README.md

Proyectos futuros

Llegados a este punto, has conectado un sensor SHT15 a tu ODROID y puedes registrar la humedad y la temperatura. También has aprendido como se controlan los pines GPIO en Linux y qué protocolo de comunicación se usa con un sensor SHT15. Si tienes curiosidad y deseas obtener más información, te recomiendo que eche un vistazo a los scripts PHP y compares el código con el protocolo de comunicación y las ecuaciones. También puedes echar un vistazo a las especificaciones técnicas para aprender cosas que están fuera del alcance de este artículo. Por ejemplo, si las temperaturas varían mucho de los 25 °C, la humedad registrada se debe ejecutar a través de una ecuación de compensación para que los resultados sean más precisos.

Referencias

Datasheet SHT1x. Sensirion, Dec. 2011. http://bit.ly/1x0FfqK

Be the first to comment

Leave a Reply