Cree su propio dispositivo IoT muy barato


Node MCU es una plataforma para el desarrollo de proyectos IoT que integra el famoso chip ESP8266, el cual se ha extendido enormemente debido a su facilidad para desarrollar proyectos open source  que pueden ademas  pueden   involucrar el IoT. Esta placa  destaca  porque integra capacidades de comunicación via WiFi , conteniendo en su interior  un microprocesador que puede ser programado fácilmente usando el  conocido lenguaje de programación Lua o bien vía Arduino IDE.

Obviamente ante todo no podemos perder de vista su bajisimo precio comparados con otras opciones mucho mas potentes como el ESP32 ( que es su sucesor y mejora en todo excepto en el precio a esta), pero en todo caso para muchos proyectos de IOT es mas qeu suficinete, pues no debemos olvidar  que incluye  el modulo wifi integrado  y un bus GPIO para conectar dispositivos de E/S. Ademas se puede programar con el sistema Arduino lo cual nos aporta un fantástico IDE y un sinfin de manuales y ejemplos de desarrollo.

esp8266

Este modulo es Ideal como una solución independiente en lugar de Arduino además de Wi-Fi  integrado siendo fácil de programar a través del IDE de Arduino (como vamos a ver ) , al igual que un Arduino.
Todos los periféricos con bus I2C puede unirse,por ejemplo Pantallas OLED, pantallas LCD, temperatura, presión, sensores de humedad pueden ser conectados en paralelo. También se puede conectar múltiples DS18B20

Sin embargo, sólo hay una entrada analógica y salida y por ejemplo algunas pantallas táctiles no se pueden conectar con ella.

¿Se pregunta cómo empezar a  desarrollar código  con  su económico ESP8266 ?

Los pasos  a seguir   para conectar un ESP8266     son los siguientes:

  •  Instalación del IDE de Arduino.Si aun no lo tiene instalado ,se puede hacer  desde aqui
  • Instalación  del paquete de la placa ESP8266 en Arduino IDE  siguiendo las instrucciones del sitio : https://github.com/esp8266/Arduino
libreria-arduino-esp8266
  • Instalación de los controladores USB

Es necesario instalar el controlador USB requerido en su ordenador  para que pueda programar el ESP8266.  Independientemente de la opción de firmware que elijamos, primero necesitamos comunicarnos con la placa de desarrollo ESP-12E utilizando la interfaz USB de la computadora.

El módulo USB a Serial UART incluido en la placa es Silicon Labs ‘CP2012, para lo cual generalmente necesitamos instalar los controladores de puerto COM virtual (VCP) fácilmente disponibles para su sistema operativo específico.Una vez instalado, debemos verificar que el CP2102 sea reconocido por su ordenador

Una vez que el controlador está instalado, podemos conectar el cable USB al puerto USB de la computadora y la placa. Después de hacerlo, deberíamos ver el mensaje: software del controlador del dispositivo instalado correctamente.

Además, podemos verificar manualmente que todo funcione correctamente siguiendo estos pasos:

Abra el Administrador de dispositivos (disponible a través del Panel de control → Sistema y seguridad → Administrador de dispositivos en la sección Sistema)
Debajo de la entrada Puertos (COM & LPT), debe haber un puerto abierto llamado USB-SERIAL CP2102 (COM) donde hay un número típicamente mayor o igual a 3.

Ahora que estamos listos para comunicarnos con nuestro ESP8266 a través del CP2102, podemos explorar algunas de las diferentes opciones de firmware disponibles.

configuracion-arduino-ide-con-esp8266

  • En el IDE de Arduino, vaya al menú de herramientas, seleccionada su placa y elija el  puerto al que está conectado su ESP8266.En el ejemplo  es el COM11
configuracuion-puerto-esp8266
  • Ahora  copie el siguiente código  para probar que puede subir y ejecutar código código  en la placa :

/*
 ESP8266 Led Parapadeante
*/

void setup(){

 pinMode(LED_BUILTIN, OUTPUT);// Initializa el  pin de  LED_BUILTIN como salida 

}

void loop() {       // la función de bucle se repite una y otra vez para siempre

digitalWrite(LED_BUILTIN, LOW);// encienda el LED  

delay(1000); //Espera de 1 segundo

digitalWrite(LED_BUILTIN, HIGH);//  Apague el LED haciendo que el voltaje sea ALTO 

delay(2000); // Espere dos segundos  para dejar apagado  LED 

}

El LED azul en el módulo ESP – 01 está conectado a GPIO 1, (que también es el pin TXD, por lo que no podemos usar Serial.print () al mismo tiempo)

Tenga en cuenta que el nivel de voltaje es BAJO  pero en realidad el LED está encendido, porque es bajo en el ESP – 01

En este código se usa  LED_BUILTIN para encontrar el pin con el LED interno  de modo

Como puede apreciar , el código ejecuta un bucle infinito en el que pone el estado bajo  un segundo (encendiendo el led)    para posteriormente forzar a nivel alto  dos segundos(apagando el led  )  y así   indefinidamente gracias al bucle  que se repite indefinidamente

 

Envio de datos a la nube de Cayenne

  • Agregue la biblioteca de Cayenne MQTT a Arduino IDE  desde aqui como un fuchero zip
  • Instale la biblioteca zip descargada en el paso anterior desde Programa -> Incluir biblioteca -> Añadir libreria ZIP. y seleccionar ahora el fichero descargado con anterioridad  Cayenne-MQTT-ESP-master.zip
  • Ya puede crear una cuenta Starter en cayenne ( si aun no la tiene  ya creada)
  • Una vez ya validado vaya a la esquina  superior  izquierda  y pulse sobre el botón verde  add new
interfaz-cayenne
  • Ahora seleccione Generic ESP8266  como la placa y  tome nota  ahora  de los siguintes paraetros ofrecidos por la  pagina:
    •  MQTT USERNAME:
    • MQTT PASSWORD:
    • CLIENT ID:
    • MQTT SERVER:
    • MQTT PORT:
    • NAME YOUR DEVICE (optional):
       
  • Abra el boceto de ejemplo incluido desde Archivo -> Ejemplos -> Cayenne-MQTT-ESP. Modifique el boceto incluido con su información de red y la información de autenticación de Cayenne que recibió al agregar su dispositivo.

Ejemplo de envio temperatura  TMP102

Normalmente se adquiere un placa auxiliar  para el pequeño sensor de temperatura digital TMP102. El TMP102 es un sensor digital (también conocido como I2C TWI), tiene una resolución de 0,0625 ° C, y tiene una precisión de hasta 0,5 ° C, lo cual lo convierte  es un sensor muy práctico pues requiere una muy baja corriente.

La comunicación con el TMP102 se logra a través de una interfaz serie de dos hilos. No existe regulador de tensión de a bordo, por lo que el voltaje suministrado debe estar entre 1,4 a 3.6VDC.

En estas placas los condensadores de filtrado y resistencias de pull-up se incluyen.

tmp102

En el código  siguiente o  muestra cómo enviar datos de temperatura a un sensor TMP102 en Cayenne Dashboard.Obviamente se requiere la Biblioteca de Cayenne para ejecutar este programa (si aún no lo ha hecho, puede instalarlo desde Arduino IDE Library Manager).

conexiones-tmp102-esp8266

Las conexiones como vemos en la iamgen  del  TMP102  al  ESP8266 on la siguintes:

            TMP102         ESP8266

  • [VCC] ————- [3V3]
  • [GND] ————- [GND]
  • [ADD0] ———– [GND]
  • [SDA] ————- [Pin analógico 4] (El SDA puede ser diferente en algunos dispositivos, por ejemplo, para Arduino Mega, el pin SDA es Pin digital 20)
  • [SCL] ———— [Pin analógico 5] (El SCL puede ser diferente en algunos dispositivos, por ejemplo, para Arduino Mega, el pin SCL es Pin digital 21)

Y este esl codigo que subiremos a nuestro ESP8266:

#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#include <CayenneTMP102.h>
#include <CayenneEthernet.h>  // Change this to use a different communication device. See Communications examples.

// Cayenne authentication token. This should be obtained from the Cayenne Dashboard.
char token[] = "AuthenticationToken";

// Virtual Pin of the TMP102 widget.
#define VIRTUAL_PIN V1

// Address used to read from the TMP102. This is determined by the ADD0 pin on the TMP102.
// Connecting it to ground means the sensor will use 0x48 for the address. See the TMP102 datasheet for more info.

const int tmp102Address = 0x48;

TMP102 tmpSensor(tmp102Address);

void setup()
{
Serial.begin(9600);
Wire.begin();
Cayenne.begin(token);
}

void loop()
{
Cayenne.run();
}

// This function is called when the Cayenne widget requests data for the Virtual Pin.
CAYENNE_OUT(VIRTUAL_PIN)
{
// This command writes the temperature in Celsius to the Virtual Pin.
Cayenne.celsiusWrite(VIRTUAL_PIN, tmpSensor.getCelsius());
// To send the temperature in Fahrenheit or Kelvin use the corresponding code below.
//Cayenne.fahrenheitWrite(VIRTUAL_PIN, tmpSensor.getFahrenheit());
//Cayenne.kelvinWrite(VIRTUAL_PIN, tmpSensor.getKelvin());
}

Estos son los pasos resumidos que haremos en el interfaz de Cayenne:


1. En Cayenne Dashboard, agregue un nuevo widget TMP102.
2. Configure el widget en Visualización de valor.
3. Seleccione Virtual Pins y un número de pin virtual.
4. Establezca VIRTUAL_PIN en el número de pin que seleccionó.
5. Adjunte un TMP102 a su  ESP8266.

  1. Establezca la variable tmp102Address para que coincida con ADD0. ADD0 conectado a GND corresponde a una dirección de 0x48.
  2. Establezca la variable del token para que coincida con el token de Arduino desde el Tablero.
  3. Compile y cargue este boceto.
  4. Una vez que el Arduino se conecta al Tablero, debe actualizar automáticamente el widget TMP102 con datos.
Anuncio publicitario

Medidor de energía IoT con Cayenne Dashboard usando PZEM-004T v3 y ESP8266


Debido al aumento de los costos de energía, las personas están encontrando formas de monitorear su consumo de energía para tomar medidas de ahorro de energía para su hogar. El objetivo de este proyecto es hacer un medidor de energía de bricolaje usando el PZEM-004T v3 para monitorear su consumo de energía, y dado que IoT es la nueva norma para el monitoreo remoto, también podemos conectar el medidor de energía con un tablero de IoT a través de Wi-Fi.

Esta conexión la haremos usando el mini microcontrolador ESP8266 para visualizar las lecturas del medidor en línea donde puede acceder usando su ordenador o teléfono inteligente a traves de la app de Cayenne.

Componentes de hardware y software:

Hardware:

  • Medidor de energía PZEM-004T-100A v3
  • ESP8266 con cable ( también nos sirve cualquier controlador de la família ESP8266 como Wemos D1 Mini)
  • Cables de puente macho – hembra
  • Tablero de circuitos

Software:

  • IDE de Arduino

Plataforma en línea:

  • Cayenne IoT

El medidor de energía PZEM-004T-100A v3

  • Rango de medida de 100A utilizando un transformador externo
  • Se utiliza principalmente para medir voltaje CA, corriente, potencia, energía, frecuencia y factor de potencia
  • Sin función de visualización
  • La capa física utiliza la interfaz de comunicación UART a RS485
  • La capa de aplicación utiliza el protocolo Modbus-RTU para comunicarse
  • Los datos se leen a través de la interfaz TTL que se puede conectar directamente con microcontroladores basados ​​en Arduino o ESP sin necesidad de ningún convertidor adicional

CARASTERICTICAS FUNDAMENTALES:

Tipo de producto:Módulo de comunicación AC

Modelo de producto:PZEM-004T

Función del producto:

Este documento describe la especificación del módulo de comunicación de CA PZEM-004T, el módulo se utiliza principalmente para medir la tensión de CA, la corriente, la potencia activa, la frecuencia, el factor de potencia y la energía activa, el módulo es sin función de visualización, los datos se leen a través de la interfaz TTL.

PZEM-004T-10A: Rango de medición 10A (Shunt incorporado)

PZEM-004T-100A: Rango de medición 100A (transformador externo)

Rango de medición:

Tensión
Rango de medición:80~260V
Resolución: 0.1V
Precisión de medición: 0,5%.
Corriente
Rango de medición: 0~10A(PZEM-004T-10A); 0~100A(PZEM-004T-100A)
Corriente de medición inicial: 0,01A(PZEM-004T-10A); 0,02A(PZEM-004T-100A)
Resolución: 0.001A
Precisión de medición: 0,5%.
Potencia activa
Rango de medición: 0~2.3kW(PZEM-004T-10A); 0~23kW(PZEM-004T-100A)
Potencia de medición inicial: 0,4W
Resolución: 0.1W
Formato de visualización:
<1000W, muestra un decimal, como: 999.9W

≥1000W, muestra sólo números enteros, como: 1000W

Precisión de medición: 0,5%.
Factor de potencia
Rango de medición: 0.00~1.00
Resolución: 0.01
Precisión de medición: 1%.
Frecuencia
Rango de medición: 45Hz~65Hz
Resolución: 0,1Hz
Precisión de medición: 0,5%.
Energía activa
Rango de medición: 0~9999.99kWh
Resolución: 1Wh
Precisión de medición: 0,5%.
Formato de visualización:
<10kWh, la unidad de visualización es Wh(1kWh=1000Wh), como: 9999Wh

≥10kWh, la unidad de visualización es kWh, como por ejemplo 9999.99kWh

Restablecimiento de la energía: utilice el software para restablecer.
Alarma de sobre potencia
El umbral de potencia activa se puede establecer, cuando la potencia activa medida supera el umbral, puede alarmar

Interfaz de comunicación
Interfaz TTL。

Protocolo de la capa física
La capa física utiliza la interfaz de comunicación UART a TTL

La velocidad de transmisión es de 9600, 8 bits de datos, 1 bit de parada, sin paridad

¿Cómo mide?

El medidor utiliza un transformador de corriente para medir la corriente. Está diseñado para producir una corriente alterna en su devanado secundario que es proporcional a la corriente que se mide en su primario. Reduce las corrientes de alto voltaje a un valor mucho más bajo y proporciona una forma conveniente de monitorear de manera segura la corriente eléctrica real que fluye en una línea de transmisión de CA.

INSTALAR ESP8266 EN IDE ARDUINO

Actualmente configurar el entorno de Arduino para funcionar con las placas de desarrollo de ESP8266 es muy sencillo,gracias al soporte que ha recibido de la comunidad, que hace que lo tengamos disponible como un paquete que podemos descargar y añadir al gestor de placas.

Para poder programar las placas de desarrollo basadas en el ESP8266 simplemente tendremos que configurar la URL del paquete para que podamos agregarlas al gestor de placas del IDE de Arduino.

Para ello accedemos al menú de configuración y en “Gestor de URLs adicionales de tarjeta” hacemos click en el pequeño botón de la derecha.

En la ventana que aparece, añadimos esta la siguiente URL.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Si teníamos otras direcciones, dejamos cada una de ellas en una línea.

Ahora entramos en el gestor de tarjetas del IDE de Arduino.

Buscamos el paquete de placas de desarrollo basadas en el ESP8266 y lo instalamos.

Ya tenemos disponibles las placas de desarrollo basadas en el ESP8266 para programarlas con el IDE de Arduino. ¡Así de fácil!

En la próxima entrada profundizaremos en cómo programar ESP8266 con el IDE de Arduino, y veremos las similitudes y diferencias entre programar un Arduino convencional y una placa basada en el ESP8266.

Plataforma en línea:

  •  Cayenne IoT
  • Cayenne es el primer generador de proyectos de IoT de arrastrar y soltar del mundo que permite a los desarrolladores, diseñadores e ingenieros crear rápidamente prototipos y compartir sus proyectos de dispositivos conectados.
  • Cayenne se diseñó para ayudar a los usuarios a crear prototipos de Internet de las cosas y luego llevarlos a producción
  • Cayenne es un producto de myDevices que le permite no solo mostrar datos, sino también configurar disparadores, monitorear dispositivos, controlar dispositivos, etc.
  • La API de Cayenne MQTT se utiliza para conectar cualquier dispositivo que tenga con Cayenne Cloud

¿Qué es MQTT?MQTT significa 

transporte de telemetría de Message Queue Server. Es un protocolo de mensajería extremadamente simple y liviano (suscripción y publicación) diseñado para dispositivos limitados y redes con alta latencia, bajo ancho de banda o redes poco confiables. Con MQTT, los dispositivos IoT con recursos limitados pueden enviar o publicar información sobre un tema específico a un servidor que actúa como 

intermediario de mensajes MQTT. Luego, el corredor transmite la información a aquellos clientes que se han suscrito previamente al tema del cliente. Para este proyecto, 

Cayenne Dashboard actúa como intermediario de mensajes MQTT.

Configuración de hardware:

 Diagrama esquemático:

Conexiones:

  • PZEM-004T-100A v3
    • Conexión de carga
      • Transformador de corriente (CT) Cable VCC conectado a PZEM-004T v3 Live (+) Terminal 
      • Transformador de corriente (CT) Cable GND conectado al terminal neutro (-) PZEM-004T v3 
      • Cable de carga viva (+) conectado al terminal de carga viva (+) PZEM-004T v3 
      • Cable de carga neutra (-) conectado a la terminal de carga  neutra  (-)  PZEM-004T v3 
    • Conexión ESP8266
      • Cable VCC conectado al pin 3.3v
      • Cable GND conectado al pin GND
      • El cable TX (transmisión) está conectado al pin D7
      • El cable RX (recepción) está conectado al pin D8
  • ESP8266
    • Pin VCC conectado al cable PZEM-004T v3 VCC
    • Pin GND conectado al cable PZEM-004T v3 GND
    • Pin D7 (RX) conectado al cable PZEM-004T v3 TX
    • Pin D8 (TX) conectado al cable PZEM-004T v3  RX

Configuración del programa:

Antes de configurar el código Arduino, debemos instalar la placa ESP8266 en el IDE de Arduino.

Instalación de soporte de placa ESP8266:

  • Haga clic en la  sección Preferencias en el IDE
  • Descarga el paquete esp8266 en el Board Manager
  • Después de agregar la placa ESP8266, debe conectarse con el panel Cayenne.

Cayenne Dashboard ESP8266 Configuración + Conexión: 

  • Después del registro de la cuenta (ES GRATUITO ), agregue un nuevo dispositivo para conectarse al tablero 
  • Elija Generic ESP8266  en la sección de Microcontroladores
  • Antes de conectar debemos descargar la  librería Cayenne MQTT ESP  en Github
  • Haga clic en el  boceto ESP8266  en el ejemplo Cayenne MQTT ESP 
  •  Antes de ejecutar el boceto, copie las credenciales de Cayenne MQTT proporcionadas
  • Edite las credenciales de Cayenne junto con las credenciales de Wi-Fi en el boceto
  • Ejecute el boceto y espere hasta que ESP8266 esté conectado a Cayenne
  • El ESP8266 por fin está conectado al salpicadero 
  • Después de configurar el tablero Cayenne, debemos probar el medidor PZEM-004T V3 antes de interactuar con el tablero.
  • Cargar el siguiente código en el IDE de Arduino  y desplegarlo sobre el ESP8266

//Libraries
#include <Arduino.h>
#include <PZEM004Tv30.h>

//PZEM object constructor
PZEM004Tv30 pzem(D7,D8);
//PZEM004Tv30 pzem(1,3);
void setup() {
  Serial.begin(115200);

  while(!Serial); 
  delay(100);
  
  Serial.println("PZEM-004T con NodeMcu 1.0 (Esp-12e Module)Test"); 
}

void loop() {
  Serial.println("Midiendo...");
  //Result Variables
  float volts = pzem.voltage();
  float amps = pzem.current();
  float watts = pzem.power();
  float kiloWatts = pzem.energy();
  float hertz = pzem.frequency();
  float factor = pzem.pf();

  delay(2000);

  Serial.println("");

  Serial.println("Resultados:");
  Serial.println("");

  Serial.print("Voltaje: "); Serial.print(volts,3); Serial.println("V");
  Serial.print("Corriente: "); Serial.print(amps,3); Serial.println("A");
  Serial.print("Potencia: "); Serial.print(watts,3); Serial.println("W");
  Serial.print("Energia: "); Serial.print(kiloWatts,3); Serial.println("kWh");
  Serial.print("Frequencia: "); Serial.print(hertz,2); Serial.println("Hz");
  Serial.print("Factor de potencia: "); Serial.println(factor,3);

  Serial.println("");
  
  delay(2000);
}







Desglose del código:

Bibliotecas :

  • Arduino.h
    • El soporte ESP8266 para Arduino 
    • Capaz de escribir bocetos, usar funciones y bibliotecas de Arduino
    • Ejecute bocetos sin necesidad de un microcontrolador externo
    • Biblioteca integrada en el IDE
    • Más información sobre la biblioteca, junto con la configuración de ESP8266 Arduino en Github 
  • PZEM004Tv30.h
    • Biblioteca de medidores de energía Peacefair (PZEM-004T v3)
    • Versión actualizada de la biblioteca PZEM-004T anterior para admitir versiones más nuevas
    • Proporciona funciones completas del monitor de energía PZEM-004T v3
    • Más información sobre la biblioteca y enlace de descarga en Github 
    • También se puede descargar en Arduino Library Manager

Variables:

  • PZEM004Tv30 pzem(D7,D8)
    • El constructor de objetos para el medidor de energía junto con las conexiones de pin
  • Voltaje
    • Valor del sensor de tensión en voltios (V)
  • Actual
    • Valor del sensor de corriente en amperios (A)
  • Energía
    • Valor del sensor de potencia en vatios (W)
  • Energía
    • Valor del sensor de energía en kilovatios hora (kWh)
  • Frecuencia
    • Valor del sensor de frecuencia en hercios (Hz)
  • Factor de potencia
    • Resultado calculado basado en los valores del sensor

Funciones:

  • pzem.voltaje()
    • obtener valor de voltaje
  • pzem.actual()
    • obtener el valor actual
  • pzem.power()
    • obtener valor de potencia
  • pzem.energy()
    • obtener valor de energía
  • pzem.frecuencia()
    • recuperar valor de frecuencia
  • pzem.pf()
    • obtener el valor del factor de potencia

Después de probar el sensor SIN CONEXION , ahora podemos conectarlo con el tablero de Cayenne para cargar lecturas de energía en línea.

Con el siguiente código que subiremos al ESP8266 si lo personalizamos con nuestras propias claves (estan marcadas tachadas) podemos probar

Code (PZEM-004T V3 with Cayenne Dashboard): 
//Libraries
#include <Arduino.h>
#include <CayenneMQTTESP8266.h>
#include <PZEM004Tv30.h>

//Debug Cayenne Connection
#define CAYENNE_DEBUG

//Enable Serial Print
#define CAYYENE_PRINT Serial

//Canales de Cayenne para mostrar los datos
#define VOLTAGE_CHANNEL 1 //voltage
#define CURRENT_CHANNEL 2 //current
#define POWER_CHANNEL 3 //power
#define ENERGY_CHANNEL 4 //energy
#define FREQUENCY_CHANNEL 5 //frequency
#define POWERFACTOR_CHANNEL 6 //power factor

//RX pin = D7 connected to the TX pin of PZEM-004T v3
//TX pin = D8 connected to the RX pin of PZEM-004T v3

//Constructor del dispositivo  Peacefair 
PZEM004Tv30 pzem(D7,D8); 

//Credencial de la WiFi a la que se conectara para el envio. 
char ssid[] = "HOTSPOTniKOYA";
char wifiPassword[] = "09771665851";

//ESP8266 Información para la autenticacion de Cayenne obtenida de Cayenne Dashboard.

char username[] = "439049b0-0660-11ed-8df2-dd50487e509b";
char password[] = "1f5cf9c47e9fc2b28eaa1ffb054b62003a71127a";
char clientID[] = "349a2920-1bf1-11ed-baf6-35fab7fd0ac8";

//Meter values
float Voltage;
float Current;
float Power;
float Energy;
float Frequency;
float PowerFactor;

void setup() {
  Serial.begin(115200);

  //Esperar a que  Serial Monitor se abra antes de proceder
  while(!Serial);
  delay(100);
  
  //Start Cayenne connection 
  Cayenne.begin(username, password, clientID, ssid, wifiPassword);

  Serial.println("PZEM-004T-100A Energy Meter Cayenne Interface using ESP8266 ( o un Wemos D1 Mini)");
  Serial.println("");
}

void loop() {
  //get meter values
  Voltage = pzem.voltage();
  Current = pzem.current();
  Power = pzem.power();
  Energy = pzem.energy();
  Frequency = pzem.frequency();
  PowerFactor = pzem.pf();
  
  Cayenne.loop();
}

//Display Voltage Value
CAYENNE_OUT(VOLTAGE_CHANNEL)
{ 
  Serial.println("Resultados de las medidas: ");  
  Cayenne.virtualWrite(VOLTAGE_CHANNEL, Voltage);
  Serial.print("Voltaje: "); Serial.print(Voltage,3); Serial.println("V");
}

//Display Current Value
CAYENNE_OUT(CURRENT_CHANNEL)
{   
  Cayenne.virtualWrite(CURRENT_CHANNEL, Current);
  Serial.print("Corriente: "); Serial.print(Current,3); Serial.println("A");
}

//Display Power Value
CAYENNE_OUT(POWER_CHANNEL)
{   
  Cayenne.virtualWrite(POWER_CHANNEL, Power);
  Serial.print("Potencia: "); Serial.print(Power,3); Serial.println("W");
}

//Display Energy Value
CAYENNE_OUT(ENERGY_CHANNEL)
{   
  Cayenne.virtualWrite(ENERGY_CHANNEL, Energy);
  Serial.print("Energia: "); Serial.print(Energy,3); Serial.println("kWh");
}

//Display Frequency Value
CAYENNE_OUT(FREQUENCY_CHANNEL)
{   
  Cayenne.virtualWrite(FREQUENCY_CHANNEL, Frequency);
  Serial.print("Frequencia: "); Serial.print(Frequency,2); Serial.println("Hz");
}

//Display Power Factor Value
CAYENNE_OUT(POWERFACTOR_CHANNEL)
{   
  Cayenne.virtualWrite(POWERFACTOR_CHANNEL, PowerFactor);
  Serial.print("Factor de Potencia: "); Serial.println(PowerFactor,3);
  Serial.println("");
}

Desglose del código:

Bibliotecas:

  • Arduino.h
    • El soporte ESP8266 para Arduino 
    • Capaz de escribir bocetos, usar funciones y bibliotecas de Arduino
    • Ejecute bocetos sin necesidad de un microcontrolador externo
    • Biblioteca integrada en el IDE
    • Más información sobre la biblioteca, junto con la configuración de ESP8266 Arduino en Github 
  • CayenneMQTTESP8266.h
    • Biblioteca Cayenne MQTT ESP para la conexión del generador de proyectos Cayenne IoT
    • Admite módulos Wi-Fi ESP8266 y ESP32
    • Leer y enviar datos a Cayenne Dashboard
    • Más información sobre la biblioteca y enlace de descarga en Github
  • PZEM004Tv30.h
    • Biblioteca de medidores de energía Peacefair (PZEM-004T v3)
    • Versión actualizada de la biblioteca PZEM-004T anterior para admitir versiones más nuevas
    • Proporciona funciones completas del monitor de energía PZEM-004T v3
    • Más información sobre la biblioteca y enlace de descarga en Github
    • También se puede descargar en Arduino Library Manager

Variables:
@PZEM-004T v3

  • PZEM004Tv30 pzem(D7,D8)
    • El constructor de objetos para el medidor de energía junto con las conexiones de pin
  • Voltaje
    • Valor del sensor de tensión en voltios (V)
  • Actual
    • Valor del sensor de corriente en amperios (A)
  • Energía
    • Valor del sensor de potencia en vatios (W)
  • Energía
    • Valor del sensor de energía en kilovatios hora (kWh)
  • Frecuencia
    • Valor del sensor de frecuencia en hercios (Hz)
  • Factor de potencia
    • Resultado calculado basado en los valores del sensor

@Cayenne

  • CAYENNE_DEBUG
    • Habilita la impresión en serie de Cayenne
  • Serie CAYENNE_PRINT
    • Habilita el monitor serie para imprimir datos
  • VOLTAJE_CANAL 1
    • El canal Cayenne asignado para proyectar lecturas de voltaje del medidor
  • CANAL_ACTUAL 2
    • El canal Cayenne asignado para proyectar lecturas actuales del medidor
  • POTENCIA_CANAL 3
    • El canal Cayenne asignado para proyectar lecturas de energía del medidor
  • ENERGÍA_CANAL 4
    • El canal Cayenne asignado para proyectar lecturas de energía del medidor
  • FRECUENCIA_CANAL 5
    • El canal Cayenne asignado para proyectar lecturas de frecuencia del medidor
  • FACTOR DE POTENCIA_CANAL 6
    • El canal Cayenne asignado para proyectar lecturas de factor de potencia del medidor
  • sid[]
    • El nombre de la conexión Wi-Fi para conectar el Wemos D1 mini
  • Contraseña de wifi[]
    • La contraseña de conexión Wi-Fi para conectar el Wemos D1 mini
  • nombre de usuario char[]
    • Nombre de usuario de Cayenne del dispositivo (proporcionado en el código de enlace de Cayenne)
  • contraseña de char[]
    • Contraseña de Cayenne del dispositivo (proporcionada en el código de enlace de Cayenne)
  • ID de cliente char[]
    • ID de cliente de Cayenne del dispositivo (proporcionado en el código de enlace de Cayenne)

