Relato: La invención del árbol

Érase una vez, un mundo y tiempo diferentes. En una Tierra afectada por la contaminación y amenazada por el efecto invernadero, un empresario anunció que había creado un proceso industrial por el que se podía convertir el C02 de la atmósfera en un nuevo material con múltiples usos: construcción, elaboración de utensilios, decoración, mobiliario y mil ideas más. Las plantas de procesado de este nuevo material eran autorreplicantes y alimentadas con energía solar.

La gente aplaudió su genialidad. Los científicos, empresarios y economistas de todo el mundo le concedieron reconocimientos y premios. Los gobiernos propusieron invertir millones en esa nueva industria, nadie protestó, era algo para el bien de todos, iba a hacer del mundo un lugar mejor.

Cuando se comenzó a instalar las plantas de producción todos querían ser los primeros en tener algún objeto de ese nuevo material y presumir de ello. La primera pieza, un trozo de material en bruto, llegó a subastarse por cientos de miles de dólares.

El departamento de marketing había pensado nombres comerciales, a las fábricas las llamó “árbolⓇ” y al material que producían “maderaⓇ”.

Cada vez que la gente veía un árbolⓇ se maravillaban de lo que hacía. Los políticos pagaban enormes sumas de dinero por el privilegio de tener árboles en sus ciudades y poder presumir de ello. Eran el orgullo de sus ciudadanos que se afanaban en cuidarlos y se hacían fotos con ellos. El número de árboles que tenía una ciudad llegó a ser un indicador de su nivel económico y su calidad de vida.

Los había de todas formas y tamaños, con diferentes tipos de hojas y maderas. Con tantos modelos que era fácil encontrar alguno de tu gusto y que se adaptara a casi cualquier condición climática.

Pero, el ingenio humano nunca está satisfecho, en secreto los laboratorios preparaban una versión 2.0. Una idea loca para una nueva versión, además de producir madera también daba alimentos. El departamento de marketing ya tenía pensado un nombre «frutaⓇ». La gente iba a alucinar con eso.

Controlar el LED RGB de Arduino Nano 33 BLE Sense

Arduino Nano 33 BLE Sense incorpora un LED RGB que permite mostrar distintos colores. Un LED RGB se compone de tres LED cada uno de un color: rojo (Red), verde (Green) y azul (Blue). Cada color se controla de forma independiente cambiando el estado de un pin digital, cada pin tiene asociada una constante:

Color Pin Constante
Rojo 22 LEDR
Verde 23 LEDG
Azul 24 LEDB

Combinando los tres distintos colores se pueden conseguir 8 combinaciones: rojo, verde, azul, amarillo, rosa, celeste y blanco y apagado. Para evitar volverse loco hay que tener en cuenta que los LED funcionan con lógica inversa, el estado LOW los enciende y el estado HIGH los apaga. En la siguiente tabla podemos ver como conseguir cada color:

Color LEDR LEDG LEDB
Apagado HIGH HIGH HIGH
Rojo LOW HIGH HIGH
Verde HIGH LOW HIGH
Azul HIGH HIGH LOW
Amarillo LOW LOW HIGH
Rosa LOW HIGH LOW
Celeste HIGH LOW LOW
Blanco LOW LOW LOW

El primer paso es configurar el pin de cada LED como escritura. Cada pin tiene asociada una constante: LEDR, LEDG, LEDB.

  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);

Una vez hecho eso podemos controlar el estado de cada color con digitalWrite.

Una cosa a tener en cuenta, y que puede volverte loco, es que los leds funcionan con lógica inversa: el estado LOW los enciende y el estado HIGH los apaga.

Veamos todo esto en un ejemplo que cambia el color del LED cada dos segundos:

void setup() {
  // activar todos los pins del led RGB
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

void loop() {
  //blanco
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, LOW);
  delay(2000);
  //rojo
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(2000);
  //verde
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);
  delay(2000);
  //azul
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);
  delay(2000);
  //amarillo
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);
  delay(2000);
  //rosa
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);
  delay(2000);
  //celeste
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, LOW);
  delay(2000);  
  //apagado 
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(2000);  
}

Regular el brillo del LED para conseguir más colores

