Estación climatológica subiendo datos a ThingSpeak

Configurando RPi para utilizar GPIO y SPI.

Notas. Las instrucciones siguientes se escriben después del signo de pesos;    jorge@jorge-Satellite:~$ sudo…………… en la terminal.

  1. The pins labelled SCL and SDA can be used for I2C. The pins labelled MOSI, MISO and SCKL can be used to connect to high speed SPI devices. All the pins have 3.3V logic levels and are not 5V-safe so the output levels are 0-3.3V and the inputs should not be higher than 3.3V. If you want to connect a 5V output to a Pi input, use a level shifter.

    GPIO 26 pins
    Descripción de los 26 pins del RPi B

Un vez hecha la configuración es factible probar el funcionamiento desarrollando el experimento de medir temperatura, humedad con un sensor DHT11 además de medir la temperatura, altitud, presión y altitud sobre el nivel del mar usando un sensor BMP180. Ademas de las lecturas anteriores se va a usar una fotocelda para medir los valores de resistencia a diferentes horas del día. Para lo cuál se registrarán muestras y se identificarán los rangos aproximados.

Las instrucciones las tenemos en la página siguiente pero básicamente se puede decir que las fotoceldas son resistencias que a medida que la intensidad de luz (lux) incrementa, su resistencia nominal (usualmente 10K Ohms) disminuye de acuerdo a la siguiente tabla (tomada del sitio referido).

referencia a las unidades la tenemos en el sitio the engineering toolbox. se tiene que :

  • un lux = un lumen por metro cuadrado.
  • 1 lux = 1 lumen / metro cuadrado .

light_graph

Considerando que los pines del GPIO del Rpi solo reconocen entradas booleanas, se requiere un circuito que sea capaz de identificar variaciones en la cantidad que en cierto sentido es una lectura de carácter analógico.

Para compensar y así poder usar el RPi es necesario añadir un circuito(RC), es decir un circuito  t = RC donde t = tiempo, R = resitencia (Ohms) y C = capacitancia (farads).  Entonces el objetivo es medir el tiempo  en el que el capacitor llega al 63% de su carga en Voltios, mismo que es proporcional a la intensidad de la luz en el ambiente cerca de la fotocelda. A este tiempo se le denomina constante de tiempo.

Un ejemplo de un sistema LDR para medir la intensidad de la luz en el RPi esta en la siguiente pagina.

capacitor-charge-time

Para implementar esto es necesario desarrollar el siguiente algoritmo:

Teoria

Here is the sequence of events :

  • Set the GPIO pin as an output and set it Low. This discharges any charge in the capacitor and ensures that both sides of the capacitor are 0V.
  • Set the GPIO pin as an input. This starts a flow of current through the resistors and through the capacitor to ground. The voltage across the capacitor starts to rise. The time it takes is proportional to the resistance of the LDR.
  • Monitor the GPIO pin and read its value. Increment a counter while we wait.
  • At some point the capacitor voltage will increase enough to be considered as a High by the GPIO pin (approx 2v). The time taken is proportional to the light level seen by the LDR.
  • Set the GPIO pin as an output and repeat the process as required.

Exactitud

Dado que solo se requiere reconocer diferentes niveles de intensidad de luz no es necesario conocer el valor de la resistencia del LDR (fotocelda) o el tiempo exacto que toma al capacitor en cargarse. Entonces el valor registrado que en nuestro caso es el número de ciclos que le toma cargarse el capacitor, los datos se subirán al sitio ThingSpeak que al cargarse le añade un campo de fecha y hora en la que se registra la lectura.

También es necesario considerar que la ejecución del codigo se ve afectados por el sistema operativo del Rpi, es decir, el número de ciclos puede variar si existen otros procesos ejecutándose. Pero las diferencias se podrán observar como patrones una vez que se analice el comportamiento global de los datos.

Para realizar la operación de captura y registro en ThingSpeak se usará el siguiente código.

#!/usr/local/bin/python

# Reading an analogue sensor with
# a single GPIO pin

# Author : Matt Hawkins
# Modificado para subir a ThinkSpeak por J. Herrera
# Distribution : Raspbian
# Python : 2.7
# GPIO : RPi.GPIO v3.1.0a

import sys
import RPi.GPIO as GPIO
from time import sleep
import os
import urllib2