Funciones:
@PZEM-004T V3

  • pzem.voltaje()
    • obtener valor de voltaje
  • pzem.actual()
    • obtener el valor actual
  • pzem.power()
    • obtener valor de potencia
  • pzem.energy()
    • obtener valor de energía
  • pzem.frecuencia()
    • recuperar valor de frecuencia
  • pzem.pf()
    • obtener el valor del factor de potencia

@Cayenne

  • Cayenne.begin(nombre de usuario, contraseña, ID de cliente)
    • Inicia la conexión de cayena
    • Muestra el estado de la conexión en el monitor serie
  • Cayenne.loop()
    • Llama a la clase CAYENNE_OUT(VIRTUAL_CHANNEL) 
  • Cayenne.virtualWrite(Canal, Salida)
    • Mostrar los valores del medidor en el monitor serial
    • Sube los valores de salida al canal virtual del tablero

Y una vez que llevamos un rato con el montaje funcionando este es el resultado

NOTAS IMPORTANTES:

  • Si conectamos el PZEM004 a un ESP8266, la tension de alimentación para la sincronizacion del canal de comunicaciones es 3,3V (en caso de un Wemos seria de 5v)
  • Para que las medidas sean correctas los leds TX y RX del PZEM004 deben parpadear rápido y con luz tenue. Si alguno de los leds TX o RX se queda fijo esto significa que o bien alguna conexión es incorrecta o no se ha actualizado el firmware del controlador , de modo que si consultamos la consola serie veremos que las medidas no son correctas ( el IDE de Arduino las pinta como nan). Ver la imagen de abajo donde se aprecia este error.
  • En caso de que no se pueda programar el controlador ESP8266 desde el IDE de Arduino un truco consiste en desconectar la línea de 3.3V hacia la salida RS425 antes de compilar el código.
  • A veces es necesario reiniciar tanto el PZEM004 como el ESP8266 si no hay resultados correctos .
  • Si no tenemos la consola serie para saber si está sacando datos correctos ( es decir que no saca los valores nan) una buena referencia son los dos leds (tX y RX) del PZEM004 qeu deben lucir a la vez a intervalos regulares ( según el delay definido en el bucle principal)
  • Debemos programar el controlador antes de conectar la salida RS425 del PZEM004 para evitar problemas
  • Se ha usado un ESP8266 ( aunque se puede usar cualquiera similar que pertenezca a esta familia) para que no de problemas el api de Cayenne . Para usar un ESP32 se debe seleccionar en el interfaz el Esp826 pues funciona también con la familia del ESP32 , si bien la llibreria es CayenneMQTTESP32.h

Más información en

Más información en https://cayenne.mydevices.com/

Medidor de energía doméstico simple Arduino


Michaele Klements nos apunta que para obtener mediciones perfectamente precisas, necesitamos monitorear tanto el voltaje de suministro como la corriente, pero para un monitoreo doméstico simple que brinde estimaciones de costos al mínimo de centavos, ¿por qué no simplificar las cosas?

Entonces, este simple medidor propuesto por Michaele mide la corriente de suministro a su hogar a través de un CT (transformador de corriente) y luego hace un par de cálculos para darle su corriente, potencia, potencia máxima y kilovatios hora consumidos. También es muy fácil agregar su tarifa local y mostrar el costo de la electricidad utilizada hasta la fecha.

Es evidente además que este circuito puede ser la base para volcar los datos a una BBDD o simplemente usando una plataforma de IoT como por ejemplo Cayenne , poder consultas las medidas online , obtener el histórico, realizar acciones correctoras , etc

Los mínimos componentes que necesitará para un medidor de energía doméstico de este tipo son los siguientes:

  • Arduino Uno ( o similar ) 
  • Pantalla LCD (o pantalla LCD-  
  • CT – Talema AC1030
  • Resistencia de carga de 56Ω
  • Condensador de 10 µF
  • 2 resistencias divisoras de 100K

En el siguiente video podemos ver el montaje del circuito así como una pequeña demostración del proyecto en funcionamiento

Cómo hacer el medidor de energía

Primero, debe comenzar ensamblando los componentes en el CT o en su placa de pruebas para crear su sensor actual que produce una señal que su Arduino puede entender. Un Arduino solo tiene entradas de voltaje analógicas que miden 0-5 V CC, por lo que debe convertir la salida de corriente del CT en una referencia de voltaje y luego escalar la referencia de voltaje en un rango de 0-5 V.

Ensamblaje

Si va a instalar su medidor de potencia en algún lugar de forma permanente, es posible que desee soldar las resistencias y el condensador directamente en el TC para que no se suelten. Si simplemente está probando este proyecto por diversión, entonces una placa de pruebas es perfecta.

El circuito básico para la conexión del CT al Arduino se muestra en el siguiente diagrama:

energy-meter-wiring-diagram

A continuación se muestra un diseño de circuito de tablero. Tenga en cuenta que TinkerCAD no es compatible con un transformador de corriente. Por tanto, se ha utilizado un generador de señales para generar una señal de ejemplo:

Arduino home energy meter

El blindaje de la pantalla LCD ya se activa en las entradas analógicas, pero el blindaje solo utiliza A0. Simplemente suelde los tres cables de su sensor de corriente en los encabezados de los pines en el escudo y use A1 como su entrada de sensor como se muestra a continuación.

current-sensor-connections

Una vez que haya conectado todos sus componentes, debe conectar su sensor a lo que desea monitorear. Si desea monitorear un par de aparatos, entonces debe conectar el CT al cable de entrada de un enchufe múltiple, todo lo que conecte al enchufe múltiple luego se contará.

Alternativamente, puede conectar el CT directamente a la red eléctrica de su hogar y monitorear el uso de toda la casa como se ha hecho aquí. De cualquier manera, debe colocar el CT alrededor de uno de los cables de suministro, preferiblemente el cable rojo «vivo». Asegúrese de ponerlo solo alrededor de 1, ya que no funcionará si está alrededor de ambos y no se puede conectar alrededor del cable de tierra (cable amarillo, verde pelado) ya que la energía no se extrae a través de este cable. Si lo está conectando a la red, conéctelo a uno de los cables de salida después del interruptor principal como se muestra a continuación.

NB: tenga cuidado al conectar el medidor de potencia a la red eléctrica de su hogar y asegúrese de que la alimentación de su placa esté apagada antes de hacer nada en la caja de red. No retire ningún cable ni quite ningún tornillo antes de consultar con su autoridad local, puede requerir que un electricista certificado le instale el CT.

Elegir diferentes componentes

Básicamente, hay cuatro componentes que deben elegirse o dimensionarse correctamente para su medidor de energía.

Elegir un transformador de corriente

El primero es el CT o transformador de corriente. El que se utiliza aquí es el Talema AC1030 que puede detectar una corriente nominal de 30 A y una corriente máxima de 75 A. A 220 VCA, teóricamente puede detectar hasta 16,5 kW durante cortos períodos de tiempo, pero está dimensionado para detectar continuamente 6,6 kW, lo que es adecuado para un hogar pequeño. Para calcular cuántos amperios necesita detectar el suyo, tome la potencia continua máxima que espera detectar y divídala por su voltaje (generalmente 110 V o 220 V según su país).

Dimensionamiento de la resistencia de carga

A continuación, debe dimensionar su resistencia de carga R3, esto convierte su corriente CT en una referencia de voltaje. Comience dividiendo su corriente primaria (el máximo como se usó anteriormente) por la relación de vueltas de su CT (disponible en la hoja de datos). Esto debería estar alrededor de 500-5000 a 1. Este artículo trabajó en 42A con una relación de vueltas de 1000: 1 dando una corriente secundaria de 0.042A o 42mA. Su voltaje de referencia analógica para el Arduino es de 2.5V, por lo que para determinar la resistencia usa R = V / I – R = 2.5 / 0.042 = 59.5Ω. El valor de resistencia estándar más cercano es 56 Ω, por lo que se utilizó este.

Aquí hay algunas opciones en diferentes TC y sus resistencias de carga ideales (en tamaños estándar):

  • Murata 56050C – 10A – 50: 1 – 13Ω
  • Talema AS-103 – 15A – 300: 1 – 51Ω
  • Talema AC-1020 – 20A – 1000: 1 – 130Ω
  • Alttec L01-6215 – 30A – 1000: 1 – 82Ω
  • Alttec L01-6216 – 40A – 1000: 1 – 62Ω
  • Talema ACX-1050 – 50A – 2500: 1 – 130Ω
  • Alttec L01-6218 – 60A – 1000: 1 – 43Ω
  • Talema AC-1060 – 60A – 1000: 1 – 43Ω
  • Alttec L01-6219 – 75A – 1000: 1 – 33Ω
  • Alttec L01-6221 – 150A – 1000: 1 – 18Ω
  • CTYRZCH SCT-013-000 – 100A – Resistencia de carga incorporada – 
  • TOOGOO SCT-013-000 – 100A – 

El condensador utilizado es de 10 µF, que debería ser suficiente para la mayoría de los rangos de TC para aplicaciones domésticas.

Finalmente, necesita dos resistencias divisorias para obtener el voltaje de referencia de 2.5V del Arduino. Deben tener el mismo valor, por lo que R1 = R2 y no necesitamos mucha corriente, por lo que este artículo usa dos resistencias de 100K.

firmware

#include <LiquidCrystal.h>

int currentPin = 1; // Asignar entrada CT al pin 1
doubles kilos= 0;
int PeakPower = 0;
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); // Asignar pines de pantalla LCD, según los requisitos de pantalla LCD

void setup () 
{ 
  lcd.begin (16,2); // columnas filas. utilice 16,2 para una pantalla LCD de 16x2, etc.
  lcd.clear ();
  lcd.setCursor (0,0); // coloca el cursor en la columna 0, fila 0 (la primera fila)
  lcd.print ("En ejecución");
}

void loop () 
{ 
  int actual = 0;
  int maxCurrent = 0;
  int minCurrent = 1000;
  for (int i = 0; i <= 200; i ++) // Supervisa y registra la entrada de corriente durante 200 ciclos para determinar                                                                     la corriente máxima y mínima
  {
    current = analogRead (currentPin); // Lee la entrada actual y registra la corriente máxima y mínima
    if(actual> = maxCurrent)
      maxCurrent = actual;
    else if (actual <= minCurrent)
      minCurrent = actual;
  }
  if (maxCurrent <= 517)
  {
    maxCurrent = 516;
  }
  doble RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337; // Calcula la corriente RMS según el valor máximo
  int RMSPower = 220 * RMSCurrent; // Calcula la potencia RMS asumiendo un voltaje de 220 VCA, cambie a 110 VCA en consecuencia
  if (RMSPower> peakPower)
  {
    PeakPower = RMSPower;
  }
  kilos = kilos + (RMSPower * (2.05 / 60/60/1000)); // Calcule los kilovatios hora utilizados
  delay (2000);
  lcd.clear ();
  lcd.setCursor (0,0); // Muestra todos los datos actuales
  lcd.print (RMSCurrent);
  lcd.print ("A");
  lcd.setCursor (10,0);
  lcd.print (RMSPower);
  lcd.print ("W");
  lcd.setCursor (0,1);
  lcd.print (kilos);
  lcd.print ("kWh");
  lcd.setCursor (10,1);
  lcd.print (PeakPower);
  lcd.print ("W");
}

Aquí está el enlace para descargar el  código del medidor .

Debido a que su configuración, CT, resistencias y voltaje de entrada pueden ser diferentes, hay un factor de escala en el esquema que deberá cambiar antes de obtener resultados precisos; consulte la calibración a continuación. Si su pantalla LCD está conectada a los mismos pines que se utilizan aquí y su CT está conectado al mismo pin de entrada, al menos debería llenar la pantalla con algunas cifras, aunque lo más probable es que sean incorrectas y algunas pueden ser negativas.

Si no desea usar o no tiene una pantalla LCD, también puede modificar el boceto para enviarlo a la ventana serial del Arduino IDE como se muestra a continuación.

// Michael Klements
// La vida del bricolaje
// 27 de octubre de 2014

int currentPin = 1; // Asignar entrada CT al pin 1
double kilos  = 0;
int PeakPower = 0;

void setup () 
{ 
  Serial.begin (9600); // Iniciar la comunicación en serie
  Serial.println ("En ejecución");
}

void loop () 
{ 
  int actual = 0;
  int maxCurrent = 0;
  int minCurrent = 1000;
  for (int i = 0; i <= 200; i ++) // Supervisa y registra la entrada de corriente durante 200 ciclos para determinar la corriente máxima y mínima
  {
    current = analogRead (currentPin); // Lee la entrada actual y registra la corriente máxima y mínima
    if (actual> = maxCurrent)
      maxCurrent = actual;
    else if (actual <= minCurrent)
      minCurrent = actual;
  }
  if (maxCurrent <= 517)
  {
    maxCurrent = 516;
  }
  double RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337; // Calcula la corriente RMS según el valor máximo
  int RMSPower = 220 * RMSCurrent; // Calcula la potencia RMS asumiendo un voltaje de 220 VCA, cambie a 110 VCA en consecuencia
  if (RMSPower> peakPower)
  {
    PeakPower = RMSPower;
  }
  kilos = kilos + (RMSPower * (2.05 / 60/60/1000)); // Calcule los kilovatios hora utilizados
  delay (2000);
  Serial.print (RMSCurrent);
  Serial.println ("A");
  Serial.print (RMSPower);
  Serial.println ("W");
  Serial.print (kilos);
  Serial.println ("kWh");
  Serial.print (peakPower);
  Serial.println ("W");
}

Aquí está el enlace para descargar el código de salida serial del medidor .

Actualización de código

El código original del Energy Meter hacía uso de un período de tiempo fijo para calcular los kilovatios hora consumidos, esto se basaba en un tiempo de ciclo de 2050 ms y era bastante preciso.

Desde entonces, el código ha sido modificado para hacer uso de la función millis () incorporada que calcula el tiempo de ciclo exacto para cada ciclo con el fin de mejorar la precisión. Solo mejora alrededor del medio por ciento en la precisión del cálculo, pero es la mejor manera de hacerlo.

Aquí está el código mejorado:

#include <LiquidCrystal.h>

int currentPin = 1; // Asignar entrada CT al pin 1
duobles kilos = 0;
int PeakPower = 0;
unsigned long startMillis;
unsigned long endMillis;
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); // Asignar pines de pantalla LCD, según los requisitos de pantalla LCD

void setup () 
{ 
  lcd.begin (16,2); // columnas filas. utilice 16,2 para una pantalla LCD de 16x2, etc.
  lcd.clear ();
  lcd.setCursor (0,0); // coloca el cursor en la columna 0, fila 0 (la primera fila)
  lcd.print ("Arduino");
  lcd.setCursor (0,1); // coloca el cursor en la columna 0, fila 1 (la segunda fila)
  lcd.print ("Medidor de energía");
  startMillis = millis ();
}

void loop () 
{ 
  int actual = 0;
  int maxCurrent = 0;
  int minCurrent = 1000;
  for (int i = 0; i <= 200; i ++) // Supervisa y registra la entrada de corriente durante 200 ciclos para determinar la corriente máxima y mínima
  {
    current = analogRead (currentPin); // Lee la entrada actual y registra la corriente máxima y mínima
    if (actual> = maxCurrent)
      maxCurrent = actual;
    else if (actual <= minCurrent)
      minCurrent = actual;
  }
  if (maxCurrent <= 517)
  {
    maxCurrent = 516;
  }
  double RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337; // Calcula la corriente RMS según el valor máximo
  int RMSPower = 220 * RMSCurrent; // Calcula la potencia RMS asumiendo un voltaje de 220 VCA, cambie a 110 VCA en consecuencia
  if (RMSPower> peakPower)
  {
    PeakPower = RMSPower;
  }
  endMillis = millis ();
  tiempo_largo_sin_firmar = endMillis - startMillis;
  kilos = kilos + ((doble) RMSPower * ((doble) tiempo / 60/60/1000000)); // Calcule los kilovatios hora utilizados
  startMillis = millis ();
  delay (2000);
  lcd.clear ();
  lcd.setCursor (0,0); // Muestra todos los datos actuales
  lcd.print (RMSCurrent);
  lcd.print ("A");
  lcd.setCursor (10,0);
  lcd.print (RMSPower);
  lcd.print ("W");
  lcd.setCursor (0,1);
  lcd.print (kilos);
  lcd.print ("kWh");
  lcd.setCursor (10,1);
  lcd.print (PeakPower);
  lcd.print ("W");
}

Aquí está el enlace para descargar el  código actualizado de  Millis Meter .

Para aquellos de ustedes que han leído que la función millis () se desborda después de aproximadamente 49 días, el código trata el rollover automáticamente haciendo uso de la variable larga sin firmar. Por ejemplo, si el desbordamiento ocurre en 10000, el milis inicial fue 9987 y el milis final fue 2031, la diferencia sería 2031-9987 = -7956 pero el valor no puede ser negativo ya que no está firmado, por lo que se convierte en -7956+ 10000 = 2044 que es la duración correcta.

Calibrar la lectura actual

Como se mencionó anteriormente, debido a que su configuración, CT, resistencias y voltaje de entrada pueden ser diferentes, hay un factor de escala en el esquema que deberá cambiar antes de obtener resultados precisos.

Para calibrar su medidor de energía, debe estar seguro de que la corriente que su medidor dice que se está extrayendo es la que espera que realmente se extraiga. Para hacer esto con precisión, necesita encontrar una carga calibrada. Estos no son fáciles de conseguir en un hogar normal, por lo que deberá encontrar algo que use una cantidad de energía establecida y constante. Usé un par de bombillas incandescentes y focos, estos vienen en una variedad de tamaños y su consumo es bastante cercano a lo que se indica en la etiqueta, es decir, una bombilla de 100W usa muy cerca de 100W de potencia real, ya que es casi completamente una carga puramente resistiva.

Enchufe una bombilla pequeña (100 W más o menos) y vea qué carga se muestra. Ahora deberá ajustar los usos del factor de escala en la línea de cálculo:

doble RMSCurrent = ((maxCurrent – 516) * 0,707) / 11,8337

En este caso fue 11.8337, puede ser mayor o menor dependiendo de su aplicación. Utilice una escala lineal para calcular esta cifra o, si no es bueno con las matemáticas, juegue con diferentes valores hasta que la carga que ha conectado se muestre en la pantalla del medidor de energía.

Una vez que haya calibrado su medidor de energía, lo reinicia y deja que haga su trabajo. A continuación se muestran dos imágenes en uso, ambas con una entrada de baja potencia y una entrada de alta potencia.

arduino-energy-meter-low-consumption

El primer número que se muestra es la corriente instantánea seguida de la potencia instantánea. En la línea inferior, los kilovatios hora utilizados desde el reinicio y luego la potencia máxima registrada desde el reinicio.

arduino-energy-meter-high-consumption

Monitor inteligente de Calidad del aire


En esta etapa de la historia que nos hemos visto abocados a vivir, dadas las vías de contagio del coronavirus, se hace necesario evaluar la calidad del aire que respiramos para intentar minimizar las vías de contagio dado que ha quedado demostrado por la comunidad científica que el aire es precisamente una de las principales vías de propagación.

Toser, cantar, hablar o incluso respirar envía aerosoles y otras sustancias en suspensión en una variedad de tamaños de modo que cuanto más cerca esté del origen, mayor será la posibilidad de exposición a esas cotícelas  potencialmente  cargadas de virus que podrían inhalarse o caer en sus ojos, es por eso que muchos científicos también se están preocupado por los riesgos potenciales de los aerosoles, ya que la más pequeña de estas partículas pueden flotar a través de las habitaciones y causar infecciones. Por todo ello, es una preocupación mayor cuando la ventilación es deficiente porque se pueden acumular partículas en el aire y con ello potencialmente contagiar a las personas que se expongan, si bien la Organización Mundial de la Salud reconoció recientemente que no se puede descartar la transmisión por aerosol en algunas situaciones, enfatizando que se necesita más investigación para demostrar de manera concluyente su papel en la propagación del virus, aunque en todo caso tal y como han demostrado las estadísticas   haciendo uso generalizado de mascarillas reducimos el riesgo.

No obstante, a pesar de usar medios de protección, los riesgos de transmisión de COVID-19 en habitaciones abarrotadas y condiciones de mala ventilación, y en cualquiera de estos entornos, el tiempo es clave, por lo que cuanto más tiempo pase alguien en un espacio mal ventilado o lleno de gente, mayor será el riesgo previsto de enfermarse.  

Además, si algún día logramos la ansiada inmunidad de rebaño, existen además evidencias de que los altos niveles de CO2 influyen sobre el rendimiento de los alumnos en el aula o en los espacios de trabajo, así que aun así deberíamos estar pendientes de este valor simplemente por mejorar nuestra salud.

Para evaluar la calidad de aire, uno de los principales indicadores es la cantidad de material particulado (PM), que a menudo se clasifica además por sus tamaños, por ejemplo, PM2.5 y PM10, pero, sin embargo, se vuelve más complejo medir compuestos orgánicos volátiles (COV) u otros componentes como el formaldehído(HCHO) y los pesticidas. Asimismo, tanto el CO2 como CO son otros contaminantes potencialmente mortales pues sirve como un indicador de las personas que han estado en una estancia

Investigaciones de este tipo pues nos pueden motivar a elaborar un pequeño dispositivo de bajo coste que permita monitorizar los niveles de CO2 en espacios cerrados con el objeto de poder medir la concentración de dicho gas y de esta forma saber cuándo tenemos que renovar el aire de un aula o espacio cerrado (o incluso en nuestra casa) para prevenir posibles contagios

En un reciente informe del 03/11/2020 [9] nos habla con datos de la importancia de la ventilación y de la necesidad de ventilar en las aulas más allá de lo que indican muchos de los protocolos vigentes en muchas comunidades autónomas: El muestreo de mediciones realizado en centros educativos por el Comité de Expertos en Ventilación del COGITI, confirma la necesidad de contar con medidores de CO2

Con un simple NodeMCU, y al menos un sensor de CO2 con una plataforma de IOT vamos a ver como es muy fácil construir un sistema simplificado que permita indicar cuando los niveles de CO2 están dentro de unos determinados umbrales, monitorizar por ejemplo los datos de distintas aulas de forma centralizada, almacenar datos estadísticos en una base de datos o realizar otras muchas tareas que podrían sernos útiles sin incrementar prácticamente el coste del dispositivo.

Las partes del proyecto: Cayenne,sensores y ESP32

Una de las plataformas alejadas de las grandes multinacionales que más se ha mantenido en el tiempo es la plataforma Cayenne de myDevices ofreciendo un amplio abanico de posibilidades.

Además, cuenta con apoyos de grandes empresas de la industria tecnológica como Microchip y Smetch y del hardware libre como Arduino permitiéndonos crear paneles de control de una forma muy sencilla arrastrando y soltando widgets para visualizar, gestionar y controlar dispositivos conectados del IoT o domóticas todo a través de un broker MQTT.

Entre todos los servicios que nos ofrece la plataforma caben destacar el control y monitorización remoto, alertas, avisos, programación de eventos, tratamientos de datos, seguimiento de dispositivos, código personalizado, una API MQTT y compatibilidad con redes LoRaWAN.

Soporta varios tipos de placas y hardware: Raspberry Pi, Arduino, ESP8266 y varias redes y dispositivos LoRaWan.  También cabe destacar las cajas del IoT o IoT in a Box donde básicamente “paquetizan” una solución incluyendo en este paquete todo el hardware necesario incluyendo además los paneles de control personalizados para monitorizar ese hardware.

Gracias pues a esta veterana plataforma de Cayenne, es bastante sencillo monitorizar cualquier variable física de un modo realmente bastante sencillo simplemente haciendo casi un “drug &drop” desde el panel de control de Cayenne como vamos a ver en este trabajo donde vamos a presentar un complejo monitor de calidad de inalámbrico y de bajo coste gracias la potencia del software de esta plataforma y por supuesto la electrónica que lo hace posible.

En efecto   gracias a un framework genérico desarrollado por myDevices IO Project Builder llamado Cayenne, desarrolladores, fabricantes también aficionados pueden construir rápidamente prototipos y proyectos que requieran controlar o monitorizar   cualquier cosa conectada a diferentes placas con conectividad, permitiendo con una sola cuenta gratuita de Cayenne, crear un número ilimitado de proyectos mediante una solución bastante intuitiva   basada en arrastrar y soltar. 

Obviamente el punto fuerte de Cayenne son las capacidades de IO para que pueda controlar de forma remota sensores, motores, actuadores, incluidas los puertos de GPIO con almacenamiento ilimitado de datos recogidos por los componentes de hardware, triggers y alertas, que proporcionan las herramientas necesarias para la automatización y la capacidad de configurar alertas. Además, también puede crear cuadros de mando personalizados para mostrar su proyecto con arrastrar y soltar widgets que también son totalmente personalizables.

Resumidamente algunas de estas características clave de esta ya veterana plataforma son las siguientes:

  • Fácil instalación que conecta rápidamente los dispositivos, sensores, actuadores, y las extensiones en cuestión de minutos.
  • Motor de reglas para desencadenar acciones a través de dispositivos.
  • Panel personalizable con widgets de visualización de arrastrar y soltar.
  • Para construir un proyecto de la IO a partir de cero se ha logrado el objetivo de proporcionar un Proyecto Generador de IO que reduce el tiempo de desarrollo de horas en lugar de meses.
  • Control de puertos que se pueden configurar desde una aplicación móvil o desde un navegador
  • Acceso remoto instantáneo desde su smartphone o con un ordenador
  • Una aplicación móvil tanto para IOS como para Android para configurar, el monitor y los dispositivos de control y sensores desde cualquier lugar.

Este proyecto obviamente no serviría para nada si no contara con los sensores correspondientes que nos va a ofrecer las mediciones físicas 

  • Un sensor MQ: suelen proporcionarse con una placa de medición estándar con el comparador LMC662 o similar, que permite obtener la lectura tanto como un valor analógico, como un valor digital cuando se supera un cierto umbral regulado a través de un potenciómetro ubicado en la placa. Los sensores de gases deben ser calibrados antes de obtener una medida precisa, pero también ofrecen una señal analógica que podemos usar en nuestras medidas.
  • Un sensor DHT11: El DHT11 puede medir temperaturas entre 0 a 50, con una precisión de 2ºC, humedad entre 20 a 80%, con precisión del 5% y con una a frecuencia de muestreo de 1 muestras por segundo (1 Hz) usando un interfaz de un hilo para comunicarse con el microcontrolador
  • Un sensor CCS811: Constituye el   elemento más importante de este proyecto. Este sensor de calidad del aire de dióxido de carbono está fabricado por múltiples empresas como Keyestudio, AMS, Adafruit, etc. utilizando principalmente el chip CCS811.  Este sensor de gas digital en miniatura de potencia ultrabaja, es de “bajo coste” y puede detectar una amplia gama de compuestos orgánicos volátiles (TVOC), incluidos niveles equivalentes de dióxido de carbono (eCO2) y óxido metálico (MOX). Incluye un conversor ADC interno, un procesador interno para realizar los cálculos y comunicación a través de a través de bus I2C por lo que es muy sencillo conectarlo a un microcontrolador.

Finalmente, como microcontrolador usaremos el sucesor del veterano SoC ESP8266(Node) que ha dado paso al ESP32 (Node MCU) la cual es la denominación de una familia de chips SoC de bajo costo y consumo de energía, con Wi-Fi y Bluetooth de modo dual integrada empleando el microprocesador Tensilica Xtensa LX6 (creado y desarrollado por Espressif Systems y fabricado por TSMC utilizando su proceso de 40 nm). Tiene variantes de simple y doble núcleo e incluye interruptores de antena, balun de radiofrecuencia, amplificador de potencia, amplificador receptor de bajo ruido, filtros, y módulos de administración de energía.

Con todos estos elementos, gracias a Cayenne, veremos cómo es posible construir un potente medidor de calidad de aire que sin duda nos va poder ayudar a comprender las vías de transmisión de este grave virus que está paralizando de una forma tan extrema nuestro mundo.

La plataforma Cayenne

Si entramos en la web de Cayenne myDevices podemos que no encuentras ninguna opción donde se vean los planes disponibles, no hay mucha información. Sin embargo, nos podemos dar de alta y comenzar a utilizar su servicio puesto que el modelo de negocio de esta plataforma se sustenta en su Marketplaces con soluciones terminadas para los clientes, así que investigadores, aficionados, estudiantes, etc.  podemos utilizar esta plataforma para crear nuestros proyectos sin pagar un solo euro (o dólar).

Todo se comunica a través de una API MQTT y la única limitación podría venir a la hora de hacer llamadas a la API.

  • Cada cliente sólo puede enviar 60 mensajes por minuto por IP.
  • Cada cliente sólo puede intentar 50 conexiones cada 10 minutos por IP.

Estas limitaciones no hacen referencia al número de dispositivos, pero si al cómputo global de mensajes enviados y de intentos de conexión.

En teoría, además al contrario de lo que sucede en otras plataformas, no hay problemas a la hora de descargar los datos almacenados en la plataforma, tan solo los intrínsecos provocados por tamaños excesivos en los ficheros a de descargar por su gran tamaño o por posibles problemas de red

Dentro de la plataforma hay dos componentes que nos permitirán controlar y manejar nuestros dispositivos hardware:

  • Aplicaciones móviles para iOS y Android para control remoto de los dispositivos.
  • Panel de control online para la gestión total de nuestros dispositivos.

Para crear un proyecto del IoT o domótica con Cayenne sólo necesitaremos una placa o hardware compatible (Raspberry Pi, Arduino, ESP8266, etc), lo cual en nuestro caso por su gran versatilidad y potencia lo vamos a centrar en la mencionada placa ESP32

Respecto al software, necesitaremos instalar la librería de Cayenne además no solo podemos manejar el interfaz desde su página web pues también tenemos disponible una APP en Android o iOS.