Aunque lo habitual es usar los LED como si fueran una salida digital se puede usar como si fuera una salida analógica PWM. Con esto podemos conseguir regular la luminosidad de los distintos LED. En este caso la lógica es inversa, 0 es el mayor valor de luminosidad y 255 el menor. Podemos ajustar cada uno de los tres colores de forma diferente. Regulando la intensidad de cada uno de los tres canales podemos conseguir otros colores. En teoría más de 16 millones (256*256*256) aunque en realidad el LED del Arduino permite muchos menos colores distinguibles. Uno de los problemas que tiene el LED “desnudo” es que cuando hay mucha diferencia de brillo entre sus colores se puede perder el efecto de “color unificado”

En el siguiente ejemplo vamos como usar anologWrite en lugar de digitalWrite para obtener el color naranja.

//naranja
analogWrite(LEDR, 0); //maximo
analogWrite(LEDR, 128); //medio
analogWrite(LEDR, 255); //minimo

Otro ejemplo, el siguiente código recorre toda la gama de colores:

void setup() {
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

void loop() {
  for(byte r = 0; r < 255; r+=5){
    for(byte g = 0; g < 255; g+=5){
      for(byte b = 0; b < 255; b+=5){
        analogWrite(LEDR, r);
        analogWrite(LEDG, g);
        analogWrite(LEDB, b); 
        delay(5);    
      }
    }
  }
}

Puedes ver como funciona un LED RGB en el siguiente vídeo de mi canal de Youtube:

Haz click para ver el vídeo en mi canal de Youtube

Leer gestos con Arduino Nano 33 BLE Sense (sensor APDS9960)

Arduino Nano 33 BLE Sense incluye un sensor de gestos. Su funcionamiento es muy sencillo, tiene cuatro detectores infrarrojos con un led emisor. Cada uno está colocado en una de la esquinas del sensor. Cuando pasas la mano por encima de cada uno de los detectores se reflejan los infrarrojos en la piel y detectan el gesto. Viendo en qué orden los sensores detectan la mano sabe en qué dirección ocurre el gesto.

Este sistema tiene varios problemas:

  • Distancia de funcionamiento, el gesto tiene que realizarse cerca del sensor.
  • En según qué entornos puede dar lecturas falsas.
  • Puede tener problemas para detectar gestos con las manos sucias o con guantes.

Hablamos de manos pero realmente lee cualquier elemento que refleje suficiente luz infrarroja.

El sensor lee cuatro tipos gestos: arriba, abajo, izquierda, derecha.

Cada gesto tiene asociada una constante: GESTURE_UP, GESTURE_DOWN, GESTURE_LEFT, GESTURE_RIGHT.

También existe una constate para indicar que no se ha entendido el gesto: GESTURE_NONE.

Tal y como está colocado el sensor para leer correctamente los gestos el conector USB debe de quedar en la parte «inferior».

Lo primero es incluir la librería del sensor, que creara un objeto APDS:

#include <Arduino_APDS9960.h>

Después hay que ver iniciar el sensor con APDS.begin()

  if (!APDS.begin()) {
    Serial.println("Error al iniciar el sensor");
  }

Una vez el sensor está listo podemos comprobar si ha leído algún gesto con la instrucción APDS.gestureAvailable() que devolverá true cuando hay captado algún gesto. El gesto correspondiente lo podemos obtener con APDS.readGesture().

Veamos un código, adaptado de los ejemplos, para leer gestos:

#include <Arduino_APDS9960.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!APDS.begin()) {
    Serial.println("Error al iniciar el sensor");
  }
}

void loop() {
  //comprobar si se ha detectado algún gesto
  if (APDS.gestureAvailable()) {
    int gesture = APDS.readGesture();
    switch (gesture) {
      case GESTURE_UP:
        Serial.println("UP - arriba");
        break;

      case GESTURE_DOWN:
        Serial.println("DOWN - abajo");
        break;

      case GESTURE_LEFT:
        Serial.println("LEFT - izquierda");
        break;

      case GESTURE_RIGHT:
        Serial.println("RIGHT - derecha");
        break;

      default:        
        break;
    }
  }
}

Podemos ajustar la sensibilidad del sensor a los gestos con la instrucción APDS.setGestureSensitivity(sensitivity) siendo sensitivity un valor entre 0 y 100. Por defecto su valor es de 80. A más alto sea su valor más sensibilidad tendrá a los gestos, lo que significa que captará los mejor los gestos pero a cambio será más probable que lea gestos «erroneos».

Leer colores con Arduino Nano 33 BLE Sense (sensor APDS9960)