myAPI = "GVW1V5305NMTZWCQ"
myDelay = 10 #how many seconds between posting data
baseURL = 'https://api.thingspeak.com/update?api_key=%s' % myAPI 

# Tell the GPIO library to use
# Broadcom GPIO references
GPIO.setmode(GPIO.BCM)

# Define function to measure charge time

def RCtime (PiPin):
  measurement = 0 # Discharge capacitor
  GPIO.setup(PiPin, GPIO.OUT)
  GPIO.output(PiPin, GPIO.LOW)
  sleep(1)

  GPIO.setup(PiPin, GPIO.IN) # Count loops until voltage across
  # capacitor reads high on GPIO
  while (GPIO.input(PiPin) == GPIO.LOW):
      measurement += 1
  return measurement # Main program loop

while True:
  f = urllib2.urlopen(baseURL +
  "&field1=%s&" % (int(RCtime(18))))

  print f.read()
  print RCtime(18) # Measure timing using GPIO18
  f.close()
  sleep(int(myDelay))

Análisis de datos

Para hacer el análisis se utiliza el programa R o  bien MathLab incluido en el sitio http://thingspeak.com.

ciclecounts

La gráfica anterior descargada del sitio thingspeack,  es el comportamiento del numero de ciclos que tarda el capacitor para alcanzar el voltaje de disparo, que va a depender de la cantidad de iluminación en la habitación donde se encuentra ubicada la fotocelda.

Se puede observar que por la noche la cantidad se dispara de manera notable comparada con el día, ubicándose entre dos y cuatro millones de ciclos. con puntos extremos de hasta 5,300,000 a las 7.30 del dia 28 septiembre 2016.

Por tanto si se desea en el programa en lugar de cero o uno especificar si es de dia o de noche se puede indicar estos valores para que el mensaje o bien la información almacenada así lo refleje.

Instalando los sensores DHT y BMP 180

Continuando con la instalación del sensor de Temperatura DHT11 y el sensor de temperatura, presión y altitud BMP180. Para poder utilizar dichos sensores es necesario configurar el puerto GPIO, y los tipos SPI y I2c como a continuación se explica:

  • Instalando Git. Comandos que permiten clonar Hubs desde https://github.com.
    1. sudo apt-get install git
    2. git clone http://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git
    3. cd Adafruit-Raspberry-Pi-Python-Code
    4. ls
  • Para configurar el GPIO se teclean las siguientes instrucciones en la terminal.
    1. sudo aptget update
    2. sudo aptget install pythondev
    3. sudo aptget install pythonrpi.gpio
  • Configuración del i2c:
    1. sudo aptget install pythonsmbus
    2. sudo apt get install i2ctools. Es posible que ya esté instalado y genere un mensaje de aviso, si es así ignorar y continuar.
  • Configurando sensor DHT
    • Bajar librería de github.
      • git clone https://github.com/adafruit/Adafruit_Python_DHT.git
      • cd Adafruit_Python_DHT
      • sudo aptget update
      • sudo aptget install buildessential pythondev pythonopenssl
        • Si en los pasos anteriores se genera mensaje de que ya esta instalado continuar el proceso
      • sudo python setup.py install
      • Para probar que esta funcionando adecuadamente
        • cd examples
        • sudo ./AdafruitDHT.py 11 28, el codigo anterior permite verificar el funcionamiento de un DHT11 conectado al pin 28.
        • Es factible subir los datos capturados a Google Docs de la siguiente manera:
  • Para instalar la librería de BMP180 se siguen los siguientes pasos.
      • sudo aptget update
      • sudo aptget install git buildessential pythondev pythonsmbus
      • git clone https://github.com/adafruit/Adafruit_Python_BMP.git
      • cd Adafruit_Python_BMP
      • sudo python setup.py install
      • cd examples
      • sudo python simpletest.py
      • Al ejecutar los pasos anteriores se vera en pantalla los valores generados por el sensor.
        • Temp = 20.20 *C
          Pressure = 101667.00 Pa
          Altitude = -28.27 m
          Sealevel Pressure = 101665.00 Pa
      • Para subir los datos a ThingSpeak utilizamos la librería urllib2
  • Es factible seguir las instrucciones de sourceforge aunque en realidad yo me guie por las de Adafruit,

Una vez que se han instalado se desarrolla el programa de captura y subida a la nube.