Para empezar necesitamos  irnos  a Log in to Cayenne (mydevices.com)   creando una cuenta gratuita en Cayenne myDevices  donde  sólo necesitamos nombre y apellidos, un email y una contraseña. Una vez que nos hemos dado de alta, nos tendremos que volver a validar y desde este momento ya podremos acceder al panel de control de la cuenta que acabamos de crear.

 Antes de continuar necesitaremos instalar la librería Cayenne MQTT con el IDE de Arduino Esta librería nos va a permitir conectar nuestras placas, ya sean Arduino MKR1000 o cualquier placa ESP8266, a la plataforma del IoT en la nube Cayenne myDevices. Lo haremos a través del gestor de librerías.

Entre en la opción del menú Programar>Incluir Librería>Gestionar Librerías y buscar cayennemqtt. Esto instalará tanto el código como los ejemplos de esta librería. Con esto ya tenemos todo preparado para empezar a configura nuestro proyecto ya que Cayenne myDevices es totalmente compatible con Arduino y todas sus variantes de modo que es muy sencillo de configurar. Si no ha añadido ningún dispositivo o placa a Cayenne myDevices, la primera pantalla que sale es esta.

Seleccionaremos Generic ESP8266 en el caso de que vayamos a configurar incluso si ESp32) y en la siguiente pantalla nos está indicando que debemos hacer los siguinte:

  • Nos aseguráremos que el ESP32 está conectada al PC o Mac con el cable USB.
  • Instale el IDE de Arduino.
  • Instale la librería Cayenne MQTT.
  • Seleccione la placa y el puerto correctos en el IDE de Arduino.

Todo esto ya está hecho y si no lo está, tendría que hacerlo para poder proseguir. Una vez esté configurado haga clic en Next, apareciéndonos nada más seleccionar la placa, una ventana donde muestra un código. Copiar y pegar ese código en un nuevo programa en el IDE de Arduino (se puede copiar haciendo clic en el botón superior derecha una pantalla similar a la siguiente).

En este código ya viene configurado el username, password y el clientID necesarios para conectar a Cayenne myDevices. Sin embargo, nos queda rellenar el nombre de la red WiFi (ssid) y la contraseña (wifiPassword).

Ahora sólo nos queda cargar el código a la placa. Abra el monitor serie y tendrá algo parecido a esto.

Si todo ha ido bien, aparecerá el Generic ESp32 a la izquierda dentro de la plataforma Cayenne myDevices.

Configurar dispositivo en Cayenne myDevices

Si hacemos clic en el engranaje de la derecha, podemos entrar en la configuración del dispositivo

En esa pantalla podremos modificar el nombre, pero sobre todo es aquí donde obtendremos todos los parámetros del dispositivo   que necesitaremos configurar en ESP32 para que se pueda conectar y enviar o recibir datos de la plataforma Cayenne.

Configurada esta parte ya podremos añadir los sensores, así como programar acciones interactivas al satisfacer alguna condición, pero esa parte la vamos a comentar más adelante cuando comentemos que tipo de sensores vamos a emplear, así como su característica más importante.

Sensores DHTXX

Dado que es interesante correlacionar temperatura y humedad con la calidad del aire (de hecho, hay sensores de alta precisión y coste elevado que incluyen estas medidas) en este proyecto se ha optado por un usar un sensor de precisión como es el DHT11 con objeto que complete el resto de medidas que se realicen.

DHT11 y DHT22 son dos modelos de una misma familia de sensores, que permiten realizar la medición simultánea de temperatura y humedad usando además un único hilo para comunicar los datos vía serie, para lo cual ambos disponen de un procesador interno que realiza el proceso de medición, proporcionando la medición mediante una señal digital, por lo que resulta muy sencillo obtener la medición desde un microprocesador como Arduino, ESP8266 o el Node MCU que usaremos.

Ambos son similares pero el DHT11 presenta una carcasa azul (es el que usaremos en la práctica), mientras que el sensor DHT22 es blanco, compartiendo además los mismos pines disponiendo de 4 patillas, de las cuales usaremos sólo 3: Vcc, Output y GND.  Como peculiaridad, la salida la conectaremos a una entrada digital, pero necesitaremos poner una resistencia de 10K entre Vic y el Pin Output, pero existen unos módulos que integran esta junto con los pines VCC, OUT y GND.

El DHT11 puede medir temperaturas entre 0 a 50, con una precisión de 2ºC, humedad entre 20 a 80%, con precisión del 5% y con una a frecuencia de muestreo de 1 muestras por segundo (1 Hz)

En clara superioridad con el dHT11, el modelo DHT22 tiene unas características mucho más profesionales.

  • Medición de temperatura entre -40 a 125, con una precisión de 0.5ºC
  • Medición de humedad entre 0 a 100%, con precisión del 2-5%.
  • Frecuencia de muestreo de 2 muestras por segundo (2 Hz)

Destacar que este tipo de sensores de temperatura (y, aún más, los sensores de humedad), son sensores con elevada inercia y tiempos de respuesta elevados. Es decir, al “lentos” para reflejar los cambios en la medición.

Conectar el DHT11   o el DHT22 a un Arduino o al Node MCU es sencillo, simplemente alimentamos desde Arduino al sensor a través de los pines GND y Vcc del mismo. Por otro lado, conectamos la salida Output a una entrada digital de Arduino. Según la composición que adquiramos necesitaremos poner una resistencia de 10K entre Vcc y el Pin Output, aunque actualmente se venden módulos con el sensor montado con la resistencia ya integrada e incluso con un orificio para poder fijarlo a un soporte (es la razón por la que solo tienen tres pines).

El esquema eléctrico quedaría como la siguiente imagen:

Los sensores DHT11 y DHT22 usan su propio sistema de comunicación bidireccional mediante un único hilo, empleando señales temporizadas por lo que en general, lo normal es que empleemos una librería existente para simplificar el proceso. Por ejemplo podemos usar la librería de Adafruit disponible  en https://github.com/adafruit/DHT-sensor-library

 Como vemos el circuito para conectar al Node MCU   el sensor de temperatura y humedad DHT11 no puede ser más sencillo, pues simplemente alimentaremos con 3.3v DC tanto el DHT11 como el Node MCU   en sus pines correspondiente     sin olvidar que la salida de datos del DH11pin datos) tenemos que conectarla al pin 5 del GPIO.

Para esta parte del proyecto al usar el ESP32, vamos a usar en resumen los siguientes pines del ESP32 al DHT11:

  • GPIO23 (pin15): conexión al DHT11
  • VCC(pin1): conexión +5V al DHT11
  • GND(pin2): conexión GND al DHT11

SENSOR DE GASES MQ

Los sensores de gases MQ son una familia de dispositivos diseñados para detectar la presencia de distintos componentes químicos en el aire. Podemos conectar estos dispositivos a un autómata o procesador como Arduino. Existe una gran variedad de sensores MQ y cada modelo está diseñado para detectar una o más sustancias, pensadas para un uso específico, como por ejemplo detección gases inflamables, calidad del aire o detección de alcohol en aire respirado.

Los sensores de gases MQ suelen proporcionarse con una placa de medición estándar con el comparador LMC662 o similar, que permite obtener la lectura tanto como un valor analógico, como un valor digital cuando se supera un cierto umbral regulado a través de un potenciómetro ubicado en la placa. Los sensores de gases deben ser calibrados antes de obtener una medida precisa. Aun calibrados estos sensores no disponen de la garantía necesaria para formar parte de un sistema de seguridad.

Pese a sus limitaciones, los sensores de gases tipo MQ son muy usados en proyectos de electrónica casera con Arduino. Por ejemplo, podemos hacer encender o apagar un ventilador en función de la calidad del aire, hacer un pequeño detector de alcoholemia, o una alama que suene al detectar humos.

Los sensores MQ están compuestos por un sensor electro-químico que varía su resistencia al estar en contacto con las sustancias. Estos s sensores de gases son dispositivos con alta inercia, es decir, la respuesta necesita tiempos largos para estabilizarse tras un cambio de concentración de los gases medidos. Ello es debido a la necesidad física de que el gas abandone el material sensible, lo cual es un proceso lento.

Todos los modelos MQ disponen de un calentador necesario para elevar la temperatura del sensor, y que sus materiales adquieran la sensibilidad. Mientras el calentador no alcance la temperatura de funcionamiento, la lectura del sensor no será fiable. El tiempo de calentamiento depende de cada modelo de sensor. En la mayoría de modelos es suficiente para con unos pocos minutos, pero algunos modelos requieren hasta 12 y 48 horas hasta obtener mediciones estables.

Por otro lado, cada modelo necesita su propia tensión para alimentar el calentador. En muchos modelos esta tensión es de 5V, pero algunos modelos tienen condicionantes especiales para la alimentación.

El consumo de los sensores MQ puede ser elevado debido al calor necesario para funcionar el calentador, que puede llegar hasta 800 mW en algunos modelos. Esto es superior a la potencia que puede suministrar el regulador de Arduino, por lo que será necesario proporcionar una fuente de alimentación externa.

A continuación, podemos ver una tabla de resumen con los distintos modelos de sensores disponibles, los gases a los que son sensibles, y algunos datos sobre el calentador, aunque no obstante deberíamos consultar detalladamente el Datasheet de cada sensor MQ particular antes de emplearlo para detallar sus especificaciones técnicas, especialmente la tensión de alimentación del calentador, el tiempo de calentamiento, y la curva de sensibilidad del sensor.

ModeloSustancias detectadasCalentador
MQ-2Metano, butano, GLP, humo5V
MQ-3Alcohol, Etanol, humo5V
MQ-303AAlcohol, etanol, humo0.9V
MQ-4Metano, gas natural comprimido (GNP)5V
MQ-5Gas natural, GLP5V
MQ-6Butano, GLP5V
MQ-306AButano, GLP0.9V
MQ-7Monóxido de carbonoAlternado 5V y 1.4V
MQ-307AMonóxido de carbonoAlternado 0.2 y 0.9V
MQ-8Hidrógeno5V
MQ-9Monóxido de carbono, gases inflamablesAlternado 5V y 1.5V
MQ-309AMonóxido de carbono, gases inflamablesAlternado 0.2 y 0.9V
MQ-131Ozono6V
MQ-135Benceno, alcohol, humo, calidad del aire5V
MQ-136Ácido sulfhídrico5V
MQ-137Amoniaco5V
MQ-138Benceno, tolueno, alcohol, acetona,5V
propano, formaldehído, hidrógeno
MQ-214Metano, gas natural5V
MQ-216Gas natural, gas carbón6V
MG-811Dióxido de carbono6V
AQ-104Calidad del aire * 
AQ-2Gases inflamables, humo 
AQ-3Alcohol, Benceno 
AQ-7Monóxido de carbono 

* Conviene amplificación

SENSOR MQ2

El módulo del sensor de gas MQ-2 es un dispositivo que se utiliza para detectar y medir la concentración de gases en el aire. Puede detectar tales gases como: GLP, propano, metano, hidrógeno, alcohol, humo y carbono monóxido. Aunque puede detectar esos gases, no es capaz de distinguir diferencia entre ellos.

El MQ-2 es un semiconductor de óxido metálico (MOS), también conocido como quimiorresistor. El sensor contiene un material sensor cuya resistencia cambios con diferentes concentraciones de gas. Este cambio de resistencia es utilizado para la detección de gas. El sensor también tiene un potenciómetro incorporado, con que podemos ajustar su sensibilidad.

El sensor está encerrado dentro de dos capas de malla fina de acero inoxidable llamada Red anti-explosión. Como resultado de eso, es capaz de detectar inflamables gases sin incidencias. Asimismo, brinda protección al sensor, y filtra las partículas en suspensión. De esa manera, solo los gases pueden pasar dentro de la cámara de detección.

El módulo tiene un chip comparador LM393 integrado que convierte las lecturas en señales digitales y analógicas. También hay un potenciómetro que se utiliza para calibrar la sensibilidad de detección

Estas son las especificaciones del sensor:

Para obtener los mejores resultados de detección, el sensor de gas debe precalentarse. El mejor tiempo de precalentamiento del sensor es superior a 24 horas. Para obtener información detallada sobre las especificaciones del sensor, consulte la hoja de datos.

La sensibilidad del módulo se puede ajustar con un potenciómetro integrado. Mover el eje del potenciómetro en el sentido de las agujas del reloj aumenta la sensibilidad. Mover el eje del potenciómetro en sentido anti horario disminuye la sensibilidad del módulo.

Conexiones del MQ2

El módulo del sensor de gas tiene cuatro pines cuyo pinout se muestra en la siguiente imagen:

El esquema eléctrico es sencillo pues solo tenemos que alimentar módulo conectando GND y 5V a los pines correspondientes de Arduino y bien podemos usar la lectura digital, conectamos la salida DO a una de las entradas digitales. (Opcionalmente, podemos calibrar el umbral de disparo de la salida digital con el potenciómetro instalado en el módulo) o bien como en nuestro caso usar una entrada analógica AO conectada a una entrada analógica de nuestro ESP32.

LECTURA DIGITAL

El siguiente código muestra la lectura digital del sensor MQT2. El código es muy sencillo pues simplemente utilizamos una entrada digital para comprobar el estado del sensor, empleando el puerto serie para informar de la detección.

#define DIGITAL_PIN 2

#define ANALOG_PIN 0

uint16_t gasVal;

boolean isgas = false;

String gas;

void setup() {

Serial.begin(9600);

pinMode(DIGITAL_PIN, INPUT);

}

void loop() {

gasVal = analogRead(ANALOG_PIN);

isgas = digitalRead(DIGITAL_PIN);

if (isgas) {

gas = "No";

}

else {

gas = "Yes";

}

gasVal = map(gasVal, 0, 1023, 0, 100);

Serial.print("Gas detected: ");

Serial.println(gas);

Serial.print("Gas percentage: ");

Serial.print(gasVal);

Serial.print("%\n");

delay(2000);

}

El sketch comienza con la definición y creación de dos macros llamadas DIGITAL_PIN, ANALOG_PIN.El DIGITAL_PIN representa el pin digital de Uno que se utiliza para conectar el pin de salida digital del sensor. ANALOG_PIN representa el pin de entrada analógica de Uno que se utiliza para conectar el pin de salida analógica del sensor.

Los datos del módulo se pueden leer de dos formas. Uno es leyendo el pin de salida analógica del módulo y el otro es leyendo el pin de salida digital del módulo. Para leer el pin de salida analógica del módulo, la variable llamada gasVal se usa para almacenar el valor de retorno de la función analogRead (). El valor de retorno es un número entero en el rango de 0 a 1023. Para convertirlo en un porcentaje, se usa la función map (). Esta es una función incorporada del Arduino IDE. Tiene cinco argumentos y devuelve un valor como, por ejemplo:

gasVal = map (entrada, in_min, in_max, out_min, out_max)

El primer argumento es el valor de entrada, que está en el rango de in_min a in_max. El valor de retorno es un número entero en el rango de out_min a out_max. Esta función asigna un número en el rango de entrada a otro número que está en el rango diferente.Para leer el pin de salida digital del módulo, la variable isGas se usa para almacenar el valor de retorno de la función digitalRead ().Al final de la función loop (), los datos se muestran en Serial Monitor. Entre dos mediciones hay una pausa de 2 segundos: delay(2000);

LECTURA ANALÓGICA

En el siguiente código realizamos la lectura analógica del sensor. Al igual que el anterior, es código es muy sencillo. Simplemente empleamos una entrada analógica cualquiera para leer la salida analógica del sensor, y mostramos el resultado por puerto serie.

const int MQ_PIN = A0;

const int MQ_DELAY = 2000;

void setup()

{

Serial.begin(9600);

}

void loop()

{

int raw_adc = analogRead(MQ_PIN);

float value_adc = raw_adc * (5.0 / 1023.0);

Serial.print("Raw:");

Serial.print(raw_adc);

Serial.print(" Tension:");

Serial.println(value_adc);

delay(MQ_DELAY);

}

LEER LA CONCENTRACIÓN DE UN GAS

Es posible discriminar el nivel de un gas determinado empleando la lectura analógica para determinar la concentración del gas normalmente en ppm (partes por millón), pero algunos sensores usan otras unidades como mg/L o bpm (partes por billón)

El Datasheet de cada sensor proporciona unas gráficas que permiten obtener la concentración del gas a partir de la relación entre la resistencia del sensor R0 y la resistencia medida Rs. También es necesario conocer la resistencia Rl empleada en el módulo para realizar la lectura del sensor MQ.

En la siguiente imagen muestra las curvas de concentración de cada gas medido en un sensor MQ-2 que es el que emplearemos en este proyecto.

Las gráficas se disponen en escala logarítmica para ambos ejes y, en general, son aproximadamente rectas bajo estas escalas. Por lo que la concentración resultará según la siguiente formula:

Para determinar la concentración necesitaremos la recta que la aproxima, para lo cuál debemos coger dos puntos cuales cualquiera de las gráficas P0 = {X0, Y0} y P1 = {X1, Y1}, resultando la ecuación de la recta:

Para obtener A y B simplemente    sustituimos P0 = {X0, Y0} y P1 = {X1, Y1}, en las dos ecuaciones siguientes:

Finalmente  con  todos estos datos podemos obtener a partir de los coeficientes obtenidos medidas más fiables de concentración de gases  usando el siguiente código que finalmente no usaremos en la versión final del proyecto dado que no estamos interesados en discriminar el nivel de un gas en concreto:

const int MQ_PIN = A0; // Pin del sensor

const int RL_VALUE = 5; // Resistencia RL del modulo en Kilo ohms

const int R0 = 10; // Resistencia R0 del sensor en Kilo ohms

// Datos para lectura multiple

const int READ_SAMPLE_INTERVAL = 100; // Tiempo entre muestras

const int READ_SAMPLE_TIMES = 5; // Numero muestras

// Ajustar estos valores para vuestro sensor según el Datasheet

// (opcionalmente, según la calibración que hayáis realizado)

const float X0 = 200;

const float Y0 = 1.7;

const float X1 = 10000;

const float Y1 = 0.28;

// Puntos de la curva de concentración {X, Y}

const float punto0[] = { log10(X0), log10(Y0) };

const float punto1[] = { log10(X1), log10(Y1) };

// Calcular pendiente y coordenada abscisas

const float scope = (punto1[1] - punto0[1]) / (punto1[0] - punto0[0]);

const float coord = punto0[1] - punto0[0] * scope;

void setup()

{

Serial.begin(9600);

}

void loop()

{

float rs_med = readMQ(MQ_PIN); // Obtener la Rs promedio

float concentration = getConcentration(rs_med/R0); // Obtener la concentración

// Mostrar el valor de la concentración por serial

Serial.println("Concentración: ");

Serial.println(concentration);

}

// Obtener la resistencia promedio en N muestras

float readMQ(int mq_pin)

{

float rs = 0;

for (int i = 0;i<READ_SAMPLE_TIMES;i++) {

rs += getMQResistance(analogRead(mq_pin));

delay(READ_SAMPLE_INTERVAL);

}

return rs / READ_SAMPLE_TIMES;

}

// Obtener resistencia a partir de la lectura analogica

float getMQResistance(int raw_adc)

{

return (((float)RL_VALUE / 1000.0*(1023 - raw_adc) / raw_adc));

}

// Obtener concentracion 10^(coord + scope * log (rs/r0)

float getConcentration(float rs_ro_ratio)

{

return pow(10, coord + scope * log(rs_ro_ratio));

}

Finalmente, dado que estamos interesados en la detección global de gases y no en el de un gas particular, usaremos un esquema mixto   como podemos ver en las siguientes líneas, que es el que usaremos en la implementación final:

// Obtener la resistencia promedio en N muestras

float readMQ1(into mq_pin)

{

   float rs = 0;

   for (int i = 0;i<READ_SAMPLE_TIMES;i++) {

      rs += analogRead(analogPin);

      delay(READ_SAMPLE_INTERVAL);

   }

   return rs / READ_SAMPLE_TIMES;

}

//todas las medidas

gasVal=readMQ1(analogPin);  

gasVal = map(gasVal, 0, 1023, 0, 100); 

Serial.print("La conentracion  de gases es :");

Serial.println(gasVal);

Cayenne.virtualWrite(V3, gasVal); //virtual pin

delay(10000);

//lectura digital sensor MQ2

isgas=digitalRead(15);