Arduino Nano 33 BLE Sense incorpora el sensor APDS9960 que permite leer el color de lo que «tiene delante». Para ellos devuelve el color en formato RGB, esto es que devuelve tres valores con los componentes rojo (red), verde (green) y azul (blue) del color. Aunque el valor de estos tres componentes se devuelva en una variable integer de 16 bits realmente solo se usan 12 bits (0…4095). En realidad el mayor valor que he logrado leer del sensor es 4097 que para eso necesita usar 13 bits pero se puede considerar el 4095 como máximo para simplificar.

Para tener más información del sensor se puede consultar su datasheet aquí.

Lo primero es incluir la librería correspondiente. Se encuentra en el gestor de librerías de Arduino por lo que solo hay que buscarlo para instalarlo:

#include <Arduino_APDS9960.h>

Al incluirla se puede acceder al objeto APDS:

  • Se usa APDS.begin(); para inicializar la lectura de datos. Devuelve true si todo ha ido bien y false si ha ocurrido algún error.
  • Es necesario declarar tres variables de tipo int donde se almacenaran los valores leídos int r, g, b;
  • Para leer el color se usa APDS.readColor(r, g, b); a la que es necesario pasar los tres integer declarados antes.

Veamos como queda el código inspirado en uno de los ejemplos

#include <Arduino_APDS9960.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  //comprueba si elsensor se ha iniciado correctamente
  if (!APDS.begin()) {
    Serial.println("Error initializing APDS-9960 sensor.");
  }
}

void loop() {
  // comprueba si hay un color disponible
  while (! APDS.colorAvailable()) {
    delay(5);
  }
  int r, g, b;
  
  // lee el color
  APDS.readColor(r, g, b);

  Serial.print("r = ");
  Serial.println(r);
  Serial.print("g = ");
  Serial.println(g);
  Serial.print("b = ");
  Serial.println(b);
  Serial.println();

  delay(2000);
}

Un detalle importante a tener en cuenta es que el formato RGB que devuelve el sensor tiene 12 bits por componente (color de 36 bits). El color RGB más habitual tiene 8 bits por componente (color de 24 bits) por lo que es probable que la mayoría de los algoritmos y librerías que se encuentren usen ese formato y sea necesario adaptar los valores.

Comparar temperaturas de los sensores en Arduino Nano 33 BLE Sense

Arduino Nano 33 BLE Sense tiene dos sensores que permiten leer la temperatura en grados centigrados: HTS221 y LPS22HB.

Leer los dos puede ser una manera de verificar los datos. Dentro del rango de temperatura normales para el ser humano deberían de dar resultados muy parecidos.

Es necesario incluir las librerías para ambos sensores e inicializarlos con begin().

Para poder leer la temperatura del sensor LPS22HB es necesario leer primero la presión.

Si queremos podemos aproximar la temperatura final con una media de ambas temperaturas.

Juntemos todo esto en un ejemplo:

#include <Arduino_LPS22HB.h>
#include <Arduino_HTS221.h>
void setup() {
  Serial.begin(9600);
  while (!Serial);
  if (!BARO.begin() || !HTS.begin()) {
    Serial.println("Failed to initialize sensor!");
    while (1);
  }
}
void loop() {
  float temperature1 = HTS.readTemperature();
  BARO.readPressure();
  float temperature2 = BARO.readTemperature();
  float mean = (temperature1+temperature2)/2;
  Serial.print("Temperature1 = ");
  Serial.print(temperature1);
  Serial.println(" C");
  Serial.print("Temperature2 = ");
  BARO.readPressure();
  Serial.print(temperature2);
  Serial.println(" C");
  Serial.print("Mean = ");
  Serial.print(mean);
  Serial.println(" C");
  Serial.println();
  delay(1000);
}

Veamos la salida de ejecutar el código:

Temperature1 = 26.47 C 
Temperature2 = 26.41 C
Mean = 26.44 C

Temperature1 = 26.52 C
Temperature2 = 26.41 C
Mean = 26.47 C

Temperature1 = 26.52 C
Temperature2 = 26.42 C
Mean = 26.47 C

Temperature1 = 26.45 C
Temperature2 = 26.42 C
Mean = 26.43 C

Temperature1 = 26.50 C
Temperature2 = 26.42 C
Mean = 26.46 C

Se puede ver que la temperatura no varía demasiado entre ambos sensores.

Leer temperatura y presión atmosférica con Arduino Nano 33 BLE Sense (sensor LPS22HB)

Arduino Nano 33 BLE Sense incluye un barómetro que mide la presión atmosférica, el sensor LPS22HB. Este tipo de sensores son una superficie que al ser deformada por la presión atmosférica altera su resistencia, midiendo la misma se puede saber la deformación de la superficie y por lo tanto la presión a la que se ve sometida.

El mismo sensor incluye un termómetro para medir la temperatura.

SensorRango de medidaError
Temperatura-40 ºC hasta 85 ºC± 1.5 °C entre los 0 ºC y 65 °C
Presión260 hPa hasta 1260 hPa± 0,1hPa entre el 800 hPa y 1100 hPa

El datasheet del sensor esta disponible aquí.

Lo primero para leer ese sensor es incluir la librería Arduino_LPS22HB.h, la cual se puede descargar desde el gestor de librerías del IDE de Arduino.

#include <Arduino_LPS22HB.h>

Al incluirla se puede acceder al objeto BARO, su uso es simple:

  • Se usa BARO.begin() para inicializar la lectura de datos. Devuelve true si todo ha ido bien y false si ha ocurrido algún error.
  • Para leer la temperatura se puede usar BARO.readTemperature() que devuelve un float con la temperatura en grados Celsius.
  • Para leer la presión se usa BARO.readPressure() que devuelve un float con la presión en kilopascales
  • Si se desea finalizar el uso del sensor y liberar recursos se llama a BARO.end()

Veamos todo esto junto con uno de los ejemplos de la librería:

#include <Arduino_LPS22HB.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!BARO.begin()) {
    Serial.println("Failed to initialize pressure sensor!");
    while (1);
  }
}

void loop() {
  // read the sensor value
  float pressure = BARO.readPressure();

  // print the sensor value
  Serial.print("Pressure = ");
  Serial.print(pressure);
  Serial.println(" kPa");

  float temperature = BARO.readTemperature();

  // print the sensor value
  Serial.print("Temperature = ");
  Serial.print(temperature);
  Serial.println(" C");

  // print an empty line
  Serial.println();

  // wait 1 second to print again
  delay(1000);
}

Podemos leer la presión en tres unidades distintas, para ello se le puede pasar una de las tres constantes como parámetro a la funcion readPressure() :

BARO.readPressure(PSI);
BARO.readPressure(MILLIBAR);
BARO.readPressure(KILOPASCAL);

Leer iluminación ambiental con Arduino Nano 33 BLE Sense (sensor APDS9960)

Ya hemos visto que Arduino Nano 33 BLE Sense cuenta con un sensor que permite detectar colores, pero no solo eso, al mismo tiempo que lee los colores permite medir la cantidad de luz ambiental.

Lo primero es incluir la librería correspondiente. Se encuentra en el gestor de librerías de Arduino por lo que solo hay que buscarlo para instalarlo:

#include <Arduino_APDS9960.h>

Al incluirla se puede acceder al objeto APDS:

  • Se usa APDS.begin(); para inicializar la lectura de datos. Devuelve true si todo ha ido bien y false si ha ocurrido algún error.
  • Es necesario declarar cuatro variables de tipo int donde se almacenaran los valores leídos int r, g, b, a;
  • Para leer el color se usa APDS.readColor(r, g, b, a); a la que es necesario pasar los cuatro integer declarados antes. El que nos interesa es el a que contiene el valor de la iluminación ambiental.

Veamos como queda el código inspirado en uno de los ejemplos:

/*
  APDS-9960 - Color Sensor

  This example reads color data from the on-board APDS-9960 sensor of the
  Nano 33 BLE Sense and prints the color RGB (red, green, blue) values
  to the Serial Monitor once a second.

  The circuit:
  - Arduino Nano 33 BLE Sense

  This example code is in the public domain.
*/

#include <Arduino_APDS9960.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  //comprueba si elsensor se ha iniciado correctamente
  if (!APDS.begin()) {
    Serial.println("Error initializing APDS-9960 sensor.");
  }
}

void loop() {
  // comprueba si hay un color disponible
  while (! APDS.colorAvailable()) {
    delay(5);
  }
  int r, g, b, a;
  
  // lee el color
  APDS.readColor(r, g, b, a);

  Serial.print("r = ");
  Serial.println(r);
  Serial.print("g = ");
  Serial.println(g);
  Serial.print("b = ");
  Serial.println(b);
  Serial.print("a = ");
  Serial.println(a);
  Serial.println();

  delay(2000);
}

Al igual que con los colores el máximo valor que he logrado que devuelva para la luz ambiental es 4097 y el mínimo es 0.

Relato: Nuestro peor enemigo

Ocurrió en una de esas salas oscuras, que sólo tienen una luz colgando del techo. En esas salas siempre se hablan de cosas secretas. Debajo de la luz una mesa circular, sentados alrededor de ella, en el lugar donde la luz se funde con las sombras, doce seres, puede que humanos, estaban sentados observando al resto de las sombras, nerviosos.

Una sombra se levanta, carraspea, duda, mira hacia una sombría audiencia silenciosa.

– Toda crisis es una oportunidad – Un silencio sombrío es la única respuesta que obtiene. Prosigue. – Los datos son claros. No tenemos alternativa. A consecuencia de la guerra todos los planetas habitables a varias decenas de años luz están a punto de dejar de serlo. La armas biológicas, químicas y nucleares han destruido prácticamente todas nuestras colonias y las pocas que no han destruido las han dañado de forma irreparable

Un murmullo de voces, las sombras se muestran agitadas. Una pregunta:

– ¿Y nuestros enemigos?

– Los informes dicen que se enfrentan a una situación similar. Hemos destruido sus colonias y se enfrentan a su propia extinción

Murmullos de aprobación mientras la cara del orador se pone seria

– ¡Caballeros! La situación de nuestros enemigos no afecta a la nuestra. No tenemos ningún planeta habitable ni terraformable en decenas de años luz. Esto podría ser el fin de nuestra especie.

Silencio dramático

– Nuestros científicos e ingenieros más cualificados han estado trabajando en una solución, el programa arca. Tres enormes naves con capacidad para 10000 personas cada una. Partirán en busca de nuevos planetas en un viaje que durará cientos de años. A los nuevos planeta llegarán los tataranietos de los actuales tripulantes. Esto nos da la oportunidad de crear una nueva sociedad, de enseñarles los valores correctos, de enseñarles a no cometer nuestros mismos errores.

Un voz se alza desde las sombras:

– Una duda ¿Es posible que nuestros enemigos estén pensando hacer lo mismo?

– Es probable.

– ¿Y qué pasaría si ellos llevan armas?

Las sombras cuchichean nerviosas

– ¡No podemos descartar esa opción!

– ¡No salvamos a la humanidad para ser sus esclavos!

– Podríamos reducir el número de pasajeros y subir armas a las naves

– Y dar formación militar a todos los niños.

– Exacto, prepararles por si les atacan

– ¿Y por qué esperar? ¡Podríamos dar el primer golpe!

– ¡Cierto! Podríamos llenar la naves de armas y soldados y así cogerlos por sorpresa

– ¡Serán nuestros esclavos!

En otra sala mal iluminada, muy lejos de ahí, otras sombras, puede que humanos, quizás no, tenían la misma conversación.

Leer temperatura y humedad con Arduino Nano 33 BLE Sense (sensor HTS221)

Arduni Nano 33 BLE Sense incluye un sensor (HTS221) para medir la temperatura y la humedad. Su uso es muy sencillo.

Los sensores tienen las siguientes características:

SensorRango de medidaError
Temperatura-40 ºC hasta 120 ºC± 0.5 °C entre los 15 ºC y 40 °C
Humedad0% hasta 100%± 3.5% entre el 20% y el 80%

 Para ver más información del sensor se puede recurrir a su datasheet.

Para leer los datos lo primero es incluir la librería necesaria para leer los datos del sensor. 

#include <Arduino_HTS221.h>

La librería está disponible desde el gestor de librerías del IDE de Arduino, tan solo hay que buscarla por el nombre «Arduino_HTS221» e instalarla.

Una vez instalada su uso es muy sencillo:

  • Se usa HTS.begin() para inicializar la lectura de datos. Devuelve true si todo ha ido bien y false si ha ocurrido algún error.
  • Para leer la temperatura se usa HTS.readTemperature() que devuelve un float con la temperatura en grados Celsius.
  • Para leer la humedad se usa HTS.readHumidity() que devuelve un float con la humedad en porcentaje.
  • Si se desea finalizar el uso del sensor y liberar recursos se llama a HTS.end()

¡Ya esta!. No hay más que hacer.

Veamos uno de los ejemplos que viene con la librería:

#include <Arduino_HTS221.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!HTS.begin()) {
    Serial.println("Failed to initialize sensor!");
    while (1);
  }
}

void loop() {
  // read all the sensor values
  float temperature = HTS.readTemperature();
  float humidity    = HTS.readHumidity();

  // print each of the sensor values
  Serial.print("Temperature = ");
  Serial.print(temperature);
  Serial.println(" °C");

  Serial.print("Humidity    = ");
  Serial.print(humidity);
  Serial.println(" %");

  // print an empty line
  Serial.println();

  // wait 1 second to print again
  delay(1000);
}

Por último, si en lugar de necesitar la temperatura en grados Celsius la necesitas en grados Farenheit, se puede hacer con la siguiente instruccion:

HTS.readTemperature(FAHRENHEIT );

SDR. Usar rtl_433 para obtener los datos de las estaciones meteorológicas de tus vecinos.

Podemos usar nuestro receptor SDR para captar señales usadas en dispositivos domóticos que trabajan en la frecuencia de 433Mhz y 868Mhz entre ellos algunas estaciones meteorológicas que muchas personas instalan en su casa. En lugar de comprar nuestra propia estación vamos a usar nuestro receptor SDR y el software rtl_433 para capturar datos que luego algún sistema nuestro pueda consumir y mostrar.

Empecemos con lo básico usaremos el comando rtl_433 para obtener datos de los dispositivos de IoT cercanos:

rtl_433 

Por defecto escucha en la frecuencia de 433 Mhz, si queremos usar otra frecuencia habitual como 868 Mhz

rtl_433 -f 868M

En los datos que se obtendrán hay todo tipo de dispositivos. El primer paso es filtrar los que nos interesan. Podemos buscar aquellos que tengan campos propios de las estaciones meteorológicas como temperatura y humedad y usar el campo «model» para buscar si es una estación meteorológica o algo que nos pueda servir.

Otro truco es verificar que los datos tienen que cuadrar. Si hace frío y la temperatura es de más de 20 grados es posible que sea un sensor interno. Hay dispositivos que devuelven valores sin sentido seguramente porque no tiene ese sensor. Por ejemplo entre los datos que leo hay un medidor de humedad del suelo que devuelve una temperatura de -88°C.


Cada dispositivo envía los valores de temperatura en grados Celsius o Farenheit. Por suerte podemos convertirlo a Celsius usando el parámetro «-C si» que convierte los valores al sistema internacional. 

rtl_433 -C si

Por ejemplo yo puedo aprovecharme del siguientes dispositivos:

time      : ############
brand     : OS
model     : Oregon-THGR122N                        
House Code: 155
Channel   : 1            
Battery   : 0             
Temperature: 3.90 C       
Humidity  : 70 %

time      : ############
model     : AlectoV1-Rain 
House Code: 139
Channel   : 0            
Battery   : 1             
Total Rain: 286.75 mm     
Integrity : CHECKSUM

Ahora que ya sabes que dispositvos podemos fiarnos y como identificarlos por el campo model tenemos el problema de leer los datos, por suerte rtl_433 permite formatear la salida en varios formatos como: kv, json, csv, mqtt, influx, syslog. Para ello bastacon usar el parámetro -F seguido del formato que queremos y si deseamos guardarlo en un fichero hay que indicarlo con -F formato:nombre_fichero

 rtl_433 -C si -F json:output.json

Cada vez que se lanza sobrescribe el fichero de datos con los nuevos datos.

Hay un último parámetro que puede ser útil para este caso en «-T segundos» que indica cuanto tiempo estará capturando datos rtl_433 antes de cerrarse. Por ejemplo:

 rtl_433 -C si -F json:output.json -T 30

Estará durante 30 segundo capturado datos en formato json y almacenándolos en el fichero «output.json»

Podríamos usar cron para planificar cada cuanto tiempo se lanza ese comando y se actualizan los datos del archivo.

Desventajas:

  • Depende de lo que tengan tus vecinos que puede ser la mejor estación del mercado como la peor del mundo.
  • Cuidado con confundir fuentes de datos (sensores internos y externos)
  • Aunque sea legal hay gente no le gusta que «escuches» sus sensores.

Ventajas:

  • Tienes múltiples fuentes de datos por lo que puede cruzar sus datos
  • Puedes aprovechar datos que no vienen de estaciones meteorológicas, por ejemplo anemómetros colocados en toldos para pleglarlos cuando sopla el viento.
  • Si alguno de los sensores «cae» puedes usar los datos de otros.

Puedes ver un vídeo practico sobre este mismo tema en mi canal de Youtube:

Haz click para ver el vídeo en mi canal de Youtube