if (isgas) { 

gas = "No"; 

else { 

gas = "Yes"; 

Serial.print("Valor seensor gas:");

Serial.println(gas);

 Cayenne.virtualWrite(V6, isgas); //virtual pin

Dado que el sensor MQT2 lo vamos a montar sobre un ESP32, las conexiones que realizaremos son las siguientes:

  1. GPIO36 (pin14): conexión A0 al MQT2
  2. VCC ( pin1) : conexión VCC del MQT2
  3. GND(pin2): conexión GND del MQT2
  4. GPIO04(pin5): conexión D0 al MQT2

SENSOR CCS811

El CCS811 es un sensor construido por diferentes fabricantes para la medición calidad del aire interior, que podemos usar fácilmente junto con un procesador como Arduino y todas sus variantes como puede ser un ESP32

Este sensor de calidad del aire de dióxido de carbono está fabricado por múltiples empresas como Keyestudio, AMS, Adafruit, etc., pero en todo caso así marcado básicamente porque utiliza principalmente el chip CCS811. 

Este sensor de gas digital en miniatura de potencia ultrabaja, es de bajo coste y que puede detectar una amplia gama de compuestos orgánicos volátiles (TVOC), incluidos niveles equivalentes de dióxido de carbono (eCO2) y óxido metálico (MOX). Al igual que la mayoría de sensores químicos, el CCS811 necesita un precalentador por lo que la mayoría de fabricantes recomiendan que el sensor funcione durante 20 minutos para que las mediciones se estabilicen, y durante 48 horas si se cambia de ubicación.

El CCS811 incluye un conversor ADC interno, un procesador interno para realizar los cálculos y comunicación a través de a través de bus I2C por lo que es muy sencillo conectarlo a un ESP32.

Dispone de 5 modos de medición (medición continua, o medición cada 0.250, 1, 10, 60 segundos) y que permiten adaptarlo a aplicaciones de bajo consumo alimentadas por batería, pero cuidado porque según el fabricante puede o no implantar esa funcionalidad.

La tensión del CCS811 es de 1.8 a 3.3V, aunque en muchos módulos se incorpora un adaptador de nivel que permite hacerlo funcionar directamente con 5V como es el caso del módulo de KeyStudio.

Para determinar la calidad del aire interior, el CCS811 es un sensor multi-gas MOX(Metal-Oxide) que incluye medición de monóxido de carbono (CO) y compuestos volátiles (VOCs) como etanol, aminas, o hidrocarburos aromáticos. Las dos medidas que nos ofrece son las siguientes:

  • Con ambos datos (CO y VOC) el CCS811 puede determinar la cantidad de dióxido de carbono equivalente (eCO2) que se mide en el rango de 400 a 29206 ppm (partes por millón). El datasheet no proporciona datos sobre precisión en la medición
  • Varios compuestos orgánicos volátiles (TVOC) varían de 0 a 32768 ppbo (partes por billón) en el caso del fabricante Keystudio (pero otros fabricantes como AMS ofrecen rangos de 0 a 1187 ppb en TVOC)

Como curiosidad el orificio de posición de 3 mm de diámetro en el sensor contribuye a fijarlo a otro dispositivo (al igual que ocurre con la familia DHTXX).

Parámetros técnicos

  • Voltaje de funcionamiento: DC 5 V
  • Corriente de trabajo: 30 mA
  • Potencia máxima: 60 mW
  • Rango de medición de eCO2: 400-29206 ppm
  • Rango de medición de TVOC: 0 a 32768ppb
  • Interfaz: 7 pines (paso de 2,54 mm)
  • Diámetro del orificio de posicionamiento: 3 mm
  • Dimensiones: 30 * 20 mm
  • Atributos ambientales: ROHS

PINOUTS


TVOC

Los compuestos orgánicos son sustancias químicas que contienen carbono y se encuentran en todos los elementos vivos. Los compuestos orgánicos volátiles, a veces llamados VOC, o COV, se convierten fácilmente en vapores o gases que  contribuyen a la mala calidad del aire interior, siendo omnipresentes tanto en interiores como en exteriores.

Los COV son sustancias químicas orgánicas emitidas como gases por productos o procesos que  en su mayor parte, se puede oler su presencia. Las fuentes típicas de COV en interiores incluyen cosas como agentes de limpieza, desinfectantes, ambientadores, deshumidificadores y más. Incluso algo tan aparentemente “inocuo “como una alfombra nueva es probable que emita gas de formaldehído. Las fuentes de contaminación de COV del exterior podrían incluir sustancias químicas volátiles en el agua subterránea contaminada que se introducen durante el uso del agua.

Para medir la contaminación del aire en interiores, debe realizar pruebas para detectar todos los contaminantes posibles o probables. Una excepción a esto son los sensores de compuestos orgánicos volátiles (COV), que analiza múltiples contaminantes y brinda un valor / nivel agregado:

  • Intervalo de concentraciones para una situación de confort: 0.2 mg/m3
  • Intervalo de concentraciones con inicio de situaciones de di confort: 0,2–0,3 mg/m3
  • Intervalo de concentraciones para una situación de des confort: 0,3 – 250 mg/m3
  • Intervalo de situación tóxica > 250 mg/m3

Por tanto, el TVOC que nos dé debería ser menor o igual a 0. 6mg / m 3

CO2

 La concentración de CO2 en el aire es un gran “gas trazador” para controlar qué tan mal están las cosas. Por supuesto, los humanos producimos CO2 al respirar, y cuanto más trabajamos, más CO2 producimos.

El dióxido de carbono (CO2) puede no ser el factor más pernicioso que impacta la calidad del aire interior, pero a menudo se usa como sustituto de la calidad del aire y el nivel de ocupación del edificio. Cuantos más ocupantes haya en una habitación o edificio, más CO2 se libera al aire. Para evitar que los niveles de CO2 aumenten demasiado, lo que puede tener un impacto negativo en los ocupantes, el aire exterior debe introducirse deliberadamente en el edificio a través de un sistema de ventilación.

A menudo, sin embargo, esos esfuerzos sobrecargan innecesariamente el sistema de ventilación, desperdiciando energía. Al monitorear los niveles de CO2 y proporcionar ventilación según sea necesario, lo que se denomina ventilación de control de demanda, puede mantener una calidad de aire saludable y reducir el uso de energía

Mirando la medida de CO2 es un buen indicador de la calidad del aire que respiramos. Típicamente, el aire exterior es de aproximadamente 400. Si el medidor pasa de 1000 ppm, en general, debe hacer algo con el aire que hay allí.

ESQUEMA DE MONTAJE

La conexión con el CCS811 es sencilla, ya que la comunicación se realiza a través de I2C. La tensión de funcionamiento es de 1.8 a 3.3V, pero como se ha comentado   muchos módulos incorporan adaptación a 5V, por tanto, para alimentar el módulo conectaremos los pines del módulo GND y Vin, respectivamente, y GND y 5V en Arduino.

Por otro lado, para la comunicación por I2C deberemos conectar los pines SCK y SDA con los pines correspondientes de nuestro modelo de Arduino.

El pin WakeUp activa el sensor cuando este se pone a GND. Por otro lado, el pin RST reinicia el sensor cuando se pone a GND. Ambos están pulled Up, así que, para que funcione, deberemos poner explícitamente WAKE a GND.

Finalmente, el pin INT se emplea en algunos modos de funcionamiento, para detectar cuando el sensor tiene una nueva medición o esta sobrepasa un umbral.

La conexión, vista desde Arduino, sería la siguiente:


 

Aunque el fabricante keystudio recomienda la versión Arduino 1.8.7, como veremos más adelante funciona perfectamente con versiones no oficiales de Arduino y por supuesto con el ESP32, pero es cierto que otras versiones podrían no ser compatible.

#include <CCS811.h>

// Sensor CCS811 (& Cable, / * IIC_ADDRESS = * / 0x5A);
CCS811 sensor;
void setup(void)
{
Serial.begin (115200);
/ * Espere a que el chip se inicialice por completo y luego salga * /
while (sensor.begin ()! = 0) {
Serial.println ("no se pudo iniciar el chip, verifique si la conexión del chip está bien");
retraso (1000);
}
/ **
* @brief Establecer ciclo de medición
* @param cycle: en typedef enum {
* eClosed, // Inactivo (las medidas están deshabilitadas en este modo)
* eCycle_1s, // Modo de potencia constante, medición IAQ cada segundo
* eCycle_10s, // Medición IAQ del modo de calentamiento por pulsos cada 10 segundos
* eCycle_60s, // Medición IAQ del modo de calentamiento por pulsos de baja potencia cada 60 segundos
* eCycle_250ms // Modo de potencia constante, medición del sensor cada 250ms
*} eCycle_t;
* /
sensor.setMeasCycle (sensor.eCycle_250ms);
}
void loop() {
delay(1000);
if(sensor.checkDataReady() == true){
Serial.print("CO2: ");
Serial.print(sensor.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(sensor.getTVOCPPB());
Serial.println("ppb");
} else {
Serial.println ("¡Los datos no están listos!");
}
/ *!
* @brief Establecer línea de base
* @param obtener de getBaseline.ino
* /
sensor.writeBaseLine (0x847B);
// el retraso no puede ser menor que el ciclo de medición
// delay (1000);
}

Cuando una persona exhala delante del sensor, los datos cambian rápidamente, como se muestra a continuación donde en una situación previa sin personas había el nivel de 400ppm de CO2  y 0 ppb de TVOC y pasamos a 475ppm de CO2 y 11ppb de TVOC.

A la hora de conectar el CCS811 al ESP32   deberemos hacer las siguientes conexiones:

  • GPIO 22 (pin14): conexión SCL al CCS811
  • GPIO21(oin11): conexión SDA al CCS811
  • +5V (pin1): conexión VCC del CCS811
  • GND(pin2): conexión GND y WAKE

 

PLACA NODE MCU

Respecto a la placa de desarrollo usada es la NodeMCU-32S basada en ESP32, placa que cuenta con conectividad WiFi + Bluetooth, CP2102 a bordo y llaves. Además, todos los pines de E / S del módulo ESP-WROOM-32 son accesibles a través de los encabezados de extensión. Gracias a los ricos recursos de código abierto, admite el desarrollo de varias formas, como los comandos Lua / AT / MicroPython / Arduino / IOT, etc., lo que le ayuda a crear prototipos rápidos de aplicaciones de IoT.

Algunas características de esta placa:

  • Módulo ESP-WROOM-32 integrado
  • CP2102 integrado, convertidor de USB a UART
  • Puerto USB para entrada de energía, programación de firmware o depuración UART
  • Cabezales de extensión de 2×19 pines, rompen todos los pines de E / S del módulo
  • 2x teclas, utilizadas como reinicio o definidas por el usuario
  • Especificaciones
  • Módulo WIFI: ESP-WROOM-32
  • Procesador: ESP32-D0WDQ6
  • Flash incorporado: 32 Mbit
  • Antena: antena PCB integrada
  • Interfaz periférica: UART / GPIO / ADC / DAC / SDIO / PWM / I2C / I2S
  • Protocolo WiFi: IEEE 802.11 b / g / n
  • Bluetooth: Bluetooth 4.2
  • Rango de frecuencia: 2.4G ~ 2.5G (2400M ~ 2483.5M)
  • Modo WIFI: Estación / SoftAP / SoftAP + Station
  • Fuente de alimentación: 5 V
  • Nivel lógico: 3,3 V
  • Dimensiones: 48,26 mm x 25,4 mm

Respecto a esta placa, es muy relevante tener muy claro la función de   todos los pines de los que contamos como podemos ver en la siguiente imagen:

Para este proyecto vamos a usar los siguientes pines:

  • GPIO23 (pin15): conexión al DHT11
  • GPIO36 (pin14): conexión A0 al MQT2
  • GPIO04(pin5): conexión D0 al MQT2
  • GPIO 22 (pin14): conexión SCL al CCS811
  • GOUI21(oin11): conexión SDA al CCS811
  • +5V(pin1): a todas las líneas de VCC de los tres sensores
  • GND(pin2): a todas las líneas de 0V, GND o masa de los sensores, así como al terminal WAKE del CCS811

Programación final del Node MCU-32S

Para instalar el firmware en el node MCU32S   lo primero es descargar e instalar el IDE de Arduino (Arduino IDE.).Para instalar el paquete de la placa en Archivo -> Preferencias, agregue http://arduino.esp8266.com/stable/package_esp8266com_index.json al campo URL del Administrador de tableros adicionales. Después instalaremos la plataforma esp8266 desde Tools -> Board -> Boards Manage (en caso de que la placa fuese un ESP32, habría que instalar manualmente el paquete de la placa siguiendo las instrucciones aquí: https://github.com/espressif/arduino-esp32/blob/master/README.md#installation-instructions).

Lo siguiente es descargar esta biblioteca como un archivo zip  e instalar la biblioteca zip descargada desde Sketch -> Incluir biblioteca -> Agregar biblioteca .ZIP.

Ahora ya podemos conectar el módulo ESP a su pc a usando un USB y seleccionado su puerto (y obviamente el módulo NodeMCU en el IDE de Arduino) en el menú Herramientas.

El interfaz de Cayenne como hemos visto en líneas anteriores ,en realidad está concebido para que su manejo sea realmente sencillo   de configurar   así que nos iremos a  su   url :   https://cayenne.mydevices.com/   y tras registrarnos nos iremos al panel de control  , clicamos en  Add new   y seleccionamos Generic ESP8266

A continuación, nos ofrece la API key que deberemos añadir al sw del   ESP12E      y tras reiniciarlo ya debería poderse comunicar con el node de Cayenne.

Si la placa pues   está configurada con el MQTT (username /pwd) así como con conectividad wifi, ya   debería de poder conectarse al framework de Cayenne   y podemos seguir hacia adelante añadiendo sensores que deberán estar de acuerdo con el software que vamos instalando en el Node MCU.

Envío de temperatura y humedad

En este caso como hemos definido dos puertos virtuales para temperatura y humedad el firmware del Node MCU, por lo necesitamos añadir dos widgets asociados a esos dos canales:

Para la temperatura no podemos olvidar que habíamos asignado el primer puerto virtual (canal 1), el cual debemos asignar al widget

Respecto a la humedad   habíamos asignado el segundo puerto virtual (canal 2), el cual debemos asignar al widget:

Para probar Cayenne con el Node MCU y un sensor como el DHT11     necesitamos programar el ESP32 para conectarse a su punto de acceso wifi por lo que pasamos a describir el programa que desplegaremos en el Node MCU.  

Básicamente el código a subir al    NodeMCU  para empezar monitorizando la temperatura y humedad solo  usa 5 librerías: 

  • Tres de Cayenne donde tendremos que definir el SSID y la pwd de la red wifi, así como las credenciales de Cayenne,
  • Una cuarta de temporización para enviar muestras a intervalos prefijados (que obviamente podemos cambiar)
  • Por último, la mencionada para la gestión del DTHXX.

//#define CAYENNE_DEBUG

#define CAYENNE_PRINT Serial

#include <CayenneMQTTESP32.h>

#include <SimpleTimer.h>

Necesitaremos actualizar en el código anterior cambiando el valor de SSID, contraseña configurándola para la red wifi de su hogar y también no olvidar   registrar el token de Cayenne que previamente habrá solicitado desde la propia web de Cayenne  MyDevices  en la pestaña Ajustes del proyecto.

// WiFi network info.

char ssid[] ="MOVISTAR_C0D5";

char  wifiPassword[]= "3HgLtpyGsTCjJBntvTCt";

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.

char username[]="d5bb49f0-a6c8-11e6-839f-8bfd46afe676";

char password[]="59306795b26873b288e497f9dea8ce3a3d8c25d6";

char clientID[]="59e0f4b0-f38e-11e7-939f-b354e6d68235";

El token, user y pwd de Cayenne se pueden ver como citamos anteriormente desde la propia web de Cayenne en la pestaña Ajustes del proyecto:

Como nosotros vamos a usar el DHT11 como sensor de humedad y temperatura, al cual conectaremos al pin D5 del Node MCU. Para su gestión usaremos la librería DHT.h, definiremos el puerto y crearemos el objeto dht para acceder a este:

#include «DHT.h»

#define DHTTYPE DHT11   // DHT 11

const int DHTPin = 23;     // por defect  el 5  what digital pin we’re connected to

DHT dht(DHTPin, DHTTYPE);

Asimismo, es importante en la función setup del sketch de Arduino, inicializar el objeto dht, tarea que realizaremos una vez inicialicemos el objeto Cayenne al que le pasaremos todas las credenciales:  username, password, clientID, ssid, wifiPassword.

void setup() {

    Serial.begin(115200);

    Cayenne.begin(username, password, clientID, ssid, wifiPassword);

   Serial.println(«DHT11 test!»);

  dht.begin();

}

Es de destacar la creación de dos puertos virtuales para capturar los valores en tiempo real de la temperatura y la humedad tomadas ambas del DHT11 lo cual nos van a permitir comunicarnos con el API de Cayenne. Además, en esta primera parte mostraremos por consola del ESP32 ambos valores de temperatura y humedad antes de enviarla a la plataforma.

Cayenne.virtualWrite(0, millis());

  float t = dht.readTemperature();

  Serial.print("La  temperatura es de:");

  Serial.print(t);

  Serial.println(" *C ");

  Cayenne.virtualWrite(1, t); //virtual pin

 delay(10000);

  float h = dht.readHumidity();

  Serial.print("La Humedad es de :");

  Serial.print(h);

  Serial.println(" %\t");

  Cayenne.virtualWrite(V2, h); //virtual pin

delay(10000);

El código fuente para probar sólo el DHT11 antes de continuar añadiendo más sensores  es el siguiente:

//#define CAYENNE_DEBUG

#define CAYENNE_PRINT Serial

#include <CayenneMQTTESP32.h>

#include <SimpleTimer.h>

#include "DHT.h"

#define DHTTYPE DHT11   // DHT 11

const int DHTPin = 5;     // what digital pin we're connected to

DHT dht(DHTPin, DHTTYPE);

// WiFi network info.

char ssid[] = “";

char wifiPassword[] = "";

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.

char username[] = "";

char password[] = "";

char clientID[] = "";

unsigned long lastMillis = 0;

void setup() {

                Serial.begin(9600);

                Cayenne.begin(username, password, clientID, ssid, wifiPassword);

   Serial.println("DHT11 test!");

  dht.begin();

}

void loop() {

                Cayenne.loop();

}

CAYENNE_OUT_DEFAULT()

{

  Cayenne.virtualWrite(0, millis());

   float t = dht.readTemperature();

  Serial.print("Temperatura:");

  Serial.print(t);

  Serial.println(" *C ");

  Cayenne.virtualWrite(1, t); //virtual pin

  float h = dht.readHumidity();

  Serial.print("Humedad:");

  Serial.print(h);

  Serial.println(" %\t");

  Cayenne.virtualWrite(V2, h); //virtual pin

   }

CAYENNE_IN_DEFAULT()

{

  CAYENNE_LOG("Channel %u, value %s", request.channel, getValue.asString());

  getValue.setError("Error message");

}

En la siguiente imagen podemos verlo ejecutándose la parte del sensor DHT11 conectado al ESP32:

Finalmente, al haber asignado los dos widgets, si esta Node MCU está conectada a Internet, debería mostrar un panel similar al siguiente en el que se ha añadido un widget nuevo asociado al valor analógico.

Pinchando en la esquina podemos hacer un seguimiento estadístico según criterios temporales (tiempo real, últimos 10 minutos, ultima hora, últimos 7 días, últimos 30 días, últimos tres meses, ultimo 6 meses y el último año.

En el ejemplo vemos la opción “h” que corresponde a los últimos 60 minutos:

Y también podemos acceder al histórico de todas las medidas:

Estos datos debidamente filtrados según nuestra necesidad también los podemos descargar en formato csv para utilizarlos a nuestra conveniencia.

La demora entre él envió de datos y su reflejo en el interfaz es muy pequeño como podemos apreciar en la siguiente imagen:

Envío del nivel de gases

En este caso dadas las características del sensor MQ 2 , vamos  a enviar dos tipos de medidas a la plataforma Cayenne , dado que la familia de sensores MQ XX nos ofrece  tanto una señal digital que indica o no presencia de gasee  (y que podemos ajustar mediante un trimmer), así como una salida analógica genérica que también podemos ajustar según nuestras necesidades específicas de detección  tal y como hemos comentado en el apartado del sensor MQ2 , pero que en este caso, dado que nos interesa abarcar el máximo abanico posible de gases  lo vamos  hacer global.

En el firmware del ESP32 definiremos el puerto analógico (GPIO36) y   una función para tomar un numero de muestras significativas llamada readMQ1:

//sensor mQ

uint16_t gasVal;

boolean isgas = false;

String gas;

int analogPin = 36;

// Obtener  promedio en N muestras

float readMQ1(int mq_pin)

{

   float rs = 0;

   for (int i = 0;i<READ_SAMPLE_TIMES;i++) {

      rs += analogRead(analogPin);

      delay(READ_SAMPLE_INTERVAL);

   }

   return rs / READ_SAMPLE_TIMES;

}

Ahora definidas las funciones , solo tenemos que tomar la muestra de las medidas analógicas  para enviarlas por el puerto virtual 3 a la plataforma Cayenne

//todas las medidas

gasVal=readMQ1(analogPin);  

gasVal = map(gasVal, 0, 1023, 0, 100); 

Serial.print("La concentración  de gases es :");

Serial.println(gasVal);

Cayenne.virtualWrite(V3, gasVal); //virtual pin

delay(10000);

Respecto al umbral de detección de gases ajustable con el trimmer del propio sensor MQ2, leeremos el valor binario del puerto 4.

Como la señal binaria está en lógica inversa desde el propio programa cambiaremos invirtiendo su valor para enviarlo así a la plataforma de modo que intente ser fiel a la realidad (un “cero” si no hay presencia excesiva de gas y un “uno” en caso de exceso de gases)

//lectura digital sensor MQ2

isgas=digitalRead(4);

if (isgas) { 

gas = "No";

isgas=0; 

else { 

gas = "Si"; 

isgas=1;

Serial.print("Valor sensor gas:");

Serial.println(gas);

Cayenne.virtualWrite(V6, isgas); //virtual pin

delay(10000);

Ya en la plataforma de Cayenne, para el caso de alta concentración de gases usaremos el canal 6. Como el sensor funciona de modo inverso según hemos visto en el código (enviando un “1” lógico cuando no hay presencia de gases y un “0” lógico cuando no lo hay), hemos invertido en el sw de Arduino por lo que finalmente enviaremos un cero (sin nivel de gases) o un uno (cuando haya presencia según hayamos ajustado el trimmer).

En la imagen vemos el sensor con el led verde apagado (sin presencia de gases) enviando un uno lógico por el puerto digital D4.

Y en la siguiente imagen, hemos expuesto al sensor a gases de combustión, encendiéndose el led verde de la derecha, enviando el MQ un nivel bajo por el puerto D4.

En el panel de Cayenne, para intentar representar esta misma información seleccionaremos el canal 6 con un valor decimal, indicando el umbral de 0 a 0.5, es decir un “0” lógico como verde (es decir sin presencia de gases) y el umbral de 0.5 a 1, es decir un “1” lógico indicándolo como rojo.

Respecto al valor analógico de la salida de gases del sensor MQ 2 que conectaremos al Gpio 36 del ESP32, vamos a usar el canal 3 de Cayenne   y que configuraremos con tres umbrales:

  • Del 0 al 300: nivel verde
  • De 301 al 600: nivel amarillo
  • De 601 al 1023: nivel rojo

Envío de nivel de calidad de aire

Hemos visto que el sensor CCS811 es el componente más importante del montaje, destacando que la comunicación por I2C se realiza mediante los pines SCK y SDA al ESP32 conectando el pin WakeUp (el que activa el sensor) a GND y el por otro lado, el pin RST, que reinicia el sensor cuando se pone a GND. Ambos están pulled Up, así que funcione, deberemos poner explícitamente WAKE a GND y finalmente, el pin INT se emplea en algunos modos de funcionamiento, para detectar cuando el sensor tiene una nueva medición o esta sobrepasa un umbral.

En el firmware del ESP32   para definir el CCS811 necesitamos incluir la librería CCS811.h definiendo además la variable sensor que será del tipo CCS811.

#include <CCS811.h>

/*

 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.

 */

//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);

CCS811 sensor;

Ahora una vez definido el objeto sensor en la función setup, tras la inicialización de Cayenne y del sensor DHT   necesitamos tras asegurarnos de que el sensor es funcional inicializar el sensor con el modo de funcionamiento.

Para este sensor hay cinco modos posibles

  • eClosed : Inactivo (las medidas están deshabilitadas en este modo)
  • eCycle_1s: Modo de potencia constante, medición IAQ cada segundo
  • eCycle_10s: Medición IAQ del modo de calentamiento por pulsos cada 10 segundos
  •  eCycle_60s: Medición IAQ del modo de calentamiento por pulsos de baja potencia cada 60 segundos
  • eCycle_250ms : Modo de potencia constante, medición del sensor cada 250m

En este proyecto usaremos el modo de potencia constante, es decir con posibles mediciones del sensor cada 250 ms

void setup() {

    Serial.begin(115200);

    Cayenne.begin(username, password, clientID, ssid, wifiPassword);

   Serial.println("DHT11 test!");

  dht.begin();

   while(sensor.begin() != 0){

        Serial.println("failed to init chip, please check if the chip connection is fine");

        delay(1000);

    }

    /**

     * @brief Set measurement cycle

     * @param cycle:in typedef enum{

     *                  eClosed,      //Idle (Measurements are disabled in this mode)

     *                  eCycle_1s,    //Constant power mode, IAQ measurement every second

     *                  eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds

     *                  eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds

     *                  eCycle_250ms  //Constant power mode, sensor measurement every 250ms

     *                  }eCycle_t;

     */

    sensor.setMeasCycle(sensor.eCycle_250ms);

}

Y ya tan solo nos queda recuperar los valores de CO2   con el método sensor. getCO2PPM () o el valor de TVOC con el método getTVOCPPB () y enviar ambos datos a Cayenne por los puertos virtuales V4 y V5 respectivamente.

Ya definido el firmware en el ESP32 para este último sensor en la plataforma de Cayenne, para el caso de C02 definiremos un nuevo widget asociado al canal 4 con tres rangos posibles de valores:

De un modo análogo en el canal 5 también definiremos un nuevo widget para el caso del TVOC   asociándolo al canal 4 con tres rangos posibles de valores:

Con esto ya habríamos terminado de añadir los widget básicos para mostrar en el panel de Cayenne  todas las medidas enviadas.

Configuración de un trigger

Los triggers o disparadores en Cayenne son una forma de hacer que su placa reaccione a un cambio de un sensor conectado a él. Esto podría ser algo tan simple como un valor de temperatura superior a un cierto valor o incluso sólo si el ESP32 pierde la conexión, lo cual como se podría imaginar puede ser muy potente en la creación de dispositivos inteligentes que reaccionan a los alrededores (como, por ejemplo, si la habitación se pone demasiado fría, encienda un calefactor, etc.).

El proceso de agregar un disparador es muy sencillo como vamos a ver a continuación:

  1. Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
  2. Seleccionar un trigger desde el cuadro de abajo.
  3. El nombre de su trigger, voy a llamar a la mía “demasiado caliente”.
  4. Ahora arrastrar y soltar su Node MCU desde la esquina izquierda en el caso de la caja.
  5. Por debajo de esto seleccionar el sensor de temperatura y tienen casilla junto a “por encima de la temperatura” seleccionado. (Si las opciones del dispositivo no se muestran simplemente actualizar la página)
  6. Ahora en el cuadro de selección a continuación, notificación y agregar una dirección de correo electrónico o número de teléfono de un mensaje de texto (puede agregar ambos).Asegúrese de marcar las casillas de verificación también.
  7. Ahora haga clic en “Save trigger”.
  8. Ahora se debe guardar y le enviará una alerta cada vez que el sensor de temperatura es más de 40 grados Celsius.
  9. También puede arrastrar el ESP12E en el cuadro a continuación, y tienen que hacer muchas cosas, incluyendo el control de los dispositivos de salida. Por ejemplo, puede añadir un LED que se activará cuando la temperatura supere los 40 grados Celsius.
  10. Para hacer clic en el gatillo de disparo LED de nueva situada en la parte superior de la página. Nombre esta activar el gatillo LED.
  11. Ahora arrastrar el Pi en el caso de la caja y luego seleccione el sensor de temperatura de nuevo con 40 grados centígrados por encima.
  12. Ahora arrastrar el Node MCU en cuadro a continuación. Seleccione nuestra salida digital y marque la casilla de verificación activada.
  13. Ahora haga clic en Save trigger.
  14. Ahora, cada vez que nuestro sensor de temperatura conectado al Pi informe una temperatura superior a 40 grados Celsius, enviará un correo electrónico y encenderá el LED. También necesitará agregar otro disparador para apagar el LED cuando caiga por debajo de los 40 

 Sin duda hay infinitas posibilidades como nos podemos imaginar.

Aplicación móvil

Hay un valor añadido extra dentro de la plataforma Cayenne, que no todas las plataformas cuentan, y es precisamente el hecho de contar con una aplicación móvil tanto para Android como para IoS.

Teóricamente no solo sirve para visualizar los datos pues también es posible modificar widgets, añadir dispositivos, activar trigger, etc.  tal y como lo podemos hacer desde el interfaz web

En las siguientes imágenes vemos capturas de pantalla del interfaz definido para este proyecto corriendo en tiempo real desde la aplicación Android.

La configuración final

En este proyecto hemos usado los siguientes pines del ESP32:

  • GPIO23 (pin15): conexión al DHT11
  • GPIO36 (pin14): conexión A0 al MQT2
  • GPIO04(pin5): conexión D0 al MQT2
  • GPIO 22 (pin14): conexión SCL al CCS811
  • GPIO21(oin11): conexión SDA al CCS811
  • +5V(pin1): a todas las líneas de VCC de los tres sensores
  • GND(pin2): a todas las líneas de 0V, GND o masa de los sensores, así como al terminal WAKE del CCS811

Las conexiones anteriormente citadas, cuyo detalle se ha especificado a lo largo de todo este trabajo, finalmente quedaría configurado de la siguiente forma:

Y este es aspecto de todo el montaje sobre una placa protoboard:

Una vez compilado el firmware explicado a lo largo de este texto desde la consola serie del IDE de Arduino podemos ir comprobando las diferentes medidas que se van tomando para enviar a la plataforma Cayenne.

Y estos datos tienen su reflejo en la interfaz de Cayenne:

Pruebas

Veamos a continuación como varían las condiciones según el número de personas, temperatura, humedad o estado de las ventanas

Niveles con dos personas a las 9:05AM próximas a la distancia de 2mt sin mascarillas.

Después de una hora y media el nivel de CO2 con una   única persona siendo destacable como baja tanto el nivel de gases como el nivel de CO2

Ahora veamos la evolución de concentración de gases al bajar de dos personas a una sola.

Y la concentración de Co2.

Respecto a la temperatura y humedad apenas sufren variaciones

Easy Auto Refresh

Esta extensión para Chrome permite recargar la página a intervalos definidos para refrescar los datos y poder mostrar los cambios, lo cual es muy útil para no tener que estar constantemente refrescando la página desde obtenemos la información del Cayenne

Por ejemplo, si establecemos que se envíen datos cada 5 minutos, podemos ajustar el valor de refresco en 300 segundos y de este modo podemos estar seguros que la información que hay en pantalla es la última enviada.

Código completo con comentarios

 //*****************************************************************

// Proyecto   para la medición de la calidad de aire

// Por Carlos Rodriguez Navarro  

// **************************************************************

//

//Para este proyecto vamos a usar los siguientes pines:

// GPIO23  (pin15):conexión al DHT11

// GPIO36 (pin14): conexión al MQT4

// GPIO04(pin5): conexión D0 al MQT2

// GPIO 22 (pin14) : conexión SCL al CCS811

// GOUI21(oin11): conexión SDA al CCS811 

// +5V(pin1) : a todas las líneas de VCC de los tres sensores

// GND(pin2) : a todos las líneas de 0V ,GNDo masa  de los sensores , así como al terminal WAKE del CCS811

//

// Este proyecto usa Cayenne mediante un ESP32 para enviar / recibir datos de muestra.

// Asegúrese de instalar el paquete de placa ESP32 y seleccione la placa ESP32 correcta antes de compilar.

// Para instalar el paquete de placa ESP32, siga las instrucciones aquí: https://github.com/espressif/arduino-esp32/blob/master/README.md#installation-instructions.

//#define CAYENNE_DEBUG

#define CAYENNE_PRINT Serial

#include <CayenneMQTTESP32.h>

#include <SimpleTimer.h>

#include "DHT.h"

#define DHTTYPE DHT11   // DHT 11

#include <CCS811.h>

/*

 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.

 */

//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);

CCS811 sensor;

const int DHTPin = 23;     // por defect  el 5  what digital pin we're connected to

DHT dht(DHTPin, DHTTYPE);

// WiFi network info.

Char ssid[] ="sssssssss";

char  wifiPassword[]= "gsssssssssssssssssssssssssss";

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.

char username[]="dsssssssssssssssssssssssssssssssssssssssssss";

char password[]="5sssssssssssssssssssssssssssssssss";

char clientID[]="5ssssssssssssssssssssssssssssssssssss";


unsigned long lastMillis = 0;

//sensor mQ

uint16_t gasVal;

boolean isgas = false;

String gas;

int analogPin = 36;

//const int MQ_PIN =13;//  );      // Pin del sensor


const int RL_VALUE = 5;      // Resistencia RL del modulo en Kilo ohms

const int R0 = 10;          // Resistencia R0 del sensor en Kilo ohms

// Datos para lectura multiple

const int READ_SAMPLE_INTERVAL = 100;    // Tiempo entre muestras

const int READ_SAMPLE_TIMES = 5;       // Numero muestras

// Ajustar estos valores para vuestro sensor según el Datasheet

// (opcionalmente, según la calibración que hayáis realizado)

const float X0 = 200;

const float Y0 = 1.7;

const float X1 = 10000;

const float Y1 = 0.28;

// Puntos de la curva de concentración {X, Y}

const float punto0[] = { log10(X0), log10(Y0) };

const float punto1[] = { log10(X1), log10(Y1) };

// Calcular pendiente y coordenada abscisas

const float scope = (punto1[1] - punto0[1]) / (punto1[0] - punto0[0]);

const float coord = punto0[1] - punto0[0] * scope;

// Obtener la resistencia promedio en N muestras

float readMQ(int mq_pin)

{

   float rs = 0;

   for (int i = 0;i<READ_SAMPLE_TIMES;i++) {

      rs += getMQResistance(analogRead(analogPin));

      delay(READ_SAMPLE_INTERVAL);

   }

   return rs / READ_SAMPLE_TIMES;

}

// Obtener la resistencia promedio en N muestras

float readMQ1(int mq_pin)

{

   float rs = 0;

   for (int i = 0;i<READ_SAMPLE_TIMES;i++) {

      rs += analogRead(analogPin);

      delay(READ_SAMPLE_INTERVAL);

   }

   return rs / READ_SAMPLE_TIMES;

}

// Obtener resistencia a partir de la lectura analogica

float getMQResistance(int raw_adc)

{

   return (((float)RL_VALUE / 1000.0*(1023 - raw_adc) / raw_adc));

}

// Obtener concentracion 10^(coord + scope * log (rs/r0)

float getConcentration(float rs_ro_ratio)

{

   return pow(10, coord + scope * log(rs_ro_ratio));

}

void setup() {

    Serial.begin(115200);

    Cayenne.begin(username, password, clientID, ssid, wifiPassword);

   Serial.println("DHT11 test!");

  dht.begin();

   while(sensor.begin() != 0){

        Serial.println("failed to init chip, please check if the chip connection is fine");

        delay(1000);

    }

    /**

     * @brief Set measurement cycle

     * @param cycle:in typedef enum{

     *                  eClosed,      //Idle (Measurements are disabled in this mode)

     *                  eCycle_1s,    //Constant power mode, IAQ measurement every second

     *                  eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds

     *                  eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds

     *                  eCycle_250ms  //Constant power mode, sensor measurement every 250ms

     *                  }eCycle_t;

     */

    sensor.setMeasCycle(sensor.eCycle_250ms);

}

void loop() {

    Cayenne.loop();

}

CAYENNE_OUT_DEFAULT()

{

  Cayenne.virtualWrite(0, millis());

  float t = dht.readTemperature();

  Serial.print("La  temperatura es de:");

  Serial.print(t);

  Serial.println(" *C ");

  Cayenne.virtualWrite(1, t); //virtual pin

 delay(10000);

  float h = dht.readHumidity();

  Serial.print("La Humedad es de :");

  Serial.print(h);

  Serial.println(" %\t");

  Cayenne.virtualWrite(V2, h); //virtual pin

delay(10000);

 //leer sensor MQ segun la grafica de medidas

// float rs_med = readMQ(analogPin);      // Obtener la Rs promedio

// float concentration = getConcentration(rs_med/R0);   // Obtener la concentración

//  Serial.print("La conentracion rs_med:");

//  Serial.println(rs_med);

// Mostrar el valor de la concentración por serial

//  Serial.print("La conentracion es de :");

//   Serial.println(concentration);

//todas las medidas

gasVal=readMQ1(analogPin);  

gasVal = map(gasVal, 0, 1023, 0, 100); 

Serial.print("La concentracion  de gases es :");

Serial.println(gasVal);

Cayenne.virtualWrite(V3, gasVal); //virtual pin

delay(10000);

 // int raw_adc = analogRead(analogPin );

 // float value_adc = raw_adc * (5.0 / 1023.0);

 // Serial.print("Valor digital :");

 // Serial.println(raw_adc);

 // Cayenne.virtualWrite(V6, raw_adc); //virtual pin

//lectura digital sensor MQ2

isgas=digitalRead(4);

if (isgas) { 

gas = "No"; 

else { 

gas = "Yes"; 

Serial.print("Valor sensor gas:");

Serial.println(gas);

 Cayenne.virtualWrite(V6, isgas); //virtual pin

delay(10000);

//sensor de ccs811

 if(sensor.checkDataReady() == true){

        Serial.print("Valor de CO2: ");

        Serial.print(sensor.getCO2PPM());

        Cayenne.virtualWrite(V4, sensor.getCO2PPM()); //virtual pin

        Serial.println("ppm");

        Serial.print("Valor de TVOC: ");

        Serial.print(sensor.getTVOCPPB());

        Serial.println("ppb");

        Cayenne.virtualWrite(V5,sensor.getTVOCPPB( )); //virtual pin

    } else {

        Serial.println("Data is not ready!");

    }

    /*!

     * @brief Set baseline

     * @param get from getBaseline.ino

     */

    sensor.writeBaseLine(0x847B);

delay(10000); 

//ALMCENAMOS EL LUGAR DONDE SE HACEN LAS MEDIDAS 

//Cayenne.virtualWrite(V6,1);

//1 : estudio

//2: dormitorios

//3: salon

//delay(10000);

//ALMACENAMOS EL NUMERO DE PERSONAS

//Cayenne.virtualWrite(V7,1);

 //delay(10000);

 //pausa entre medidas

  for (int i = 0;i<300;i++)  //pausa de 5 minutos

  {

  delay(1000);

  }

 }

// Default function for processing actuator commands from the Cayenne Dashboard.

// You can also use functions for specific channels, e.g CAYENNE_IN(1) for channel 1 commands.

CAYENNE_IN_DEFAULT()

{

  CAYENNE_LOG("Channel %u, value %s", request.channel, getValue.asString());

  //Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message");

}

Regresión lineal

Con los datos salvados en la plataforma Cayenne    de los 6 sensores vamos a intentar analizar la correlación   entre las diferentes magnitudes físicas para intentar obtener un modelo predictivo usando Machine Learning.

En primer lugar, desde el interfaz de Cayenne en “Data” seleccionaremos dos días   y descargaremos en un fichero csv los datos pertenecientes a los 6 sensores.

Recordemos que los algoritmos de Machine Learning Supervisados, aprenden por sí mismos y -en este caso- a obtener automáticamente esa “recta” que buscamos con la tendencia de predicción. Para hacerlo se mide el error con respecto a los puntos de entrada y el valor “Y” de salida real. El algoritmo deberá minimizar el coste de una función de error cuadrático y esos coeficientes corresponderán con la recta óptima. Hay diversos métodos para conseguir minimizar el coste, pero lo más común es utilizar una versión vectorial y la llamada Ecuación Normal que nos dará un resultado directo.

Este es un ejemplo de la salida de un csv exportado a Excel correspondiente lo datos de dos días:

Desgraciadamente con esa salida directa que nos proporciona Cayenne debemos configurarla para poder ser procesados de forma inversa, es decir cambiando filas por columnas y eliminando la información que no es relevante

Los diferentes tipos de datos obtenidos delas medidas descargadas son los siguientes:

Por ejemplo, tanto el identificador del dispositivo, el canal y el identificador del sensor podemos eliminarlos ya que van unívocamente asociadas al nombre del sensor

Y este es el formato finalmente que adoptaremos con los datos relevantes que vamos a necesitar:

 A continuación, vamos a realizar la representación gráfica a lo largo de 239 muestras tomadas casa cinco minutos desde el 16/5/2021 a las 6:38 al día 17/517 06:20.

Podemos como tanto el nivel de co2 en ppm, como el nivel de gases como incluso el TVOC están bastantes relacionados entre sí, no quedando además clara la relación de estas con la temperatura o la humedad

Una vez obtenido este formato de salida, lo podemos exportar nuevamente a csv con delimitador “coma” y no “punto y coma” para que no haya problemas en la importación desde el notebook.

En la simulación vamos a usar el entorno Anaconda con Jupiter Notebook sobre una maquina con Windows 10 con Intel core i5 cuyo nombre será modelo_regresion.ypnv

Comencemos por importar las librerías que utilizaremos:

import numpy as np

import pandas as pd

import seaborn as sb

import matplotlib.pyplot as plt

%matplotlib inline

from mpl_toolkits.mplot3d import Axes3D

from matplotlib import cm

plt.rcParams['figure.figsize'] = (16, 9)

plt.style.use('ggplot')

from sklearn import linear_model

from sklearn.metrics import mean_squared_error, r2_score

Ahora ya podemos leer el archivo csv y lo cargamos como un datasheet de Pandas. Y vemos su tamaño:

#cargamos los datos de entrada

data = pd.read_csv("./articulos_ml.csv")

#veamos cuantas dimensiones y registros contiene

data.shape

Nos devuelve este valor:

(243,5)

Ahora veamos las cabeceras:

#son 243 registros con 5 columnas. Veamos los primeros registros

data.head()

Es muy importante analizar la estadística de todas las medidas, lo cual en Python es bastante sencillo

# Ahora veamos algunas estadísticas de nuestros datos

data.describe()

Ahora vamos a ver la distribución de los datos:

# Visualizamos rápidamente las características de entrada

data.drop(['temperatura'],1).hist()

plt.show()

# Visualizamos rápidamente las características de entrada

data.drop(['humedad'],1).hist()

plt.show()

En estas gráficas anteriores vemos entre qué valores se concentran la mayoría de registros (gases y C02).

Vamos a filtrar los datos de cantidad de gases y co2 con los registros concentración de gases de menos de 762 y también con los que tengan de Co2 de menos de 11.000ppm. Lo gratificaremos pintando en azul los puntos con menos de 1808 (la media) y en naranja los que tengan más.

# Vamos a RECORTAR los datos en la zona donde se concentran más los puntos

# esto es en el eje X: entre 0 y 220

# y en el eje Y: entre 0 y 1400

filtered_data = data[(data['gases'] <= 220) & (data['c02ppm'] <= 11000)]

colores=['orange','blue']

tamanios=[30,60]

f1 = filtered_data['c02ppm'].values

f2 = filtered_data['gases'].values

# Vamos a pintar en colores los puntos por debajo y por encima de la media de co2

asignar=[]

for index, row in filtered_data.iterrows():

    if(row['c02ppm']>762):

        asignar.append(colores[0])

    else:

        asignar.append(colores[1])

plt.scatter(f1, f2, c=asignar, s=tamanios[0])

plt.show()

Y en la siguiente imagen podemos ver la representación de los puntos:

Vamos a crear nuestros datos de entrada por el momento sólo concentración de gases  y como etiquetas la concentración de CO2. Creamos el objeto LinearRegression y lo hacemos “encajar” (entrenar) con el método fit().

 Finalmente imprimimos los coeficientes y puntajes obtenidos.

# Asignamos nuestra variable de entrada X para entrenamiento y las etiquetas Y.

dataX =filtered_data[["c02ppm"]]

X_train = np.array(dataX)

y_train = filtered_data['gases'].values

# Creamos el objeto de Regresión Linear

regr = linear_model.LinearRegression()

# Entrenamos nuestro modelo

regr.fit(X_train, y_train)

# Hacemos las predicciones que en definitiva una línea (en este caso, al ser 2D)

y_pred = regr.predict(X_train)

# Veamos los coeficientes obtenidos, En nuestro caso, serán la Tangente

print('Coefficients: \n', regr.coef_)

# Este es el valor donde corta el eje Y (en X=0)

print('Independent term: \n', regr.intercept_)

# Error Cuadrado Medio

print("Mean squared error: %.2f" % mean_squared_error(y_train, y_pred))

# Puntaje de Varianza. El mejor puntaje es un 1.0

print('Variance score: %.2f' % r2_score(y_train, y_pred))

Y este es el resultado obtenido:

De la ecuación de la recta y = mX + b nuestra pendiente “m” es el coeficiente 0,05 y el término independiente “b” es 159,7843466   asi que la ecuación de la recta sería:   y= 0.0504829*x +159.78434668080695;

Tenemos un Error Cuadrático de 103,38 que no es muy malo como se ve reflejado en el puntaje de Varianza que debería ser cercano a 1.0 (el valor obtenido es 0.60).

Veamos a continuación los datos   de regresión lineal con la recta que obtuvimos:

# Vamos a RECORTAR los datos en la zona donde se concentran más los puntos

# esto es en el eje X: entre 0 y 220

# y en el eje Y: entre 0 y 1400

filtered_data = data[(data['gases'] <= 220) & (data['c02ppm'] <= 11000)]

colores=['orange','blue']

tamanios=[30,60]

f1 = filtered_data['c02ppm'].values

f2 = filtered_data['gases'].values

# Vamos a pintar en colores los puntos por debajo y por encima de la media de co2

asignar=[]

for index, row in filtered_data.iterrows():

    if(row['c02ppm']>762):

        asignar.append(colores[0])

    else:

        asignar.append(colores[1])

plt.scatter(f1, f2, c=asignar, s=tamanios[0])

#plt.show()

from matplotlib import pyplot

#definimos la ecuación de la recta usando los datos calculados en el apartado anterior

# y=mx+n donde m es el coeficiente   y n el termino independiente

# y con esto definimos f(x)

def f(x):

    return  0.0504829*x +159.78434668080695;

#En esta variable se genera una lista con valores del -10 al 10.

#Todos estos valores serán los que tomara x.

x = range(0, 1400)

#Con el método plot especificamos que función graficaremos.

#El primer argumento es la variable con los valores de x.

#El segundo argumento le pasamos todos estos valares a la función con ayuda de un bucle.

pyplot.plot(x, [f(i) for i in x])

# Mostramos el gráfico.

pyplot.show()

Y esta es la recta final que hemos obtenido de regresión lineal:

Predicción en regresión lineal simple

Vamos a intentar probar nuestro algoritmo, suponiendo que quisiéramos predecir para una concentración de Co2de 800   cuál es el nivel de gases

#Vamos a comprobar:

# Quiero predecir el nivel de gases  para un nivel de CO2 de 800 ,

# según nuestro modelo, hacemos:

y_Dosmil = regr.predict([[800]])

print(int(y_Dosmil))

Nos arroja el siguiente resultado

200
 
 

Este dato puede ser una trivialidad, pero pues ser claramente útil, porque en caso de una lectura anómala o incluso ante un posible fallo del sensor de nivel de aire, podemos usar este valor como referencia para que se dispare una alarma desde Cayenne.

Regresión Lineal Múltiple o “Regresión con Múltiples Variables”)

Vamos a extender los cálculos utilizando más de una variable de entrada para el modelo pues le dará mayor poder al algoritmo de Machine Learning, ya que de esta manera podremos obtener predicciones más complejas de modo que nuestra “ecuación de la Recta”, pase a ser:   Y = b + m1 X1 + m2 X2 + … + m(n) X(n)

Utilizaremos ahora dos “variables predictivas” para poder graficar en 3D.

Vamos a crear nuestros datos de entrada por el momento sólo con los datos de Tvoc y como etiquetas la temperatura y humedad Creamos además el objeto LinearRegression y lo hacemos “encajar” (entrenar) con el método fit ().

Finalmente imprimimos los coeficientes y puntajes obtenidos.

Vamos a intentar mejorar el Modelo, con una dimensión más:

# Para poder graficar en 3D, haremos una variable nueva.

suma = ( filtered_data["tvoc"])

dataX2 =  pd.DataFrame()

dataX2["temperatura"] = filtered_data["temperatura"]

dataX2["humedad"] = filtered_data["humedad"]

XY_train = np.array(dataX2)

z_train = filtered_data['c02ppm'].values

#Creamos un nuevo objeto de Regresión lineal  que  tendrá  dos dimensiones

#para  entrenar: las que contiene XY_train

regr2 = linear_model.LinearRegression()

# Entrenamos el modelo, esta vez, con 2 dimensiones

# obtendremos 2 coeficientes, para graficar un plano

regr2.fit(XY_train, z_train)

# Hacemos la predicción con la que tendremos puntos sobre el plano hallado

z_pred = regr2.predict(XY_train)

# Los coeficientes

print('Coeficientes: \n', regr2.coef_)

# Error cuadrático medio

print("Error cuadratico medio: %.2f" % mean_squared_error(z_train, z_pred))

# Evaluamos la varianza (siendo 1.0 el mejor posible)

print('Varaianza: %.2f' % r2_score(z_train, z_pred))

Cuya salida es la siguiente:

Coeficientes: 
 [23.5745229  29.52613494]
Error cuadratico medio: 50913.69
Varaianza: 0.17

Ya tenemos nuestras 2 variables de entrada en XY_train y nuestra variable de salida pasa de ser “Y” a ser el eje “Z”.

Creamos un nuevo objeto de Regresión lineal con SKLearn pero esta vez tendrá las dos dimensiones que entrenar: las que contiene XY_train. Al igual que antes, imprimimos los coeficientes y puntajes obtenidos:

fig = plt.figure()

ax = Axes3D(fig)

 # Creamos una malla, sobre la cual graficaremos el plano

xx, yy = np.meshgrid(np.linspace(0, 3500, num=10), np.linspace(0, 60, num=10))

# calculamos los valores del plano para los puntos x e y

nuevoX = (regr2.coef_[0] * xx)

nuevoY = (regr2.coef_[1] * yy)

# calculamos los correspondientes valores para z. Debemos sumar el punto de

#intercepción

z = (nuevoX + nuevoY + regr2.intercept_)

# Graficamos el plano

ax.plot_surface(xx, yy, z, alpha=0.2, cmap='hot')

# Graficamos en azul los puntos en 3D

ax.scatter(XY_train[:, 0], XY_train[:, 1], z_train, c='blue',s=30)

# Graficamos en rojo, los puntos que

ax.scatter(XY_train[:, 0], XY_train[:, 1], z_pred, c='red',s=40)

# con azim podremos visualizar el grafico entre 0 y 360 grados.

ax.view_init(elev=30., azim= 65)

ax.set_xlabel('Nivel  de Co2')

ax.set_ylabel('Gases')

ax.set_zlabel('TVOC,temp y humedad')

ax.set_title('Regresión Lineal con Múltiples Variables')

#Vamos a intentar probar nuestro modelo, suponiendo que quisiéramos predecir el nivel de C02

# con los valores de temperatura y humedad

print('Predicción: \n')

z_Effort= regr2.predict([[30, 30]])

print(int(z_Effort))

Y la salida es

Prediccion: 
 
165

Podemos rotar el gráfico para apreciar el plano desde diversos ángulos modificando el valor del parámetro azim en view_init con números de 0 a 360.

Control de nivel de agua con NodeMCU y Cayenne


En  este post  vamos   a ver nuevamente la gran versatilidad del sw de Cayenne , en este caso para controlar el nivel de un liquido   monitorando  este en tiempo real gracias al framework   de IoT gratuito  de Cayenne.

La finalidad de este proyecto es asegurar que un  depósito de agua siempre este lleno , porque podría suceder  que el suministro de agua sólo fluya a determinadas franjas horarias   por   lo que debemos permitir el flujo  solo cuando haya suministro  y el deposito no este lleno

Por tanto , el funcionamiento es relativamente simple  pues únicamente  la válvula se cerrará cuando el agua alcance el nivel superior del sensor.

La lista de materiales necesaria  para este proyecto es bastante reducida siendo el hardware necesario  el siguiente:

Picture of Bill of Materials

2. Sensor de nivel de líquido (calibrar primero para obtener el nivel de valor e inferior nivel superior)

Si usted necesita el sensor más profundo, puede cortar la tira superior del sensor y tome algún cable a dos lados del sensor

Picture of Bill of Materials

3. Módulo de relé de CH

Picture of Bill of Materials

4. Válvula solenoide 12V

5. 12V 2A fuente de alimentación

6. Cables de puente

 

En cuanto al Software necesario:

1. Arduino IDE

2. Cayenne para iOS/Android/Web Browser

Conectar NodeMCU Sensor líquido, módulo de relés y válvulas

ESP12E    esta basado en Arduino  pero cuenta   también conectividad wifi integrando la propia antena en la placa de circuito impreso en unas  dimensiones de  25.6mm x 34.2mm .  Además, por motivos de reducción de espacio esta placa no integra conexión usb  , para lo cual necesitaremos un USB FTDI   para programarlo o un  controlador Setup CH340g.

Esta placa cuenta con 11 pines digitales de entrada / salida, todos los pines tienen interruptor / pwm / I2C / 1-wire    siendo su chip principal el  ESP8266 CH340G

Una gran diferencia con una placa Arduino es que solo cuenta  con 1 entrada analógica (entrada máxima de 3,3 V)

 

Las conexiones son muy sencillas:

  • VIN (+5V): lo conectaremos a NodeMCU y al modulo Rele
  • 3.3V   : Alimentemos el sensor
  • GND : Sensor , Arduino y Rele
  • A0 de Arduino : a la salida del  sensor
  • D5 de Arduino : a la entra de control del Rele

 

Respecto al firmware necesitara  subir el código a NodeMCU, pera el cual debería   programar el NodeMCU con el IDE de Arduino.

Para  probar Cayenne  con el  ESP12E       necesitamos  programar su ESP-12E para conectarse a su punto de acceso wifi   .

Básicamente  el código a subir al    ESP12E     usa 3 librerías de Cayenne donde  tendremos que definir el SSID y la pwd de la red wifi así como las credenciales de Cayenne    ,

Es de destacar  la creación  de  dos puertos virtuales  para capturar  el  nivel de líquidos   en tiempo real  por el puerto A0  asi como accionar el rele por el puerto 14  , lo cual nos van a permitir comunicarnos con el API de Cayenne

Asimismo para efectos de pruebas se deja habilitado la salida por el pruerto serie de modo que podamos ver desde el IDE de Arduino  la evolucion del nivel del liquido y las actuaciones corresponientes

#include «CayenneDefines.h»
#include «CayenneWiFi.h»
#include «CayenneWiFiClient.h»
#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#define RELAY_PIN 14 // RELAY PIN

const int sensorPin= A0; //sensor pin connected to analog pin A0
float liquid_level;
int liquid_percentage;
int top_level = 512;
int bottom_level = 3;

// Cayenne authentication token. This should be obtained from the Cayenne Dashboard.
char token[] = «»; // Insert your token here
char ssid[] = «»; // Insert your SSID here
char pwd[] = «»; // Insert your SSID password here

void setup() {
Serial.begin(115200);
Cayenne.begin(token, ssid, pwd);
pinMode(sensorPin, INPUT);
pinMode(RELAY_PIN, OUTPUT);
}

void loop() {
liquid_level = analogRead(sensorPin);
liquid_percentage = ((liquid_level-bottom_level)/top_level)*100;
Serial.println(liquid_level);
delay(100);
Cayenne.run();
}

CAYENNE_OUT(V10)
{
Cayenne.virtualWrite(V10, liquid_percentage);
}

CAYENNE_IN(V1)
{
// get value sent from dashboard
int currentValue = getValue.asInt(); // 0 to 1

// assuming you wire your relay as normally open
if (currentValue == 0) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
}

Necesitara  subir  el programa anterior  WATER_CONTROL.ino, editar la contraseña del token, SSID de su red Wifi  , usaurio de Cayyene  así como editar valor nivel  inferior y superior

Entonce conecte su NodeMCU con el Cable USB al ordenador y cargue el código en NodeMCU mediante el IDE de Arduino.

Configuración Cayenne Dashboard

Hemos hablado en  muchas ocasiones de Cayenne  pues en realidad está concebido para  que su manejo sea realmente sencillo   de configurar

Nos iremos a  su   url :   https://cayenne.mydevices.com/  

Tras registrarnos nos iremos  al panel de control   ,clicamos en  Add new   y seleccionamos generic ESP8266

A continuación nos ofrece  la API key que deberemos añadir al sw del   ESP12E      y tras reiniciarlo  ya debería poderse  comunicar con el node de Cayenne

 

Si la placa  pues   está configurada con el MQTT  ( username /pwd)     asi como con conectividad  wifi ,  ya   debería  de  poder conectarse al framework de Cayenne   y podemos seguir hacia adelante añadiendo sensores que deberían estar de acuerdo con el sw instalado en el ESP12E

En este caso como hemos definido  dos puertos virtuales para nivel de liquiodso  y contol   necesitamos añadir dos widgets  asociados a esos dos canales:

  • Añadir widget de válvula interruptor del tablero de instrumentos del Cayenne y seleccione Virtual Pin 1.
  • Añadir Sensor analógico widget de Dashboard de cayena y el nombre de nivel de agua, seleccione Virtual Pin 10, unidad porcentaje

Picture of Setting Up Cayenne

Picture of Setting Up Cayenne

 

 

Configuración de  triggers

Los triggers  o disparadores en Cayenne son una forma de hacer que su placa  reaccione a un cambio  de un sensor conectado a él. Esto podría ser algo tan simple como un valor de temperatura superior a un cierto valor o incluso sólo si el ESP12E pierde la conexión, lo cual como se podría imaginar puede ser muy potente en la creación de dispositivos inteligentes que reaccionan a los alrededores ( como por ejemplo, si la habitación se pone demasiado fría, encienda un  calefactor, etc ).

El proceso de agregar un disparador es muy sencillo como vamos a ver a continuación:

  1. Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
  2. Seleccionar un trigger desde el cuadro de abajo.
  3. Nombrar el trigger con un texto identificativo
  4. Ahora arrastrar y soltar su  ESP12E  desde la esquina izquierda en el caso de la caja.
  5. Por debajo de esto seleccionar el sensor 
  6. Ahora en el cuadro de selección a continuación, puede enviar  una notificación( bien a una dirección de correo electrónico o  a un  número de teléfono de un mensaje de texto pudiendo agregar ambos) o  una acción que en nuestro caso  sera activar desactiva  un relé. Asegúrese de marcar las casillas de verificación también.
  7. Ahora haga clic en “Save trigger”.

Haga  este  proceso para las  dos casuisticas:

  • Agregar desencadenadores y si el nivel del agua por encima de 100% entonces la válvula interruptor apague.
  • Agregar desencadenadores y si el nivel del agua por debajo de 100% entonces la válvula del interruptor se encienda
Picture of Setting Up CayennePicture of Setting Up Cayenne

 

Fuente   instructables.com

Watimetro con Arduino


Realmente construir un watimetro no es demasiado  complejo cuando hablamos de corriente continua , por ejemplo pensando en una instalación fotovoltaica , pues basta  simplemente en recordar  la formula física de la  Potencia(P)   , la cual es el producto de la tensión instantánea(voltios) por la intensidad  (Amp ) , es decir  P = V x I ,  expresándose la unidad de potencia en  Watt o KW
Pero la potencia  en watios,  no expresa  ensimismo  potencia energética, por lo  que se recurre  al  producto de la potencia (vatios)  por el tiempo (en horas) , es  decir  E = P x t , expresándose  la unidad de energía que  todo conocemos como  vatios hora(Wh) o kilovatios hora (kWh).

Si unimos ambas formulas sustituyendo el valor de P obtenemos E =Px t= (V xI) x t , es decir  el producto de la tensión  e intensidad por el el tiempo

Precisamente pues de la ultima fórmula anterior queda claro que para medir la energía que necesitamos tres parámetros:

  1.  Tensión
  2.  Intensidad
  3.  Tiempo

Veamos pues como  obtener estas valores con un Arduino  para obtener en tiempo real en un display lcd  la potencia en kwh de un sistema en cc

En el siguiente  video podemos ver el proyecto funcionando, incluso enviando datos al IoT  con  Xively (esta opción ya no esta disponible para aficionados)

Medida de tensión

El voltaje se puede medir con la ayuda de un circuito divisor de tensión  formado  por dos resistencias iguales  . Como el  voltaje de entrada en cualquier pin analógico de ARDUINO esta limitado a 5V por se logica TTL , el  divisor de voltaje servirá para  que el voltaje de la salida de ella sea menor que 5V y no queme la electronica interior.

Por ejemplo para una batería  que se utilice para almacenar la energía de un  panel solar de  6v  y   5.5Ah  de capacidad , tendríamos que bajar la  tensión desde 6.5v a una tensión menor que 5V para no estropear el Arduino.

Si usamos R1 = 10k y R2 = 10K  nos da una corriente pequeña 6.5v/(10k+10K)=0,325mA .

Es cierto que se podrían  tomar valores de R1 y R2    inferiores, pero el problema es que cuando la resistencia es menor  mayor corriente  pasas  a través de ella generando como resultado gran cantidad de energía  disipada en forma de calor(recuerde  que P = I ^ 2R) . por tanto el valor de las resistencias  puede ser elegido diferente pero debe tenerse cuidado para reducir al mínimo la pérdida de energía a través de las resistencias.

El resultado de la tensión entre una de las resistencias y masa seria igual a R xI =10k  x 0.325mA=3.25v que es inferior a 5v y, tensión soportada sin problemas  para el pin analógico de  ARDUINO

Calibración de voltaje:

Cuando la batería está completamente cargada (6.5v) obtenemos una Vout = 3.25v y ese seria el valor  que iría al  convertidor analógico digital  de un puerto analógico  de  Arduino

Si tenemos que medir los 3.25v desde el divisor de tensión   obtendremos un valor aproximado de 696 en el monitor serial (  sample1 es el valor de ADC corresponde a 3.25v)  .

Precisamente con ese valor o tendremos que extrapolar  que 3.25v  es equivalente a 696,  1 es equivalente a 3.25/696=4.669mv    por lo que podemos usar  estas dos reglas:

Vout = (4.669 * sample1 ) / 1000 voltios
voltaje de la batería real = (2 * Vout) voltios

Con el siguiente código de Arduino  podemos obtener el valor de tensión:

/ / tomar 150 muestras de divisor de tensión con un intervalo de 2 segundos y medio samples data collected for(int i=0;i<150;i++)
{
sample1=sample1+analogRead(A2); //leer  el voltaje del circuito divisor
delay (2);
}
sample1=sample1/150;
voltage=4.669*2*sample1/1000;

Medición de intensidad

Para mediciones de intensidad  es típico usar una resistencia en serie  de poco  valor con la carga  y medir la diferencia de potencial entre los extremos   de esta  y luego calcular   la intensidad gracias a la la ley de ohm (I=V/R  ) donde como vemos   dividiríamos este valor por el valor en ohmios de la resistencia

El efecto Hall se basa en  la producción de una diferencia de potencial(el voltaje de Hall) a través de un conductor eléctrico, transversal a una corriente eléctrica en el conductor y un campo magnético perpendicular a la corriente.

Afortunadamente actualmente existen CI especializados  como   son  los   sensores de corriente basados en efecto Hall ACS 712

Existen comercialmente  sensores de la gama ACS712  para  diferentes  rangos de corrientes máximas , así que se debe escoger este  según su requisito,como por ejemplo para una corriente máxima de 20 A.

ACS712.png

En el  esquema vemos un LED como una carga ( aunque  la carga real sera diferente) .

Tambien vemos el  ACS 712 (soporta  20Amps DC)  ofreciendo una una salida analógica 100mV/A

Tambien es destacar la alimentación del Arduino  cuya salida alimenta a través de la placa de prototipos a la ACS712

La calibración  es muy sencilla :
La lectura analógica  produce un valor de 0-1023, equiparando a 0v a 5v analógico .Leer 1 = (5/1024) V = 4.89mv
Valor = (4,89 * valor analógico leído) / 1000 V,  pero según hojas de datos offset 2.5V (cero corriente obtendrá 2.5V del sensor de salida)
valor Actual = (valor 2.5) V
corriente en amp = valor real * 10

Código de ARDUINO:

/ / tomando 150 ejemplos de sensores con un intervalo de 2 segundos y luego media de los datos de las muestras recogidos
for (int i = 0; i < 150; i ++)
{
+= sample2 analogRead(A3);  //  leer la corriente de sensor
delay(2);
}
sample2 = sample2/150;
=(5.0*sample2)/1024.0; 
actualval = val-2.5;  //tensión de offset es 2.5v
amperios = actualval * 10;

 Medición del tiempo

Para la medida del tiempo no se necesita ningún hardware externo, pues ARDUINO en sí mismo tiene contador de tiempo incorporado.

La función millis() devuelve el número de milisegundos desde que la placa Arduino comenzó a ejecutar el programa actual.

Código de ARDUINO:

long milisec = millis();  // calcular el tiempo en milisegundos
long time=milisec/1000; // convertir de milisegundos a segundos

 Calculo de la potencia y energía

Estas son las formulas basicas empleadas por el fw  en Arduino:
  • totamps = totamps + amperios;  //calcular amperios total
  • avgamps = totamps/tiempo;  // promedio de amps
  • amphr =(avgamps*time)/3600;  // Ah
  • Watts = voltaje * amperios;  //Potencia = Voltaje * corriente
  • energía =(watt*time)/3600;  // Vatios-seg vuelve a convertir en Watt-hora dividiendo 1hr(3600sec)
  •  energy=(watt*time)/(1000*3600); //para la lectura en kWh

completo.jpg

Todos los resultados se pueden visualizar en el monitor serial o mediante una pantalla LCD   de 16 x 2 caracteres para mostrar todos los resultados obtenidos en los pasos anteriores.

El conexionado del LCD sigue la conexión estandar de 4 pines para la linea de  datos mas las señales de control RS,RW  y Enable

Asimismo también es necesario un trimer de 10k  para el contraste de la pantalla

Resumidamente estas son pues las conexiones para el lcd

LCD -> Arduino
1. VSS -> GND de Arduino
2. VDD -> Arduino + 5v
3. VO -> Arduino GND pin + resistencia o potenciómetro
4. RS -> Arduino pin 8
5. RW -> Arduino pin 7
6. E -> pin Arduino 6
7. D0 -> Arduino – no conectado
8. D1 -> Arduino – no conectado
9. D2 -> Arduino – no conectado
10. D3 -> Arduino – no conectado
11. D4 -> Arduino pin 5
12. D5 -> Arduino pin 4
13. D6 -> Arduino pin 3
14. D7 -> pin Arduino 2
15. A -> Pin 13 de Arduino + resistencia (potencia de luz de fondo)
16. K -> Arduino GND (tierra de luz de fondo)

A continuación este es el  código de ejemplo para sacar por el monitor serie  los valores calculados

Serial.Print («tensión:»);
Serial.print(voltage);
Serial.println(«Volt»);
Serial.print («actual:»);
Serial.print(amps);
Serial.println(«Amps»);
Serial.print («potencia:»);
Serial.print(watt);
Serial.println(«Watt»);
Serial.print («energía consumida:»);
Serial.print(energy);
Serial.println(«Watt-Hour»);
Serial.println(«»);  //imprimir los siguiente conjuntos de parámetro después de una línea e
delay(2000);
Para manejar el  LCD tiene que primero importar la biblioteca de «LiquidCrystal» en el código.
A continuación este es el  código de ejemplo para sacar por el display  lcd  los valores calculados:
#include
lcd (8, 7, 6, 5, 4, 3, 2);
luz int = 9;
void setup()
{
pinMode (luz de fondo, salida); //set pin 9 como salida
analogWrite (contraluz, 150); //controls la intensidad de luz 0-254
lcd.begin(16,2); / / columnas, filas. tamaño de pantalla
LCD.Clear(); claro la pantalla
}
void loop()
{
lcd.setCursor(16,1); / / establecer el cursor fuera de la cuenta de pantalla
lcd.print(«»); imprimir carácter vacío
delay(600);
impresión de potencia y energía que un LCD / / /
lcd.setCursor(1,0); coloca el cursor en la columna 1 y fila 1

LCD.Print(Watt);
lcd.print («W»);
lcd.print(voltage);
lcd.print(«V»);
lcd.setCursor(1,1); coloca el cursor en la fila 1 columna y 2 º
lcd.print(energy);
lcd.print («WH»);
lcd.print(amps);
lcd.print(«A»);
}

 

Componentes

A continuación por ultimo algunos de los componentes necesarios para llevar a cabo este circuito:

 

1. ARDUINO UNO  (unos 9€ en Amazon)


3. Display LCD de 16 x 2 caracteres LCD (en Amazon con I2C  menos de 5€ )

4. ACS 712 SENSOR de corriente .Rango de corriente: 30A; Tamano: 31 x 13mm / 1.2 «x 0.5» (L * W) ( en Amazon unos 2€ )


Varios : resistencias de 10k v2,resistencia de 330ohm, POTENCIÓMETRO de 10K ,cables puente , placa de prototipos,etc

 

Monitorize su Raspberry Pi y Orange Pi


Puede ser muy útil monitorizar la carga de la CPU, la memoria y el uso de almacenamiento, y el tráfico de red de sus placas  a un estilo similar a  como lo hacen las  herramientas gráficas como System Monitor en Ubuntu que proporciona la mayor parte de la información, y monit que se puede usar en  servidores .

Recientemente se ha presentado  la utilidad RPi-Monitor para las placas Raspberry Pi ,Orange Pi  (versión parcheada) e incluso  para  la Banana Pi , y  como vamos a ver, es  muy fácil de instalar, proporcionando un panel gráfico limpio de muchas variables diferentes de lo que ocurren en nuestra placa.

En el caso de que tenga una placa Orange Pi ( en el ejemplo es la placa Orange Pi PC)  , lo recomendable es usar Armbian (versión servidor) , por lo que esta  sería  la plataforma ideal  para ejecutar RPi-Monitor (OPi-Monitor), pero el uso debe ser exactamente el mismo en Raspberry Pi aunque los pasos de instalación son algo diferentes .

Para instalar RPi-Monitor en Orange Pi PC ,One,etc   abra un terminal ssh  o acceda a la consola serie y puede instalar e iniciar el servicio con una sola línea de comandos:

 sudo armbianmonitor -r

Tras lanzar el comando , debería sacar por pantalla una salida similar a la siguiente:

/ _ \ _ __ __ _ _ __ __ _ ___ | _ \(_) | _ \ / ___|
| | | | ‘__/ _` | ‘_ \ / _` |/ _ \ | |_) | | | |_) | |
| |_| | | | (_| | | | | (_| | __/ | __/| | | __/| |___
\___/|_| \__,_|_| |_|\__, |\___| |_| |_| |_| \____|
|___/
Welcome to ARMBIAN 5.30 stable Ubuntu 16.04.2 LTS 3.4.113-sun8i
System load: 0.31 0.51 0.23 Up time: 3 min
Memory usage: 4 % of 1000MB IP: 192.168.1.48
CPU temp: 33°C
Usage of /: 8% of 15G
[ 0 security updates available, 73 updates total: apt upgrade ]
Last check: 2017-08-09 16:23
[ General system configuration: armbian-config ]
Last login: Wed Aug 9 16:24:46 2017
[email protected]:~# sudo armbianmonitor -r
Extracting templates from packages: 100% to 5 minutes. Be patient please
Selecting previously unselected package libxau6:armhf.
(Reading database … 43590 files and directories currently installed.)
Preparing to unpack …/libxau6_1%3a1.0.8-1_armhf.deb …
Unpacking libxau6:armhf (1:1.0.8-1) …
Selecting previously unselected package libxdmcp6:armhf.
Preparing to unpack …/libxdmcp6_1%3a1.1.2-1.1_armhf.deb …
Unpacking libxdmcp6:armhf (1:1.1.2-1.1) …
Selecting previously unselected package libxcb1:armhf.
Preparing to unpack …/libxcb1_1.11.1-1ubuntu1_armhf.deb …
Unpacking libxcb1:armhf (1.11.1-1ubuntu1) …
Selecting previously unselected package libx11-data.
Preparing to unpack …/libx11-data_2%3a1.6.3-1ubuntu2_all.deb …
Unpacking libx11-data (2:1.6.3-1ubuntu2) …
Selecting previously unselected package libx11-6:armhf.
Preparing to unpack …/libx11-6_2%3a1.6.3-1ubuntu2_armhf.deb …
Unpacking libx11-6:armhf (2:1.6.3-1ubuntu2) …
Selecting previously unselected package libxext6:armhf.
Preparing to unpack …/libxext6_2%3a1.3.3-1_armhf.deb …
Unpacking libxext6:armhf (2:1.3.3-1) …
Selecting previously unselected package fonts-dejavu-core.
Preparing to unpack …/fonts-dejavu-core_2.35-1_all.deb …
Unpacking fonts-dejavu-core (2.35-1) …
Selecting previously unselected package fontconfig-config.
Preparing to unpack …/fontconfig-config_2.11.94-0ubuntu1.1_all.deb …
Unpacking fontconfig-config (2.11.94-0ubuntu1.1) …
Selecting previously unselected package libfreetype6:armhf.
Preparing to unpack …/libfreetype6_2.6.1-0.1ubuntu2.3_armhf.deb …
Unpacking libfreetype6:armhf (2.6.1-0.1ubuntu2.3) …
Selecting previously unselected package libfontconfig1:armhf.
Preparing to unpack …/libfontconfig1_2.11.94-0ubuntu1.1_armhf.deb …
Unpacking libfontconfig1:armhf (2.11.94-0ubuntu1.1) …
Selecting previously unselected package fontconfig.
Preparing to unpack …/fontconfig_2.11.94-0ubuntu1.1_armhf.deb …
Unpacking fontconfig (2.11.94-0ubuntu1.1) …
Selecting previously unselected package libpixman-1-0:armhf.
Preparing to unpack …/libpixman-1-0_0.33.6-1_armhf.deb …
Unpacking libpixman-1-0:armhf (0.33.6-1) …
Selecting previously unselected package libxcb-render0:armhf.
Preparing to unpack …/libxcb-render0_1.11.1-1ubuntu1_armhf.deb …
Unpacking libxcb-render0:armhf (1.11.1-1ubuntu1) …
Selecting previously unselected package libxcb-shm0:armhf.
Preparing to unpack …/libxcb-shm0_1.11.1-1ubuntu1_armhf.deb …
Unpacking libxcb-shm0:armhf (1.11.1-1ubuntu1) …
Selecting previously unselected package libxrender1:armhf.
Preparing to unpack …/libxrender1_1%3a0.9.9-0ubuntu1_armhf.deb …
Unpacking libxrender1:armhf (1:0.9.9-0ubuntu1) …
Selecting previously unselected package libcairo2:armhf.
Preparing to unpack …/libcairo2_1.14.6-1_armhf.deb …
Unpacking libcairo2:armhf (1.14.6-1) …
Selecting previously unselected package libdatrie1:armhf.
Preparing to unpack …/libdatrie1_0.2.10-2_armhf.deb …
Unpacking libdatrie1:armhf (0.2.10-2) …
Selecting previously unselected package libdbi1:armhf.
Preparing to unpack …/libdbi1_0.9.0-4_armhf.deb …
Unpacking libdbi1:armhf (0.9.0-4) …
Selecting previously unselected package libencode-locale-perl.
Preparing to unpack …/libencode-locale-perl_1.05-1_all.deb …
Unpacking libencode-locale-perl (1.05-1) …
Selecting previously unselected package libfile-which-perl.
Preparing to unpack …/libfile-which-perl_1.19-1_all.deb …
Unpacking libfile-which-perl (1.19-1) …
Selecting previously unselected package libgraphite2-3:armhf.
Preparing to unpack …/libgraphite2-3_1.3.6-1ubuntu1_armhf.deb …
Unpacking libgraphite2-3:armhf (1.3.6-1ubuntu1) …
Selecting previously unselected package libharfbuzz0b:armhf.
Preparing to unpack …/libharfbuzz0b_1.0.1-1ubuntu0.1_armhf.deb …
Unpacking libharfbuzz0b:armhf (1.0.1-1ubuntu0.1) …
Selecting previously unselected package libtimedate-perl.
Preparing to unpack …/libtimedate-perl_2.3000-2_all.deb …
Unpacking libtimedate-perl (2.3000-2) …
Selecting previously unselected package libhttp-date-perl.
Preparing to unpack …/libhttp-date-perl_6.02-1_all.deb …
Unpacking libhttp-date-perl (6.02-1) …
Selecting previously unselected package libio-html-perl.
Preparing to unpack …/libio-html-perl_1.001-1_all.deb …
Unpacking libio-html-perl (1.001-1) …
Selecting previously unselected package liblwp-mediatypes-perl.
Preparing to unpack …/liblwp-mediatypes-perl_6.02-1_all.deb …
Unpacking liblwp-mediatypes-perl (6.02-1) …
Selecting previously unselected package liburi-perl.
Preparing to unpack …/liburi-perl_1.71-1_all.deb …
Unpacking liburi-perl (1.71-1) …
Selecting previously unselected package libhttp-message-perl.
Preparing to unpack …/libhttp-message-perl_6.11-1_all.deb …
Unpacking libhttp-message-perl (6.11-1) …
Selecting previously unselected package libhttp-daemon-perl.
Preparing to unpack …/libhttp-daemon-perl_6.01-1_all.deb …
Unpacking libhttp-daemon-perl (6.01-1) …
Selecting previously unselected package libipc-sharelite-perl.
Preparing to unpack …/libipc-sharelite-perl_0.17-3build3_armhf.deb …
Unpacking libipc-sharelite-perl (0.17-3build3) …
Selecting previously unselected package libjson-perl.
Preparing to unpack …/libjson-perl_2.90-1_all.deb …
Unpacking libjson-perl (2.90-1) …
Selecting previously unselected package libthai-data.
Preparing to unpack …/libthai-data_0.1.24-2_all.deb …
Unpacking libthai-data (0.1.24-2) …
Selecting previously unselected package libthai0:armhf.
Preparing to unpack …/libthai0_0.1.24-2_armhf.deb …
Unpacking libthai0:armhf (0.1.24-2) …
Selecting previously unselected package libpango-1.0-0:armhf.
Preparing to unpack …/libpango-1.0-0_1.38.1-1_armhf.deb …
Unpacking libpango-1.0-0:armhf (1.38.1-1) …
Selecting previously unselected package libpangoft2-1.0-0:armhf.
Preparing to unpack …/libpangoft2-1.0-0_1.38.1-1_armhf.deb …
Unpacking libpangoft2-1.0-0:armhf (1.38.1-1) …
Selecting previously unselected package libpangocairo-1.0-0:armhf.
Preparing to unpack …/libpangocairo-1.0-0_1.38.1-1_armhf.deb …
Unpacking libpangocairo-1.0-0:armhf (1.38.1-1) …
Selecting previously unselected package librrd4:armhf.
Preparing to unpack …/librrd4_1.5.5-4_armhf.deb …
Unpacking librrd4:armhf (1.5.5-4) …
Selecting previously unselected package librrds-perl:armhf.
Preparing to unpack …/librrds-perl_1.5.5-4_armhf.deb …
Unpacking librrds-perl:armhf (1.5.5-4) …
Selecting previously unselected package rpimonitor.
Preparing to unpack …/rpimonitor_2.10-1_all.deb …
Unpacking rpimonitor (2.10-1) …
Processing triggers for libc-bin (2.23-0ubuntu7) …
Processing triggers for man-db (2.7.5-1) …
Processing triggers for systemd (229-4ubuntu17) …
Processing triggers for ureadahead (0.100.0-19) …
Setting up libxau6:armhf (1:1.0.8-1) …
Setting up libxdmcp6:armhf (1:1.1.2-1.1) …
Setting up libxcb1:armhf (1.11.1-1ubuntu1) …
Setting up libx11-data (2:1.6.3-1ubuntu2) …
Setting up libx11-6:armhf (2:1.6.3-1ubuntu2) …
Setting up libxext6:armhf (2:1.3.3-1) …
Setting up fonts-dejavu-core (2.35-1) …
Setting up fontconfig-config (2.11.94-0ubuntu1.1) …
Setting up libfreetype6:armhf (2.6.1-0.1ubuntu2.3) …
Setting up libfontconfig1:armhf (2.11.94-0ubuntu1.1) …
Setting up fontconfig (2.11.94-0ubuntu1.1) …
Regenerating fonts cache… done.
Setting up libpixman-1-0:armhf (0.33.6-1) …
Setting up libxcb-render0:armhf (1.11.1-1ubuntu1) …
Setting up libxcb-shm0:armhf (1.11.1-1ubuntu1) …
Setting up libxrender1:armhf (1:0.9.9-0ubuntu1) …
Setting up libcairo2:armhf (1.14.6-1) …
Setting up libdatrie1:armhf (0.2.10-2) …
Setting up libdbi1:armhf (0.9.0-4) …
Setting up libencode-locale-perl (1.05-1) …
Setting up libfile-which-perl (1.19-1) …
Setting up libgraphite2-3:armhf (1.3.6-1ubuntu1) …
Setting up libharfbuzz0b:armhf (1.0.1-1ubuntu0.1) …
Setting up libtimedate-perl (2.3000-2) …
Setting up libhttp-date-perl (6.02-1) …
Setting up libio-html-perl (1.001-1) …
Setting up liblwp-mediatypes-perl (6.02-1) …
Setting up liburi-perl (1.71-1) …
Setting up libhttp-message-perl (6.11-1) …
Setting up libhttp-daemon-perl (6.01-1) …
Setting up libipc-sharelite-perl (0.17-3build3) …
Setting up libjson-perl (2.90-1) …
Setting up libthai-data (0.1.24-2) …
Setting up libthai0:armhf (0.1.24-2) …
Setting up libpango-1.0-0:armhf (1.38.1-1) …
Setting up libpangoft2-1.0-0:armhf (1.38.1-1) …
Setting up libpangocairo-1.0-0:armhf (1.38.1-1) …
Setting up librrd4:armhf (1.5.5-4) …
Setting up librrds-perl:armhf (1.5.5-4) …
Setting up rpimonitor (2.10-1) …
[ ok ] Starting rpimonitor (via systemctl): rpimonitor.service.
Processing triggers for libc-bin (2.23-0ubuntu7) …
Now patching RPi-Monitor to deal correctly with H3
Now you’re able to enjoy RPi-Monitor at http://192.168.1.48:8888
[email protected]:~#

 

Realmente en la instalación anterior en una Orange pi PC con ArmBian ,el comando tomó alrededor de mucho menos  de 8 minutos de los anunciados (unos 3 minutos)   y descargó e instaló los paquetes requeridos.

Si  la salida del log de ejecución  es mas corta que la anterior, o en la finalizacion  nos ofrece la url por defecto (http://192.168.0.112:8888)   ,es decir con una url diferente  a la que tengamos para conectarnos, probablemente  no  se habrá instalado correctamente por algún tipo de incompatibilidad de algún paquete que se tenga ya instalado ( por ejemplo el sw de cayenne que no funciona aún en una Orange pi Pc).

En cualquier caso, la solución es bastante simple: o desistalamos el paquete que sospechemos o lo mas rápido: volvemos a instalar ArmBian en la microSD (aqui puede ver los pasos)

 

Una vez completada la instalación correctamente, redirijase  a una ventana del navegador de su computadora a la URL que se proporciona al final del script para acceder a la interfaz web (en el  ejemplo http://192.168.1.48:8888)

 

Ahora haga clic en el botón verde de Inicio para que el sistema recopile datos automáticamente y terminará en la página de estado con información sobre la versión, el tiempo de actividad, el uso de la CPU, la temperatura, el uso de la memoria, el uso de tarjetas SD y el tráfico de red.

 

Eso es interesante , pero la parte favorita es la pestaña de Estadísticas pues muestra cuadros realmente limpios y útiles

 

Pueden ser confusas al principio ya que se utilizan dos escalas para elementos múltiples, con por ejemplo el izquierdo (0 a 100) que muestra el uso de la CPU en porcentaje y temperatura SoC, con la escala izquierda (0 a 5) usada para las otras métricas tales como frecuencia de CPU en GHz, CPUs Activas, etc … ,pero  cada elemento puede ser fácilmente desactivado y habilitado.

Existen 7 tipos de gráficos: Uptime, velocidades de carga / reloj / temperatura, detalles CPU Stats, memoria. Disks – boot, Disks – root y Network, y 6 opciones de actualización con la más rápida actualización cada 10 segundos para una ventana de 24 horas, y la más lenta cada 60 minutos para una vista de un año de la placa.

La pestaña Opciones sólo se utiliza para seleccionar el tiempo de actualización predeterminado y también puede acceder a los gráficos en el navegador de su teléfono inteligente explorando el núcleo QR en la sección Acerca de.

 

Por cierto, RPi-monitor es open source  ,lo que significa que puede estudiar el código,mejorarlo  y  reportar  bugs en  github. También puede obtener mas información y actualizaciones en el  blog del desarrollador.

Cómo instalar ArmBian en Orange Pi PC


Armbian es una distribución ligera basada en Debian o Ubuntu especializada para placas de desarrollo ARM. Compilado desde cero, contando con poderosas herramientas, desarrollo de software, y una comunidad vibrante.Otras placas ARM pueden ser las Raspberry PI, Odroid, Cubieboard… cada una de un fabricante distinto y luchando por hacerse con su espacio

Para instalar Armbian, primero debemos elegir entre un entorno gráfico o linea de comandos pues dependiendo lo que queramos hacer, elegiremos uno u otro sistema. Según la placa tendremos soporte completo con una de cuatro sistemas básicos  Debian Wheezy  (Jessie)  o   Ubuntu Trusty  (Xenial)

Ademas  dentro de esas distribuciones, podemos elegir entre «Legacy» y «Vanilla»,ambos estables y listos para producción, pero se debe elegir en base a nuestras necesidades, ya que su soporte básico es diferente:

  • Legacy: aceleración de vídeo, sistema al que conectar pantallas y otros periféricos, como teclado, ratón…
  • Vanilla: servidores sin monitor o periféricos, que se vayan a controlar remotamente por ssh ( por ejemplo desde el putty)

Más información acerca de Armbian se puede encontrar: Aquí  y se puede encontrar la guía de instalación: Aquí

Ok, ¿qué necesitamos para iniciar este pequeño proyecto?

Hardware necesario:

  1. Orange Pi PC
  2. 5V / 2A con el barril del CC Jack o el cable grueso del USB (utilicé 5V / 1,5A de mi teléfono viejo)
  3. Tarjeta SD – Clase 10!
  4. Teclado y ratón
  5. Cable HDMI
  6. Cable ethernet de LAN
  7. Lector de tarjetas

Software necesario:

  1. Descargar Armbian – Jessie,versión servidor  para el Orange Pi PC   Aquí
  2. Descargar SDFormatter: aqui
  3. Descargar Etcher: Here
  4. Descargar 7-Zip: Aquí
  5. Descargar Putty: aqui

Upzip, formato e instalación de Armbian a la tarjeta SD

Upzip, Formato e Instalación de Armbian a Tarjeta SD
  • Empezar a descargar Armbian (ver enlaces anteriores) e instalar SDFormatter, Etcher y 7-zip.
    (No estoy explicando cómo instalar esas aplicaciones porque es bastante sencillo.
  • Cuando esto se hace, abra la carpeta donde descargó la imagen de Armbian,
    Esto debe ser nombrado así:
    «Armbian_5.20_Orangepiplus_Debian_jessie_3.4.112_desktop.7z
  • Abra 7-zip y descomprima este archivo en un nuevo directorio para que tenga algo como: «Armbian_5.20_Orangepiplus_Debian_jessie_3.4.112_desktop.img 
  • Conecte su tarjeta SD a su computadora, en este caso utilicé un lector de tarjetas USB
  • Iniciar SDformatter
    • Drive: Seleccione su tarjeta SD ( Compruebe esto! )
    • Vaya a las opciones -> «Ajuste del tamaño del formato» -> YES (El valor predeterminado es «No») -> OK
    • Compruebe nuevamente si la tarjeta SD está seleccionada en la sección «Drive».
    • Haga clic en «Formato»
  • Iniciar Etcher (ejecutar como Administrador!)
    • » Seleccionar imagen » -> Seleccione su unzipt:
      Archivo «Armbian_5.20_Orangepiplus_Debian_jessie_3.4.112_desktop.img»
    • Seleccione » Cambiar » para cambiar su letra de unidad para usted Tarjeta SD
    • Seleccione «Flash!» Y esperar hasta que esto se haga
  • Desconecte su tarjeta SD cuando se haya completado este proceso, use la opción «Quitar hardware y expulsar material de forma segura» en Windows para asegurarse de que está bien

Conecte su Orange Pi PC  y arranque por  primera vez con Armbian

 Ok, ahora es el momento de conectar todos sus dispositivos y cables para iniciar su Orange Pi!
  • Conecte un teclado + mouse a USB
  • Conecte su cable HDMI a su TV  o monitor
  • Conecte el cable LAN al enrutador / conmutador
  • Inserte la tarjeta SD en la ranura de la tarjeta SD
  • Por último, pero no menos importante, conecte el cable de alimentación a su Orange Pi (recuerde que no hay soporte en el Micro USB como fuente de alimentación)
  • ¡Que empiece la diversión!

¿Cómo arrancar?

El primer arranque toma alrededor de 3 minutos y luego se reinicia y tendrá que esperar otro minuto para iniciar sesión. Este retraso se debe a que el sistema actualiza la lista de paquetes y crea SWAP de emergencia de 128Mb en la tarjeta SD.

¿Cómo iniciar sesión?

Ingrese como nombre de usuario » root» en la consola o mediante SSH y use la contraseña » 1234″ . Se le pedirá que cambie esta contraseña en el primer inicio de sesión. A continuación, se le pedirá que cree una cuenta de usuario normal que esté sudo (admin) habilitada.
Incluso te está preguntando si quieres cambiar la resolución de la pantalla, pero para mí está bien en 720P.
Estoy usando la línea de comandos con SSH (masilla) la mayor parte del tiempo.

Su escritorio ya está listo para usar! :

Le mostrará algo como esto: donde como vemos aparece la dirección IP a la que nos podemos conectar por ssh

Inicie Putty y conéctese a la dirección IP de su Orange Pi así (ver captura de pantalla):

Nombre de host (o dirección IP): 192.168.1.48 (sólo mi ejemplo, cambie a su IP)
Puerto 22 (predeterminado)
Y haga clic en «Abrir»

Putty le dará un mensaje de seguridad la primera vez, simplemente haga clic en «Sí».

Ingrese con «root» como nombre de usuario, y su propia contraseña.

Actualizar, establecer una IP estática y deshabilitar raíz para iniciar sesión.

Su Orange Pi debe ejecutar el escritorio y SSH ahora mismo, pero queremos hacer más!

Estos 3 pasos no son obligatorios, pero me gustaría recomendarlo o al menos echarle un vistazo.

  • Actualizar / actualizar su Armbian
    Inicie sesión con Putty en su Orange Pi, y use este comando para actualizar / actualizar su Armbian:
    » Sudo apt-get update«  o simplemente   «apt-get update» si esta logado como root
    Después de esto:
    «Sudo apt-get upgrade -y » o simplemente apt-get upgrade -y  si esta logado como root     .En caso de error puede que tenga   que selecionar la opcion -f , es decir            apt-get -f install
  • Configurar un IP estático
    Quiero tener una dirección IP estática (no DHCP) en mi Orange Pi, así que sé con seguridad que estoy conectando a mi Orange Pi en la misma dirección IP todo el tiempo.
    Inicie sesión con Putty en su Orange Pi y utilice este comando ifconfig  para ver los detalles de su IP actual:

    [email protected]:~# ifconfig
    eth0 Link encap:Ethernet HWaddr d2:94:6d:f5:41:56
    inet addr:192.168.1.48 Bcast:192.168.1.255 Mask:255.255.255.0
    inet6 addr: fe80::d094:6dff:fef5:4156/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:20090 errors:0 dropped:0 overruns:0 frame:0
    TX packets:9527 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:24031895 (24.0 MB) TX bytes:757452 (757.4 KB)
    Interrupt:114
    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:1 errors:0 dropped:0 overruns:0 frame:0
    TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:104 (104.0 B) TX bytes:104 (104.0 B)

    [email protected]:~#

  • En este caso, quiero usar esta dirección IP 192.168.1.48 como una dirección IP estática, pero usted tiene que comprobar qué dirección IP que desea utilizar en este rango.Tipo:
    «nano / etc / network / interfaces «, el texteditor Nano se abrirá y le mostrará la configuración de red, busque los detalles de «eth0», como esto:

source /etc/network/interfaces.d/*

# Wired adapter #1
allow-hotplug eth0
no-auto-down eth0
iface eth0 inet dhcp
#address 192.168.0.100
#netmask 255.255.255.0
#gateway 192.168.0.1
#dns-nameservers 8.8.8.8 8.8.4.4
# hwaddress ether # if you want to set MAC manually
# pre-up /sbin/ifconfig eth0 mtu 3838 # setting MTU for DHCP, static just: mtu 3838

# Wireless adapter #1
# Armbian ships with network-manager installed by default. To save you time
# and hassles consider using ‘sudo nmtui’ instead of configuring Wi-Fi settings
# manually. The below lines are only meant as an example how configuration could
# be done in an anachronistic way:
#
#allow-hotplug wlan0
#iface wlan0 inet dhcp
#address 192.168.0.100
#netmask 255.255.255.0
#gateway 192.168.0.1
#dns-nameservers 8.8.8.8 8.8.4.4
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
# Disable power saving on compatible chipsets (prevents SSH/connection dropouts over WiFi)
#wireless-mode Managed
#wireless-power off

# Local loopback
auto lo
iface lo inet loopback

  • Ahora necesitamos cambiar la parte » dhcp » a » static «, y llenar todos los detalles de la dirección

    IP.Cambiarlo así:# Wired adapter #1
    allow-hotplug eth0
    no-auto-down eth0
    iface eth0 inet static
    address 192.168.1.48
    netmask 255.255.255.0
    gateway 192.168.0.1
    #dns-nameservers 8.8.8.8 8.8.4.4
    # hwaddress ether # if you want to set MAC manually
    # pre-up /sbin/ifconfig eth0 mtu 3838 # setting MTU for DHCP, static just: mtu 3838# Wireless adapter #1
    # Armbian ships with network-manager installed by default. To save you time
    # and hassles consider using ‘sudo nmtui’ instead of configuring Wi-Fi settings
    # manually. The below lines are only meant as an example how configuration could
    # be done in an anachronistic way:
    #
    #allow-hotplug wlan0
    #iface wlan0 inet dhcp
    #address 192.168.0.100
    #netmask 255.255.255.0
    #gateway 192.168.0.1
    #dns-nameservers 8.8.8.8 8.8.4.4
    # wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    # Disable power saving on compatible chipsets (prevents SSH/connection dropouts over WiFi)
    #wireless-mode Managed
    #wireless-power off# Local loopback
    auto lo
    iface lo inet loopback

    Guarde este documento pulsando » ctrl + x «, » Y » y pulse enter ( no cambie el nombre de archivo! )
    Ahora necesitamos reiniciar el servicio de red en Armbian, pero no sé por qué, reiniciando Armbian funciona muy bien aquí. Puede reiniciar tecleando este «reboot».

  • Putty le dará un mensaje » Server inesperadamente cerrado conexión de red «, pero eso no es extraño, que está reiniciando el Orange Pi.
    En putty utilice el botón «Restart ression» para reiniciar la conexión a su Orange Pi.Ahora cambiamos una dirección IP DHCP a una dirección IP estática para » ETH0 «.
  • Desactivar la conexión root de SSH en Armbian
    ¿Por qué debemos desactivar la cuenta de root para el inicio de sesión de SSH? Bastante simple, la seguridad !
    Casi todas las distribuciones de Linux tienen la cuenta «root», así que si alguien quiere hackear / fuerza bruta
    Un servidor Linux que están intentando iniciar sesión con esta cuenta. Al deshabilitar esta cuenta, primero deben encontrar una cuenta de usuario.Para solucionar este problema, debemos editar el archivo » sshd_config «, que es el archivo de configuración principal del servicio sshd. ¡Asegúrese de que su segunda cuenta funcione! Al principio, Armbian le pidió que creara una segunda cuenta de usuario con una contraseña. Cierre sesión en Putty e intente iniciar sesión con esta cuenta. En mi caso creé una cuenta » orangepi «.Tipo:
    » Sudo nano / etc / ssh / sshd_config «Encuentre esta parte: (en Nano puede buscar con «ctrl + w»)
    » PermitRootLogin «Te mostrará:
    # Autenticación:LoginGraceTime 120
    PermitRootLogin sí
    StrictModes síCambie el « PermitRootLogin  » a » PermitRootLogin no »
    Guardar esto golpeando » ctr + x «, Y (es) y pulse enter (no cambie el nombre del archivo!)
    Reinicie SSH escribiendo:
    » Sudo service ssh restart «Cierre la sesión e intente ingresar con «root», si ha cambiado esto correctamente, le dará un error ahora.
    «Acceso denegado».
    Inicia sesión con tu segunda cuenta ahora, en mi caso es «orangepi» y ya está!

Software adicional

Estos son sólo extra como: 

  • GPIO 
    Al igual que la Raspberry Pi (RPI), el Orange Pi (OP o OPI) tiene algunos GPIO para jugar.
    El RPI usa un programa llamado «WiringPi», pero para el Orange Pi tenemos «WiringOP»!
    Se puede encontrar más información: aquí y aquí

    • Ir a su homedirectory
    • Tipo: «clon de git https://github.com/zhaolei/WiringOP.git -b h3″
    • Tipo: «cd WiringOP»
    • Tipo: «sudo chmod + x ./build»
    • Tipo: «sudo ./build»
    • Tipo: «gpio readall» para ver una visión general de todos los puertos GPIO.
  • VNC sobre SSH
    Puedo copiar pasado este sitio web completo, pero toda la información es:Aquí
  • RPI-Monitor
    Puedo copiar pasado este sitio web completo, pero toda la información es:Aquí
  • Webmin 
    Puedo copiar pasado este sitio web completo, pero toda la información es: Aquí

Alarma con estación meteorológica


También decidió utilizar un servidor MQTT para subir esta información en la web por lo que se puede desde cualquier lugar, tener un vistazo a la información meteorológica captada por este prototipo.

Elementos del montaje:

  1. nodeMCU (regulador Micro,  versión 0.9)
  2. Pantalla LCD – 16 x 2
  3. Botones – 3
  4. Sensor de temperatura DHT11
  5. Timbre o zumbador
  6. Placa de prototipos tamaño  mini
  7. Cables de puente
  8. Resistencia de 1000 Ω – 3
  9. Caja de madera para montar todas las cosas dentro.

Asignación de pines y planificación

Bien, así que vamos a hablar acerca de cómo tenía que distribuir los pasadores entre todos los componentes.

La pantalla LCD

La pantalla LCD,  necesita al menos 6 pines de I/O interfaz con el microcontrolador. Puede darse como sigue: Habilitar, register select, D04, D05, D06 D07.

  • Enable – pin I/O digital 0
  • Seleccione Registro – pin I/O digital 1
  • D04 – pin I/O digital 2
  • D05 – pin I/O digital 3
  • D06 – pin I/O digital 4
  • D07 – pin I/O digital 5

Los botones

Hay tres botones que vamos a usar, por lo queo bviamente  necesitaríamos tres pins de I/O digitales,

  • LeftButton – pin I/O digital 6
  • CenterButton – pin I/O digital 7
  • RightButton – pin I/O digital 8

El zumbador

El puede ser conectado al pin I/O digital 9.

El sensor de temperatura DHT11

Este sensor tiene un pin de salida y sigue para el pin de I/O digital 10

 

Ensamblaje

En una caja de madera ser practican agujeros para el lcd  y lo botones y entonces es hora de montar todo dentro de esa caja.

  1. Creo que tenemos que empezar con los botones. Usé un palito de helado estrecho para hacer una base para los botones.
  2. Luego tomar el nodeMCU y las placa de prototipos y pegarloo a la base de la caja con cinta de doble cara.
  3. Entonces conectar los botones a los pines de I/O digitales apropiados.
  4. En tercer lugar, colocar  la pantalla LCD y luego agarrarla bien a la caja con algunas cintas desde el interior. .
  5. Hacer las conexiones de la pantalla LCD.
  6. Luego conectar el timbre o buzzer en el interior de la caja con cinta de doble cara y conectar su terminal positivo al pin digital 9
  7. El sensor DHT11 tiene tres piness: 5v, gnd y la salida. Por lo tanto el pin de salida irá al pin digital 10 de la nodeMCU . 5v y tierra son obvias dónde deben ir.
  8. También para agregar, DHT11 es lo único que se quedará fuera de la caja para detectar la temperatura exterior. .

 

El código

El código qeu ha escrito Techovator0819      es cerca de 450 líneas de longitud. y cuenta  con  algunas bibliotecas importantes que se necesitan para descargar  asi que lo primero es asegúrarse de tener el IDE de Arduino instalado asi como tener los drivers del  esp8266 instaladas también. Si no lo ha hecho, haga clic aquí.

El primer paso antes de ver  el código, es entender la funcionalidad de nuestro dispositivo y el código en consecuencia:

  • Nestro WB(weather box)  accede a internet y recupera la información de tiempo apropiado a través de una llamada a la API.
  • También  tomara  la temperatura del medio ambiente  con un sensor propio y enviara esa información a un corredor de MQTT.
  • También podría mantener alarmas y temporizadores para usted.
  • También es capaz de mostrar hora y fecha.

Todo , esto significa que necesitamos integrar todas estas funciones bajo un título o código.

¿Cuáles son las bibliotecas que necesitamos?

  1. Librería LiquidCrystal . Como estamos usando una pantalla LCD como la principal interfaz entre usted y el NodeMCU, esta biblioteca es indispensable. Paranuestra comodidad, esta biblioteca, por defecto, es una biblioteca integrada en el IDE de Arduino.
  2. Biblioteca de ESP8266WiFi . Esta biblioteca permite el ESP8266 conectar con el Wifi y tener acceso a internet. Esta librería viene en un paquete que debe descargar durante la instalación del ESP8266 en el administrador de la placa.
  3. Biblioteca de ArduinoJson . Cuando se llama a la API, los datos que usted recibirá estaran en formato JSON (JavaScript Object Notation). Así que si quiere convertirlo a un formato utilizable, necesita analizarlo. Y la biblioteca de ArduinoJson lo hace por nosotros.
  4. Biblioteca para el sensor DHT11.
  5. Biblioteca en tiempo de. Para mantener a nuestro tiempo. Las funciones de biblioteca se enumeran aquí.
  6. Biblioteca de TimeAlarms . Se utiliza para que nos establezcan alarmas y temporizadores. Las funciones de biblioteca se enumeran aquí.

Las dos últimas bibliotecas deben utilizarse juntos. Puede usar la biblioteca en tiempo de forma independiente pero no de la biblioteca de TimeAlarms.


La llamada de API

 

The API Call

 

 

 

 

Lo más importante es una llamada a la API es la API key. Estoy conectando a la página web openweathermap.org para obtener toda la información de tiempo. Así que hay que seguir el procedimiento para abrir una cuenta allí y obtener un API key y es absolutamente gratis. Para llamar a la API key,
El primer paso es conectarse al servidor.

En segundo lugar, usted necesita utilizar su API key en la URL.Usted deberá utilizar el método GET para recuperar los datos de la URL.

Para hacer los datos disponibles en un formato utilizable,necesita para luego almacenar los datos en una cadena.

Los datos que reciba serán en formato JSON. Así que hay que analizarlo.

Y luego, se almacenan la información deseada en algunas variables globales que se pueden utilizar en cualquier lugar en el código.

     El siguiente es un ejemplo de código  para demostrar cómo funciona. Esta parte básicamente declara las bibliotecas utilizadas, crea las variables y objetos de la biblioteca a consultar.

include <ArduinoJson.h>
#include <ESP8266WiFi.h>
String result; 
// la cadena en la que se almacenarán los datos después de la llamada a la API
char servername[]="api.openweathermap.org"; //mombre servidor
String APIKEY = "YOUR_API_KEY"; //el API key
String CityID = "1264527"; //el  ID de la ciudad

//Asignación de sus variables globales para almacenar la información meteorológica recibida
String Description;
String Place;
float Temperature;
float Humidity;
float w;
WiFiClient client; >

Código de configuración básica.

void setup()

{

// Ponga su código de configuración aquí, para ejecutar una vez:
Serial.begin(9600);
WiFi.begin(«your ssid», «your password»);

//empieza  conexion WIFI
while(WiFi.status() != WL_CONNECTED)

{

// espera hasta que se establezca la conexión
Serial.print(«.»);
delay(500);
}
Serial.println(«Connectado!»);
Serial.println(WiFi.localIP());   //imprime direccion  IP
}<

Código para crear una función que obtiene los datos.

void weatherData(){

if (client.connect(servername, 80)) {

// inicia la conexión del cliente, comprueba la conexión
client.println(«GET /data/2.5/weather?id=»+CityID+»&units=metric&APPID=»+APIKEY);

//// llama a la api usando el método get antes de la URL. Nota: La URL utiliza la clave api.
Serial.println(«Server esta accesible»);
client.println();
}
else { //  si el servidor no esta disponible
Serial.println(«fallo de conexion  «); //mensaje de errorsi no esta conectado el cliente
Serial.println();
}
result = «»;

//Hace que la cadena nula de cualquier dato almacenado previamente para almacenar nuevos datos
while (client.available()) { //connected or data available
char c = client.read(); //gets byte from ethernet buffer
result = result+c;
}
Serial.println(result);
result.replace(«[«, » «);

//Estoy enfrentando un error. Sólo para evitarlo, tengo que escribir esto
result.replace(«]», » «);

//y esto tambien.
client.stop(); //para  cliente
Serial.println(«Recieved»);

//Analiza la cadena llamada resultado

StaticJsonBuffer<1024> jbuff;

JsonObject &root = jbuff.parseObject(result);
if (!root.success())
{
Serial.println(«parseObject() failed»);
}

// almacena toda la información deseada en variables temporales.
String location = root[«name»];
float temperature = root[«main»][«temp»];
float humidity = root[«main»][«humidity»];
String description = root[«weather»][«description»];
float wind = root[«wind»][«speed»];

//Transfiere toda la información de las variables temporales a variables globales a las //que puede acceder en cualquier parte del código.
Place = location;
Temperature = temperature;
Humidity = humidity;
w = wind * 3.6;
Description = description;
}

La función de bucle para mostrar todo lo que te quieren en el monitor serie.

void loop() {

weatherData(); //Llama a la función que hemos discutido anteriormente
Serial.println(Temperature);
Serial.println(Place);
Serial.print(«H: «);
Serial.println(Humidity);
Serial.print(w);
Serial.println(» kmph»);
Serial.println(Description);
delay(8000); //retardo de  8 segundos
}

Como vemos  es un ejemplo básico de una llamada a la API y el análisis de datos JSON.

 

MQTT cliente y agente

 

MQTT Client and Broker

 

 

Como hemos visto en este blog el autor h aoptado  por el frameworl Cayyene de MyDevices para salvar la informacion procedente del sensor DHT11

one.jpg

 

 

two.jpg

 

 

 

 

four.jpg

 

 

five.jpg

 

 

Como vemos va  subiendo nuestros datos de los sensores a un corredor de MQTT en internet por lo que podemos ver desde cualquier lugar.
Pesonalmente pienso que el tablero de instrumentos del Cayenne es el más conveniente así queno me sorprende que el autor lo hay usado
Resumidamente esto son los pasos  para usar el servicio
  • En primer lugar, debe crear una cuenta.
  • Después de haber conectado la placa a Cayena se le dirigirá automáticamente a la consola donde se pueden utilizar los widgets personalizados disponibles.
  • Asegúrese de especificar correctamente el canal y corresponden a ese canal para enviar datos en el código.
  • Después de que hayas hecho eso, cree un nuevo proyecto y arrastrar y soltar widgets como de sus dispositivos.
  • El siguiente es un código de ejemplo para que comprendas cómo Protocolo MQTT. También utilizaremos la biblioteca Cayena-MQTT-ESP8266 para hacer las cosas mucho más fácil para nosotros.
    <#include 
    
    char ssid[] = "ssid";
    char wifiPassword[] = "wifiPassword";
    
    char username[] = "MQTT_USERNAME";
    
    char password[] = "MQTT_PASSWORD";
    char clientID[] = "CLIENT_ID";
    
    void setup() {
    
      Serial.begin(9600);
      Cayenne.begin(username, password, clientID, ssid, wifiPassword);
    }
    
    void loop() {
    
     Cayenne.loop(); //this function must be called regularly to keep the connection stable
      float sensorInfo = analogRead(A0);
      Cayenne.virtualWrite(0, sensorInfo); //virtualWrite(channel, data) is function with two parameters. Channel - you want to send the data to and second parameter is the data itself.
    }
  • Después de eso, usted será capaz de enviar y recibir datos sin problemas. Para este , se ha usado sólo dos widgets icono es decir ‘temperatura’ y ‘humedad’.
  • Después de crear una cuenta, haga clic en ‘Add New’.
  • A continuación, haga clic en ‘Dispositivo/Widget’Haga clic en «Traiga su propia cosa», que es en la parte inferior.Una nueva página aparecerá indicando su nombre de usuario MQTT, contraseña y el ID de cliente que son únicas para usted. Estos se aplicarán en el código para identificar el dispositivo.

Estructura del código final

La longitud total del código es alrededor de 550 líneas.

El código está dividido en dos secciones. Una PageDisplay y otra DecMaker (abreviatura de decisiones). Cada vez que usted pulsa cualquier botón, basado en que (derecha o izquierda), la pantalla mostrará esa página. Cuando en página y el centerButton, el código se moverá a la DecMaker. Dentro de la función DecMaker y basado en qué página estaba finalmente abierta, ejecutará las acciones correspondientes. Puede recibir datos meteorológicos, sensores, alarmas y temporizadores.

Las páginas se muestran según los modos. Los modos son cuatro. Pueden ser,

  1. Inicio modo: para obtener los datos meteorológicos y visualizarlos. Así como percibir el entorno.
  2. Modo set timer – establecer temporizadores para usted
  3. Modo de programar la alarma – establecer alarmas para que usted
  4. Panel de control – cuando tu no en cualquiera de los modos, prefiere podría quedarse en el tablero de instrumentos.

A continuación, vamos a hablar sobre el sketch principal 

Paso 9: El código principal

El siguiente es el código principal.

Para descargar el código, haga clic aquí.

LiquidCrystal lcd(16, 5, 4, 0, 2, 14);
#define rightButton 13
#define centerButton 15
#define leftButton 12
#define buzz 3
int page = 1;
byte leftArrow[8]
{ B00000,
 B00010,
 B00110,
 B01110,
 B11110,
 B01110,
 B00110,
 B00010
};
byte rightArrow[8]{
 B00000,
 B01000,
 B01100,
 B01110,
 B01111,
 B01110,
 B01100,
 B01000
};
byte line[8]
 { B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110
};
String result;
char servername[]="api.openweathermap.org";
String APIKEY = "Your Api key";
String CityID = "Your city ID";</p><p>String Description;<br>String Place;
float Temperature;
float Humidity;
float w;
WiFiClient client;
dht DHT;#define pin 1
int set=1; // for configuring the alarm
int a, b, c; // used to denote the hour, minute and second while setting an alarm</p>
char username[] = "MQTT_username";<br>char password[] = "MQTT_password";
char clientID[] = "Client ID";

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
 WiFi.begin("ssid", "password");
 lcd.print("Weather box");
 delay(2000);
 lcd.clear();
 if (WiFi.status() == WL_CONNECTED){
 Cayenne.begin(username, password, clientID);
 lcd.print("Connected!");
 delay(3000);
 lcd.clear();
 Serial.println(WiFi.localIP());
 } else {
 lcd.print("Not conn");
 delay(3500);
 }
 lcd.clear();
 lcd.begin(16, 2);
 lcd.createChar(0, leftArrow);
 lcd.createChar(1, rightArrow);
 lcd.createChar(3, line);
 
 pinMode(rightButton, INPUT);
 pinMode(centerButton, INPUT);
 pinMode(leftButton, INPUT);
 pinMode(buzz, OUTPUT);
 digitalWrite(buzz, LOW);
 
 setTime(15, 12, 50, 25, 5, 17);
 delay(1000);
}
int val = 1;
int x,y; //for setting timer minutes and seconds
int trig; //for coniguring the timer
int counter = 0;
void loop() {
 // put your main code here, to run repeatedly:
 while(val == 1){
 if (digitalRead(leftButton)==HIGH)
 { val = 0;}
 lcd.clear();
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 lcd.write(byte(3));
 lcd.print("WiFi:");
 if (WiFi.status() == WL_CONNECTED){
 lcd.print("conn"); } 
 else {
 lcd.print("Nconn");} 
 lcd.setCursor(0, 1);
 lcd.write(byte(0));
 lcd.print("Menu");
 lcd.write(byte(3));
 
 if (digitalRead(centerButton)){
 DHT.read11(pin);
 lcd.print("T:");
 int a = DHT.temperature; //converting float to int
 lcd.print(a);
 int b = DHT.humidity; // converting float to int
 lcd.print(" H:");
 lcd.print(b);
 delay(3000);
 }else {
 date();
 }
 counter++;
 if (counter == 60){
 if (WiFi.status()==WL_CONNECTED){
 Cayenne.loop(); 
 DHT.read11(pin); 
 Cayenne.virtualWrite(1, DHT.temperature);
 Cayenne.virtualWrite(2, DHT.humidity); 
 } 
 counter = 0;
 }
 delay(50);
 }
 while (val != 1){
 delay(200);
 pageDisplay();
 if (digitalRead(rightButton)){
 if (page == 4){
 page = page;
 } else {
 page++;
 }
 pageDisplay();
 
 } else if (digitalRead(leftButton)){
 if (page == 1){
 page = page;
 } else {
 page--;
 }
 pageDisplay();
 
 } else if (digitalRead(centerButton)== HIGH){
 decMaker();
 }
 }
}
void pageDisplay()
{ switch(page){
 case 1:
 lcd.clear();
 lcd.setCursor(6, 0);
 lcd.print("Home");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 2:
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Set Timer");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 3: 
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Set Alarm");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 4:
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Dash Board");
 break;
 default:
 lcd.clear();
 lcd.print("Error 002");
 break;
 }
}
void date(){
 lcd.print(day());
 lcd.print(" ");
 int a = month();
 switch(a){
 case 1:
 lcd.print("Jan");
 break;
 case 2:
 lcd.print("Feb");
 break;
 case 3:
 lcd.print("Mar");
 break;
 case 4:
 lcd.print("Apr");
 break;
 case 5:
 lcd.print("May");
 break;
 case 6:
 lcd.print("Jun");
 break;
 case 7:
 lcd.print("Jul");
 break;
 case 8:
 lcd.print("Aug");
 break;
 case 9: 
 lcd.print("Sep");
 break;
 case 10:
 lcd.print("Oct");
 break;
 case 11:
 lcd.print("Nov");
 break;
 case 12:
 lcd.print("Dec");
 break;
 default:
 lcd.print("005");
 }
 if (day()<10){
 lcd.print(" ");
 }
 lcd.print(year());
 }
void decMaker(){
 switch(page){
 case 1:
 lcd.clear();
 lcd.print(". . .");
 weatherData(); 
 lcd.clear();
 while (digitalRead(leftButton) == LOW){
 weatherData();
 digitalRead(leftButton);
 lcd.setCursor(6, 0);
 lcd.print("IST:");
 lcd.setCursor(5, 1);
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 delay(3000);
 lcd.clear();
 lcd.print("Wthr in ");
 lcd.print(Place);
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(Temperature);
 lcd.setCursor(9, 1);
 lcd.print("H:");
 lcd.print(Humidity);
 delay(3000);
 lcd.clear();
 digitalRead(leftButton);
 lcd.print("Wind: ");
 lcd.print(w);
 lcd.print("kmph");
 lcd.setCursor(0, 1);
 lcd.print(Description);
 delay(2000);
 lcd.clear();
 DHT.read11(pin);
 lcd.print("Room: ");
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(DHT.temperature);
 lcd.setCursor(9, 1);
 lcd.print("H:");
 lcd.print(DHT.humidity);
 delay(2000);
 lcd.clear();
 }
 lcd.begin(16, 2); // In my case the lcd doesn't work without this. But don't know why.
 break;
 case 2:
 setTimer();
 break;
 case 3:
 setAlarm();
 Serial.print("THREE");
 lcd.begin(16, 2);
 break;
 case 4:
 Serial.print("FOUR");
 val = 1;
 break;
 default:
 Serial.print("not a valid entry");
 lcd.clear();
 lcd.print("error 001");
 break;
 }
}
void weatherData()
{ if (client.connect(servername, 80)) 
{ //starts client connection, checks for connection
 client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
 Serial.println("Server is accessable");
 client.println();
 } 
 else {
 Serial.println("connection failed"); //error message if no client connect
 Serial.println();
 }
 result = "";
 while (client.available()) { //connected or data available
 char c = client.read(); //gets byte from ethernet buffer
 result = result+c;
 }
 result.replace("[", " ");
 result.replace("]", " ");
 client.stop(); //stop client
 Serial.println("Recieved");
 
 StaticJsonBuffer<1024> jbuff;
 JsonObject &root = jbuff.parseObject(result);
 if (!root.success())
 {
 Serial.println("parseObject() failed");
 }
String location = root["name"];
 float temperature = root["main"]["temp"];
 float humidity = root["main"]["humidity"];
 String description = root["weather"]["description"];
 float wind = root["wind"]["speed"];
Place = location;
 Temperature = temperature;
 Humidity = humidity;
 w = wind * 3.6;
 Description = description;
}
void alarm()
{ Serial.println("Alarm activated");
 lcd.clear();
 lcd.print("Wake up, Lazy");
 for (int i = 0; i <= 10; i++){
 digitalWrite(buzz, HIGH);
 delay(80);
 digitalWrite(buzz, LOW);
 delay(80);
 digitalWrite(buzz, HIGH);
 delay(80);
 digitalWrite(buzz, LOW);
 delay(800);
 }
 digitalWrite(buzz, LOW);
 set = 0;
}
void setAlarm(){
 set = 1;
 int pos = 1;
 a, b, c = 0;
 repeat:
 //timeDisplay();
 lcd.clear(); 
 lcd.setCursor(0, 0); 
 lcd.print(a); 
 lcd.print(":");
 lcd.print(b); 
 lcd.print(":");
 lcd.print(c); 
 lcd.setCursor(0, 1);
 if (pos == 1){ lcd.print("hours");}
 else if (pos == 2){ lcd.print("minutes");}
 else if (pos == 3){lcd.print("seconds");}
 delay(200);
 if (digitalRead(leftButton)){//leftButton
 if (pos == 3)
 {pos = 1;}
 else 
 {pos++;}
 } else if (digitalRead(rightButton)){
 switch (pos){
 case 1:
 if (a == 23){ a = 0;}
 else {a++;}
 break;
 case 2:
 if (b == 59){ b = 0;}
 else {b++;}
 break;
 case 3:
 if (c == 59){ c = 0;}
 else {c++;}
 break;
 }
 } else if (digitalRead(centerButton)){
 confirmAlarm();
 } 
 if (set == 0){
 goto endIt;
 }
 goto repeat;
 endIt:
 Serial.println("Alarm executed successfully");
}

void confirmAlarm()
{ lcd.clear();
 Alarm.alarmOnce(a, b, c, alarm);
 up:
 lcd.setCursor(1, 0);
 lcd.print("Alarm Running");
 lcd.setCursor(3, 1);
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 lcd.print(":");
 lcd.print(second());
 Alarm.delay(200);
 delay(1);
 lcd.clear();
 //timeDisplay();
 Serial.println("...");
 if (set == 0||digitalRead(centerButton)){goto down;}
 goto up;
 down:
 set = 0;
}
void setTimer(){
 int cur = 1;
 x, y = 0;
 trig = 1;
 roof:
 lcd.clear();
 lcd.setCursor(2, 0);
 lcd.print("minutes: ");
 lcd.print(x);
 lcd.setCursor(2, 1);
 lcd.print("seconds: ");
 lcd.print(y);
 if (cur == true){lcd.setCursor(0, 0); lcd.write(byte(1));}
 else {lcd.setCursor(0, 1); lcd.write(byte(1));}
 delay(200);
 if (digitalRead(rightButton)){
 switch(cur){
 case 1:
 if (x == 20){x=0;}
 else {x++;}
 break;
 case 2:
 if (y == 59){y = 0;}
 else {y++;}
 break;
 default: 
 lcd.clear();
 lcd.print("ERROR 003");
 }
 } else if (digitalRead(leftButton)){
 if (cur == 2){cur = 1;}
 else {cur++;}
 }
 if (digitalRead(centerButton)){
 confirmTimer();
 } else {
 goto roof;
 }
 trig = 0;
 lcd.setCursor(0, 0);
 lcd.print("Timer successful");
 delay(2000);
 lcd.clear();
}</p><p>void confirmTimer(){<br> int z;
 z = x*60 + y;
 Alarm.timerOnce(z, timer);
 lcd.clear();
 
 sky:
 Serial.println(".");
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("CountDown Timer");
 lcd.setCursor(7, 1);
 lcd.print(z);
 z--;
 Alarm.delay(999);
 delay(1);
 if (trig == 0||digitalRead(centerButton)==HIGH){goto ground;}
 goto sky;
 ground:
 trig = 0;
 lcd.clear();
}
void timer(){
 Serial.println("Boom, timer is on!! :)");
 lcd.clear();
 lcd.setCursor(3, 0);
 lcd.print("Time's Up!");
 for (int i = 0; i<=10; i++){
 for (int j = 0; j<=3; j++){
 digitalWrite(buzz, HIGH);
 delay(70);
 digitalWrite(buzz, LOW);
 delay(70);
 }
 delay(700);
 }
 trig = 0;
}

Mas información en http://www.instructables.com/id/IoT-Weather-Box-with-Custom-Alarms-Timers/

Cómo instalar Debian Jessi (Linux) en una Orange Pi PC


Desgraciadamente la imagen ofrecida  por parte del fabricante en su site original   http://www.orangepi.org/downloadresources/  , padece de algunas carencias  sobre todo para instalar sw especifico como el agente Cayenne  o por ejemplo Node.js

Buscando   satisfacer  la necesidad  de una imagen linux estable , tenemos una nueva distribución de Debian Jessie ,la cual destaca de forma sobresaliente por encima del resto  de imágenes «oficiales » que creemos merece probar.

¿Qué necesitamos?

No se diferencia respecto a otras distribuciones. Como orientación necesitaremos los siguientes elementos:

  • Orange Pi PC (obviamente)
  • Samsung 16GB micro SD EVO UHS-I Clase 10 48MB / s
  • Jacer’s Debian Jessie imagen, descargada del  enlace foro topic
  • Win32DiskImager

Pasos para la instalación

El primer paso es descargar la imagen de Debian Jessie de esta url :https://mega.nz/#F!y0Y0SZhJ!RD5an8l9qEo_RppBsxxbrQ!y9ZDECra

Extraeremos el fichero  ‘Debian8_jacer_2.rar’

El resultado de descomprimir terminara con  tres  archivos:

  •  ‘Debian8_jacer_2.img’
  •  ‘Script.bin and uIimage fora OPI-2 OPI-2 MINI.zip ‘. 
  •  ‘Script.bin and uIimage fora OPI-PC_extract to  FAT Partition.zip ‘.

 

dmega

 

Para escribir el archivo de imagen en nuestra tarjeta SD necesitamos una herramienta. Para Windows  lo ideal es usar  Win32DiskImager que es una herramienta para escribir archivos img a su tarjeta sd.

Inicie Win32DiskImager, seleccione ‘Debian8_jacer_2.img’ y asegúrese de que el dispositivo correcto está seleccionado (en el ejemplo   la F 🙂 y  pulse Write para escribir la imagen en la tarjeta SD

Como orientación ,escribir el archivo imagen una tarjeta SD suele tardar unos 3 minutos, con una velocidad de escritura de unos 13 ~ 15 MB / s.

 

win32disk

Estamos casi listos para arrancar nuestro Orange Pi, pero primero extraer ‘uImage’ del archivo (2) a la tarjeta SD.

Vaya a su tarjeta SD y cambie el nombre de ‘script.bin.OPI-PC_1080p60_hdmi_cpu1.2G_gpio30pin’ a ‘script.bin’ (se utiliza la versión 1.2G   pues hay muchas  quejas sobre el sobrecalentamiento de Orange Pi y no es  necesario sobrecalentar  la CPU si no necesita tanto procesamiento)

Ya estamos listos para empezar: extraiga ordenadamente la sd del lector de su pc e insertarla en su Orange Pi.

Conecte un monitor con HDMI al Pi y un ratón / teclado USB básicos. También se puede conectar al Pi mediante SSH, aunque en ambos casos puede iniciar sesión con la combinación: orangepi / orangepi.

Ya puede conectar la alimentación , donde destacar , que en el caso de Orange Pi no sirve por el micro-usb sino que habrá que hacerlo por el conector especial de 5V DC  que lleva

No se deje engañar por el led rojo, pues todo el mundo sabe que el rojo es un color positivo? En el Orange Pi el led rojo significa que encontró una tarjeta SD con un cargador de arranque correcto. El diagnóstico en el Orange Pi no son muy buenos :, sólo tenemos  la esperanza de un led rojo encendido  pues es básicamente la única información que obtendrá.

Redimensionar la partición

Después del arranque, inicie sesión con el usuario orangepi e inicie una sesión de terminal. Recibirá un mensaje de advertencia sobre el tamaño de su partición. Si desea cambiar el tamaño de la partición al tamaño máximo disponible, puede ejecutar ‘sudo fs_resize‘.

Después de cambiar el tamaño debe reiniciar primero.

Redimensionamiento

Script de instalación de Scargill

Existe un impresionante script de instalación hecho por Peter Scargill que automatiza la instalación de nodo-RED, Mosquitto, Apache, SQL-Lite y algunas otras herramientas (se puede elegir lo que desea instalar). La instalación de todo puede tomar unos 50 minutos , probablemente un poco lento debido a la frecuencia máxima de la CPU de 1.2Ghz.

El scrips deshabilita la interfaz gráfica de usuario,asi que  si desea conservar la interfaz gráfica de usuario, puede cambiar el script de sudo systemctl set-default graphical.target ( línea de sudo systemctl set-default graphical.target 417 o ejecutar sudo systemctl set-default graphical.target y sudo systemctl set-default graphical.target .

Si desea acceder fácilmente a los datos de su Pi, puede cambiar la línea de script 187 para habilitar los recursos compartidos de red.

Con todo este sw instalado  la temperatura de la CPU suele ser de alrededor de 45 ° C, que es de unos 25 ° C por encima de la temperatura ambiente.

Resumen del software en ejecución

  • SSH deamon
  • Servidor FTP – ftp: // orangepi: contraseña @ orangepi
  • Apache – http: // orangepi
  • Phpliteadmin – http: // orangepi / phpliteadmin
  • Webmin (muy útil herramienta de administración del sistema) – http: // orangepi: 10000
  • Nodo-RED – http: // orangepi: 1880
  • Mosquitto MQTT corredor – http: // orangepi: 1883

 

Acceso web de Sensores Analogicos para Raspberry Pi (parte 2)


En un post anterior veíamos algunas de las posibilidades de  conexión de sensores digitales  a nuestra Raspberry Pi como puede ser añadir sensores I2C con el CI DS1820 , sensores de Co2 basados en el Mq4, sensores genéricos,sensores de de presión con el BMP180,sensores de temperatura basados en el TMP102, sensores de proximidad basados en el VCNL 4000o  o los sensores de luminosidad basados en el  TSL2561.

Como todos sabemos  existen también una cantidad muy alta de sensores cuya salida no es digital , lo cual en principio no se podrian conectar directamente a nuestra Raspberry, pero esto no es exactamente asi, porque si podemos conectarlos por medio de convertidores A/D y D/A  y otros circuitos como vamos a ver  (y empezamos a  ver en un post  posterior ).

Retomamos nuevamente el mundo analógico y la Raspberry Pi  con mas ejemplos :

 

MCP23017

MCP23017

 Este CI  de coste  contenido  permite agregar 16 salidas a una placa  conectándola al puerto I2C. La conexión es sencilla como vamos a  ver  a continuación

Use el siguiente diagrama para conectar el MCP23017 IO expansor.

Paso 1

Desde el  Pi para alimentar VDD (pin 9) en el MCP23017.
MCP23017

Paso 2

Conectar tierra  de Pi al VSS (pin 10) en el MCP23017.
MCP23017

Paso 3

Conectar los pines SCL del MCP23017 (pin 12) a la Pi.
MCP23017

Paso 4

Conecte las clavijas SDA de la MCP23017 (pin 13) a la Pi.
MCP23017

Paso 5

Conectar toma de tierra a los pines de dirección (pin 15, 16, 17) en el MCP23017. Esto le dará el expansor de una dirección predeterminada de 0 x 20.
MCP23017

Paso 6

Para el Reset (pin 18) en el MCP23017 . Debe conectar  el pin de Reset  para el funcionamiento normal.
MCP23017

Paso 7

¡Listo! Ahora puede Agregar el MCP23017 en el panel de Caynne, con dirección por defecto de 0 x 20.

MCP23009

MCP23009

 El MCP23009-E / SS es un expansor de E / S de 8 bits con salidas de drenaje abierto. Consiste en múltiples registros de configuración de 8 bits para la selección de entrada, salida y polaridad. El maestro del sistema puede habilitar E / S como entradas o salidas escribiendo los bits de configuración de E / S. Los datos de cada entrada o salida se guardan en el registro de entrada o salida correspondiente. La polaridad del registro del puerto de entrada puede invertirse con el registro de inversión de polaridad. Todos los registros pueden ser leídos por el maestro del sistema. El registro de captura de interrupción captura los valores de puerto en el momento de la interrupción, ahorrando así la condición que causó la interrupción. El restablecimiento de encendido (POR) ajusta los registros a sus valores predeterminados e inicializa la máquina de estado del dispositivo. El pin de dirección de hardware se utiliza para determinar la dirección del dispositivo.

Use el siguiente diagrama para conectar su MCP23009 IO expansor.

Paso 1

Desde el pastel de Pi para alimentar VDD (pin 1) en el MCP23009.
MCP23009

Paso 2

Conectar la tierra de la Pi a VSS (pin 18) en el MCP23009.
MCP23009

Paso 3

Conectar los pines SCL de la MCP23009 (pin 3) y la Pi.
MCP23009

Paso 4

Conecte las clavijas SDA de la MCP23009 (pin 4) y la  Pi.
MCP23009

Paso 5

Conectar toma de tierra al pin de dirección (pin 5) en el MCP23009. Esto le dará el expansor de una dirección predeterminada de 0 x 20.
MCP23009

Paso 6

Alimentar el reset (pin 6) en el MCP23009. Conectar  Reset es necesario para el funcionamiento normal.
MCP23009

Paso 7

¡Listo! Ahora puede Agregar el MCP23009 en el panel de cayenne, con dirección por defecto de 0 x 20.

MCP23008

MCP23008

Es un circuito muy similar al anterior que  nso proporciona 8 entradas  o salidas  binarias a traves del SDA

Use el siguiente diagrama para conectar su MCP23008 IO expansor.

Paso 1

Conecte las líneas de energía, conectando a VDD (pin 18) en el MCP23008.
MCP23008

Paso 2

Conecte las líneas de tierra, conexión de tierra al VSS (pin 9) en el MCP23008.
MCP23008

Paso 3

Conecte las clavijas SDA de la MCP23008 (pin 2) y la  Pi.
MCP23008

Paso 4

Conectar los pines SCL de la MCP23008 (pin 1) y la  Pi.
MCP23008

Paso 5

Conectar toma de tierra a los pines de dirección (pines 3, 4, 5) en el MCP23008. Esto le dará el expansor de una dirección predeterminada de 0 x 20.
MCP23008

Paso 6

Alimentar el reset (pin 6) en el MCP23008. Conectar el pin Reset es necesario para el funcionamiento normal.
MCP23008

Paso 7

¡Listo! Ahora puede Agregar el MCP23008 en el  panel de control de Cayenne, con dirección por defecto de 0 x 20.

DS2408

ds2408

 El DS2408 es un chip de E / S 1-Wire® programable de 8 canales. Las salidas PIO se configuran como drenaje abierto y proporcionan una resistencia de 100Ω máx. Un protocolo de comunicación de acceso de canal PIO robusto garantiza que los cambios de configuración de salida PIO se produzcan sin errores. Se puede utilizar una salida estroboscópica válida para datos para bloquear estados lógicos PIO en circuitería externa tal como un convertidor D / A (DAC) o un bus de datos de microcontrolador.

Un par de notas antes de comenzar:

  • Para aprovechar las ventajas de la detección automática de cayena de dispositivos 1-wire, conecte a 4 GPIO.
  • Asegúrese de que Raspberry Pi está apagado al conectar los cables.
  • Cuando utilice un cable de cinta GPIO, asegúrese de que está conectado el cable (es un color diferente que los otros) en la esquina de la Raspberry Pi y la parte superior de tu pastel de Pi.
  • El diagrama proporcionado es sólo un ejemplo de cómo conectar el sensor. Hay muchas maneras para conectar sensores y extensiones, así que trate de lo que funciona mejor para usted!
  • Algunos placas de prototipos (usados en los diagramas a continuación) tienen una  linea de alimentación  que se separa en el medio. Si este es el caso, asegúrese de que sus sensores están conectados en la misma mitad de la placa como el Pi.

Use el siguiente diagrama para conectar su DS2408 «1-Wire» IO expansor.

Paso 1

Desde el  Pi alimentar el DS2408 VCC (pin 3). Asegúrese de que añade  una resistencia de pull-up entre la potencia (pin 3) y pines de datos (pin 4) en el DS2408.
DS2408

Paso 2

Conectar la tierra del Pi a la tierra de DS2408 (pin 5).
DS2408

Paso 3

Conectar la clavija de control DS2408 en GPIO Pin 4 en el Pi. Conexión a 4 GPIO permite la detección automática .
DS2408

Paso 4

¡Listo! Encienda su frambuesa Pi y el agente Cayenne automáticamente detectará el expansor DS2408 y agregara este a su panel de control.

MCP23S09

MCP23S09

 El MCP23S09-E / P es un expansor de E / S de 8 bits con salidas de drenaje abierto. Consiste en múltiples registros de configuración de 8 bits para la selección de entrada, salida y polaridad. El maestro del sistema puede habilitar E / S como entradas o salidas escribiendo los bits de configuración de E / S. Los datos de cada entrada o salida se guardan en el registro de entrada o salida correspondiente. La polaridad del registro del puerto de entrada puede invertirse con el registro de inversión de polaridad. Todos los registros pueden ser leídos por el maestro del sistema. El registro de captura de interrupción captura los valores de puerto en el momento de la interrupción, ahorrando así la condición que causó la interrupción. El restablecimiento de encendido (POR) ajusta los registros a sus valores por defecto e inicializa la máquina de estado del dispositivo. El pin de dirección de hardware se utiliza para determinar la dirección del dispositivo.

Use el siguiente diagrama para conectar su Convertidor A/D de MCP23S09 con interfaz de SPI.

Paso 1

Alimentar desde el  Pi al MCP23S09 pin 1 (VDD) y pin 7 (RESET).
MCP23S09

Paso 2

Conectar la tierra del  Pi al MCP23S09 pin 18 (VSS).
MCP23S09

Paso 3

Conecte la clavija de entrada MCP23S09 chip select (CS) de 3 a uno de los pines del chip select del Pi  CE0 en este ejemplo.
MCP23S09

Paso 4

Conectar patillas SCLK del  Pi y el MCP23S09 4 (SCK).
MCP23S09

Paso 5

Conectar patillas MOSI del Pi y el MCP23S09 5 (SI).
MCP23S09

Paso 6

Conectar patillas MISO del Pi y el MCP23S09 6 (SO).
MCP23S09

Paso 7

¡Listo! Ahora puede Agregar el convertidor de MCP23S09 a tu panel de control usando el chip-select 0.

MCP23S08

MCP23S08

 El MCP23S08 es un «8-Bit I / O Expander con el interfaz de SPI» IC de Microchip . Este dispositivo también está disponible en variaciones I2C (MCP23008) y 16 bits (MCP23x17),

Use el siguiente diagrama para conectar su convertidor A/D de MCP23S08 con interfaz de SPI.

Paso 1

Alimentar desde el  Pi al MCP23S08 pin 18 (VDD) y la clavija 6 (RESET).
MCP23S08

Paso 2

Conectar la tierra del pastel de Pi al MCP23S08 pin 9 (VSS).
MCP23S08

Paso 3

Conectar patillas SCLK del Pi y el MCP23S08 pin 1 (SCK).
MCP23S08

Paso 4

Conectar patillas MOSI del  Pi y el MCP23S08 pin 2 (SI).
MCP23S08

Paso 5

Conectar patillas MISO del  Pi y el MCP23S08 pin 3 (SO).
MCP23S08

Paso 6

Conecte los dos de los pines de dirección de MCP23S08 (pines 4, 5) a tierra. Esto resultará en una dirección predeterminada de 0 x 20.
MCP23S08

Paso 7

Conecte la clavija de entrada MCP23S08 chip select (CS) pin 7 a uno de los pines del chip select Pi , CE0 en este ejemplo.
MCP23S08

Paso 8

¡Listo! Ahora puede Agregar el convertidor de MCP23S08 a su panel de control  de Cayenne usando el chip-select (pin  0).

MCP23S18

MCP23S18

Hablamos de un chip del fabricante MICROCHIP  que es un  Expansor de E/S de 16bit funcionando a  10 MHz con interfaz  SPI

Use el siguiente diagrama para conectar su Convertidor A/D de MCP23S18 con interfaz de SPI.

Paso 1

Alimentar de la Pi  a RESET (pin 16) y VDD (pin 11) en el MCP23S18.
MCP23S18

Paso 2

Conectar la tierra del  Pi a VSS (pin 1) en el MCP23S18.
MCP23S18

Paso 3

Conectar patillas SCLK del  Pi y el MCP23S18 13 (SCK).
MCP23S18

Paso 4

Conectar patillas MOSI del  Pi y el MCP23S18 14 (SI).
MCP23S18

Paso 5

Conecte la clavija de entrada MCP23S18 chip select (CS) del pin  12 a uno de los pines del chip select Pi Zapatero, CE(pin 0 )en este ejemplo.
MCP23S18

Paso 6

Conectar patillas MISO del  Pi y el MCP23S18 pin 15 (SO).
MCP23S18

Paso 7

¡Listo! Ahora puede Agregar el convertidor de MCP23S18 a tu panel de control de Cayenee usando el chip-select 0.

MCP23S17

MCP23S17

Hablamos de un chip del fabricante MICROCHIP  que es un  Expansor de E/S de 16bit funcionando a  10 MHz con interfaz  SPI

 El MCP23s08 y MCP23s17 tiene 3 bits de selección de direcciones por lo que en teoría se puede conectar hasta 8 MCP23s08 y MCP23S17 en la misma señal de selección SPI que le da una capacidad GPIO de una señal adicional de 128 pines por SPI seleccionar cuando se utilizan estos dispositivos. (O el doble que si utiliza 8 más en la 2 ª SPI seleccionar)

Use el siguiente diagrama para conectar su Convertidor A/D de MCP23S17 con interfaz de SPI.

Paso 1

Desde el  Pi alimentar VDD (pin 9) en el MCP23S17.
MCP23S17

Paso 2

Conectar la tierra del  Pi a VSS (pin 10) en el MCP23S17.
MCP23S17

Paso 3

Conecte la clavija de entrada MCP23S17 chip select (CS) del pin  11 a uno de los pines del chip select Pi Zapatero, CE0 en este ejemplo.
MCP23S17

Paso 4

Conectar patillas SCLK del  Pi y el pin 12 del MCP23S17  (SCK).
MCP23S17

Paso 5

Conectar patillas MOSI del  Pi y el  pin 13 del MCP23S17 (SI).
MCP23S17

Paso 6

Conectar patillas MISO del  Pi y el pin  14 del MCP23S17  (SO).
MCP23S17

Paso 7

Conectar toma de tierra a los pines de dirección de MCP23S17 (15, 16, 17). Esto le dará el expansor de una dirección predeterminada de 0 x 20.
MCP23S17

Paso 8

Alimentar al pin de RESET (pin 18) en el MCP23S17. Conectar  el pin de Reset es necesario para el funcionamiento normal.
MCP23S17

Paso 9

¡Listo! Ahora puede Agregar el convertidor de MCP23S17 a su panel de control usando el chip-select 0.

 

Por cierto , para  mas información sobre como configurar el panel de control de Cayenne  , puede encontrar mas información en ingles  aqui 

Alarma inteligente de Humos


Gracias al sw de Cayenne es posible construir equipos muy avanzados sin necesidad de programar nada con un aspecto gratamente muy profesional. Ademas, si sopesamos la gran potencia de calculo de la Raspberrry Pi, junto sus grandes posibilidades de expansión y conectividad ,obtenemos una gran combinación de hardware y software, las cual sin duda nos va a permitir realizar proyectos realmente interesantes .

Sabemos la gravedad que puede suponer un incendio, por lo que es sumamente importante disponer de medidas en los edificios de detección eficaces para protegerlos contra la acción del fuego.

 

En este post  vamos a intentar abordar el grave problema de los incendios desde una perspectiva completamente diferente usando para ello una Raspberry pi 2, un hardware especifico consistente en un DS18B20 , un detector de  gas y un buzzer  junto con  la plataforma  Cayenne.

Tradicionalmente los detectores de incendios difieren en función de los principio de activación siendo los mas habituales los de Tipo Óptico basado en células fotoeléctricas ,las cuales, al oscurecerse por el humo o iluminarse por reflexión de luz en las partículas del humo, disparando una sirena o alarma.Asimismo existen detectores de calor

La solución que se propone se basa en detectores ter micos al ser los mas precisos ,al que se ha añadido para aumentar la fiabilidad y mejorar la flexibilidad un doble sensor permitiendo de esta manera poder modificar los parámetros de disparo con un enorme facilidad como vamos a ver aparte de poder transmitir la información en múltiples formatos y formas hasta nunca vistas.

COMPONENTES NECESARIOS

Para montar la solución propuesta necesitamos los siguientes elementos:

Otros

  • Cable de red
  • Caja de plástico para contener el conjunto
  • Cable de cinta ( se puede reusar un cable de cinta procedente de un interfaz ide de disco)

La solución propuesta se basa en usar una Raspberry Pi y un pequeño hardware de control que conectaremos a los puertos de la GPIO,pero, antes de empezar con el hardware adicional, deberemos ,si aun no lo ha creado todavía , generar una imagen de Raspbian para proporcionar un sistema operativo a la Raspberry Pi.Raspbian trae pre-instalado software muy diverso para la educación, programación y uso general, contando además con Python, Scratch, Sonic Pi y Java

Para instalar Raspbian se puede instalar con NOOBS o descargando la imagen del SO desde la url oficial. y copiando a la SD con el Win32DiskImager desde la página del proyecto en SourceForge

Prueba de acceso y creacion de cuenta

 Prueba de acceso y creacion de cuenta

Creada la imagen del SO, ahora debemos insertar la micro-SD recién creada en su Raspberry Pi en el adaptador de micro-sd que tiene en un lateral . También deberá conectar un monitor por el conector hdmi, un teclado y ratón en los conectores USB, un cable ethernet al router y finalmente conectar la alimentación de 5V DC para comprobar que la Raspberry Pi arranca con la nueva imagen

Para comenzar la configuración de su Raspberry, lo primero es crear una cuenta gratuita en el portal cayenne-mydevices.com que servirá tanto para entrar en la consola web como para validarnos en la aplicación móvil. Para ello, vaya a la siguiente url http://www.cayenne-mydevices.com/ e introduzca lo siguintes datos:

  • Nombre,
  • Dirección de correo elctronica
  • Una clave de acceso que utilizara para validarse.

NOTA: las credenciales que escriba en este apartado le servirán tanto para acceder via web como por vía de la aplicación móvil

Instalación del agente

Una vez registrado , solamente tenemos que elegir la plataforma para avanzar en el asistente. Obviamente seleccionamos en nuestro caso Raspberry Pi pues no se distingue entre ninguna de las versiones ( ya que en todo caso en todas deben tener instalado Raspbian).

Para avanzar en el asistente deberemos tener instalado Raspbian en nuestra Raspberry Pi que instalamos en pasos anteriores .

Concluido el asistente , lo siguiente es instalar la aplicación móvil , que esta disponible tanto para IOS como Android. En caso de Android este es el enlace para su descarga en Google Play.

Es muy interesante destacar que desde la aplicación para el smartphone se puede automáticamente localizar e instalar el software myDevices Cayenne en su Raspberry Pi, para lo cual ambos ( smarphone y Raspberry Pi ) han de estar conectados a la misma red,por ejemplo la Raspberry Pi al router con un cable ethernet y su smartphone a la wifi de su hogar ( no funcionara si esta conectada por 3G o 4G) .

Una vez instalada la app , cuando hayamos introducido nuestras credenciales , si está la Raspberry en la misma red y no tiene instalado el agente, se instalara éste automáticamente .

Hay otra opción de instalar myDevices Cayenne en su Raspberry Pi, usando el Terminal en su Pi o bien por SSH.Tan sólo hay que ejecutar los dos siguientes comandos :

NOTA:la instalación del agente en su Raspberry Pi por comando, no es necesaria .Solo se cita aquí en caso de problemas en el despliegue automático desde la aplicacion movil.

Instalación del sensor temperatura

Instalación del sensor temperatura
582e053f937ddb777c000309.jpeg

Para poder hacer de nuestra Raspberry Pi un detector eficaz de incendios necesitamos añadir sensores que nos permitan medir variables físicas del exterior, para en consecuencia actuar posteriormente

En primer lugar se ha optado por utilizar el sensor DS18B20 creado por Dallas Semiconductor  . Se trata de un termómetro digital, con una precisión que varía según el modelo pero que en todo caso es un componente muy usado en muchos proyectos de registro de datos y control de temperatura.Existen tres modelos, el DS1820, el DS18S20 y el DS18B20 pero sus principales diferencias se observan en la exactitud de lectura, en la temperatura, y el tiempo de conversión que se le debe dar al sensor para que realice esta acción.El DS1820, tiene, además del número de serie y de la interfaz de un conductor, un circuito medidor de temperatura y dos registros que pueden emplearse como alarmas de máxima y de mínima temperatura.

CONEXIÓN DEL DS18B20

El DS18B20 envía  al bus I2C la información de la temperatura exterior en grados C con precisión 9-12 bits, -55C a 125C (+/- 0.5C).a.

Para aprovechar las ventajas de la detección automática de Cayenne de sensores 1-wire, conectaremos este al puerto 4 GPIO (PIN 7) dado que el DS1820 transmite vía protocolo serie 1-Wire

Asimismo es importante conectar una resistencia de 4k7 de pull-up en la línea de datos ( es decir entre los pines 2 y 3 del DS18B20) .

La alimentación del sensor la tomaremos desde cualquiera de las dos conexiones de +5V de nuestra Raspberry (pines 2 o 4 ) y la conexión de masa por comodidad podemos tomarla del pin 9 de las Raspberry

¡Listo! Encienda su Raspeberry Pi y Cayenne automáticamente detectará el sensor DS18B20 y añadirá este a su panel de control

NOTA : Es importante reseñar que los dispositivos 1-Wire se identifican mediante un número (ID) único, razón por la que podríamos conectar varios en cascada, viajando la señal de todos ellos por la misma línea de datos necesitando una única resistencia de pull up para todo el montaje conectándose todos ellos en paralelo (respetando los pines obviamente). El software se encargará de “interrogar” al sensor/dispositivo adecuado.

Instalación de sensor de Co2

Instalación de sensor de Co2m4 bis.jpgIMG_20161115_233915[1].jpg

Para complementar nuestro detector se ha añadido un detector de gases basado en el circuito MQ4 .Este detector se puede montar un circuito con el sensor , o bien se puede adquirir con el sensor y el modulo de disparo con un led ya soldado, lo cual por su bajo coste  (menos de 2€ en Amazon  )es la opción más recomendada. Estos módulos permiten Dual-modo de señal de salida, es decir cuentan con dos salidas diferenciadas:

  • Salida analógica
  • Salida con sensibilidad de nivel TTL (la salida es a nivel alto si se detecta GLP, el gas, el alcohol, el hidrógeno y mas)

Estos módulos son de rápida a respuesta y recuperación ,cuentan con una buena estabilidad y larga vida siendo ideales para la detección de fugas de gas en casa o fabrica .Son ademas muy versátiles , pudiendo usarse para múltiples fines ,detectando con facilidad lo siguientes gases:

  • Gas combustible como el GLP
  • Butano
  • Metano
  • Alcohol
  • Propano
  • Hidrogeno
  • Humo
  • etc.

Algunas de las características del módulo:

  • Voltaje de funcionamiento: 5V DC
  • Rango de Detección: 300 a 10000 ppm
  • Salida TTL señal valida es baja
  • Tamaño: 32X22X27mm

CONEXIONES

Para conectar el  detector de gases a nuestra Raspberry Pi, optaremos por usar el puerto GPIO18 ( pin12) que conectaremos a la salida digital 2 del sensor ( marcado como OUT).

La alimentación del sensor la tomaremos desde cualquiera de las dos conexiones de +5V de nuestra Raspberry (pines 2 o 4 ) conectándo al pin 4 del sensor (marcado como +5v) y la conexión de masa por comodidad podemos tomarla del pin 9 de las Raspberry conectando este al pin1 del detector ( marcado como GND)

Respecto a Cayenne deberemos configurarlo como una entrada genérica como vamos a ver mas adelante.

PRUEBA DEL SENSOR

Para hacer una prueba rápida de que nuestro sensor es funcional :simplemente apuntar a unos cm del sensor con un bote de desodorante (no importa la marca), justo con un sólo disparo hacia el cuerpo del sensor. En ese momento debería encenderse el pequeño led que integra el sensor durante unos minutos para luego apagarse marcando de esta forma que realmente ha detectado el gas .

Ademas simultáneamente si podemos medir con un polímetro, veremos que el pin Out pasa a nivel alto , es decir pasa de 0V a unos 5V , volviendo a cero en cuanto se haya diluido el gas

 

IMG_20161115_234101[1].jpg

Zumbador y montaje final

Ya tenemos los dos sensores, así que aunque podemos intereactuar ante variaciones de las lecturas de los sensores enviando correos o enviando SMS’s (como vamos a ver en el siguiente paso),es muy interesante añadir también un aviso auditivo que podemos activar cuando decidamos.

Para los avisos acústicos, lo mas sencillo es usar un simple zumbador de 5Vque podemos conectar directamente a nuestra Raspberry Pi sin ningún circuito auxiliar.

La conexión del positivo del zumbador normalmente de color rojo , lo haremos al GPIO 17 ( pin 11 ) de nuestra Raspberry y la conexión de masa por comodidad podemos tomarla del pin 9 de las Raspberry conectando este al pin de masa del buzzer ( de color negro)

 

IMG_20161115_233943[1].jpgIMG_20161117_215957[1].jpg

 

Respecto a Cayenne deberemos configurarlo como un actuador genérico como vamos a ver mas adelante en el siguiente paso.

En cuanto a las conexiones dado las poquísimas conexiones de los dos sensores y el zumbador, lo mas sencillo ,a mi juicio, es usar un cable de cinta de 20+20 , que por ejemplo puede obtener de un viejo cable IDE de los usados para conectar antiguos discos duros cortándolo en la longitud que interese y conectando los cables a los sensores y al zumbador (observe que es muy importante respetar el orden de los pines del cable siendo el rojo el pin 1 y cuenta correlativamente).

El siguiente resumen indica todas las conexiones realizadas:

CABLE DE CINTA –> UTILIZACIÓN

  • pin9 (Gnd) –> pin1 DS1820,pin1 MQ4,
  • pin 7 (GPIO4)–> pin 2 DS1820 , resistencia 4k7
  • pin1 (+5V) –>pin 3 DS1820, resistencia 4k7, pin4 MQ4,cable rojo buzzer
  • pin 12(GPIO18)–> pin2 MQ4
  • pin11(GPIO17) –> cable negro buzzer

Zumbador y montaje final

 

 

 

Configuración Cayenne

 Montado el circuito y nuestra Rasberry corriendo con Rasbian y el agente Cayenne ,únicamente nos queda configurar el sensor de gas y el buzzzer así como las condiciones o eventos que harán que disparen los avisos

Del sensor DS1820 no hablamos precisamente porque al estar conectado al bus one wire , el agente Cayenne lo detectara automáticamente presentándolo directamente sobre el escritorio sin necesidad de ningún acción más.

ds18.png

CONFIGURACION SENSOR GAS

Dado que no existe un sensor de estas características en la consola de Cayenne, lo mas sencillo es configurarlo como entrada genérico del tipo Digital Input y subtipo SigitalSensor.

Si ha seguido el circuito propuesto, los valores propuestos que debería configurar son los siguientes

  • Widget Name: Digital Input
  • Widget: Graph
  • Numero de decimals:0

En el apartado «Device Settings» pondremos:

  • Select GPIO: Integrated GPIO
  • Select Channel: Channel 18
  • Invert logic :check activado

Obviamente añadiremos estos valores y pulsaremos sobre el boton «save» para hacer efectiva esta configuración

Configuracion Cayenne

CONFIGURACION ZUMBADOR
Dado que no existe un zumbador como tal en la consola de cayenne, lo mas sencillo es configurarlo como salida genérico del tipo RelaySwitch . Si ha seguido el circuito propuesto, los valores propuestos que debería configurar son los siguientes

  • Widget Name: Buzzer
  • Choose Widget: Button
  • Choose Icon: Light
  • Number de decimals:0

En el apartado «Device Settings» pondremos:

  • Select GPIO: Integrated GPIO
  • Select Channel: Channel 17
  • Invert logic :check deactivado

Obviamente añadiremos estos valores y pulsaremos sobre el boton «save» para hacer efectiva esta configuración

reke.png

TRIGGERS
Si ha seguido todos los pasos anteriores tendremos en la consola de Cayenne nuestra placa Rasberry Pi con la información en tiempo real de la temperatura o detección de gas e incluso un botón que nos permite activar o desactivar a voluntad el zumbador .

Ademas por si fuera poco gracias a la aplicación móvil , también podemos ver en esta en tiempo real lo que están captando los sensores que hemos instalado y por supuesto activar o desactivar si lo deseamos el zumbador..

Pero aunque el resultado es espectacular todavía nos queda una característica para que el dispositivo sea inteligente : el pode interaccionar ante los eventos de una forma lógica,lo cual lo haremos a través de lo triggers , los cuales nos permitirán desencadenar acciones ante cambios en las variables medidas por los sensores.

A la hora de definir triggers en Cayenne podemos hacerlo tantodesencadenado acciones como pueden ser enviar corres de notificaciones o envio de SMS’s a los destinatarios acordados o bien actuar sobre las salidas.

Para definir un disparador en myTriggers,pulsaremos «New Trigger» y nos presentara dos partes:

  • IF ; aqui arrastraemos el desecadenante, lo cual necesariamene siempre sera la lectura de un sensor ( en uestro caso el termometro o el detector de gas)
  • THEN: aqui definiremos lo que queremos que se ejecute cuando se cumpla la condición del IF. Como comentábamos se pueden actuar por dos vías : se puede activar /desactivar nuestra actuador ( el buzzer) o también enviar correos o SMS’s

Como ejemplo se pueden definir lo siguientes triggers:

  • IF DS1820 <42º THEN RELE(channel17) =OFF
  • IF Channel18=ON THEN RELE(channel17) =ON
  • IF Channel18=ON THEN Send e-mail to…
  • IF DS2820>90º THEN Send e-mail to..
  • etc

Es obvio que las posibilidades son infinitas ( y las mejoras de este proyecto también), pero desde luego un circuito así es indudable la gran utilidad que puede tener.¿Se anima a replicarlo?

 

 

Más información aqui

A %d blogueros les gusta esto: