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.
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
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.
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
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
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
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.
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).
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.
// 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.
Establezca la variable tmp102Address para que coincida con ADD0. ADD0 conectado a GND corresponde a una dirección de 0x48.
Establezca la variable del token para que coincida con el token de Arduino desde el Tablero.
Compile y cargue este boceto.
Una vez que el Arduino se conecta al Tablero, debe actualizar automáticamente el widget TMP102 con datos.
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.
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.
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
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
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
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:
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:
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.
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");
}
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:
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.
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.
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.
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.
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.
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.
Modelo
Sustancias detectadas
Calentador
MQ-2
Metano, butano, GLP, humo
5V
MQ-3
Alcohol, Etanol, humo
5V
MQ-303A
Alcohol, etanol, humo
0.9V
MQ-4
Metano, gas natural comprimido (GNP)
5V
MQ-5
Gas natural, GLP
5V
MQ-6
Butano, GLP
5V
MQ-306A
Butano, GLP
0.9V
MQ-7
Monóxido de carbono
Alternado 5V y 1.4V
MQ-307A
Monóxido de carbono
Alternado 0.2 y 0.9V
MQ-8
Hidrógeno
5V
MQ-9
Monóxido de carbono, gases inflamables
Alternado 5V y 1.5V
MQ-309A
Monóxido de carbono, gases inflamables
Alternado 0.2 y 0.9V
MQ-131
Ozono
6V
MQ-135
Benceno, alcohol, humo, calidad del aire
5V
MQ-136
Ácido sulfhídrico
5V
MQ-137
Amoniaco
5V
MQ-138
Benceno, tolueno, alcohol, acetona,
5V
propano, formaldehído, hidrógeno
MQ-214
Metano, gas natural
5V
MQ-216
Gas natural, gas carbón
6V
MG-811
Dióxido de carbono
6V
AQ-104
Calidad del aire *
AQ-2
Gases inflamables, humo
AQ-3
Alcohol, Benceno
AQ-7
Monó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:
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)
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:
GPIO36 (pin14): conexión A0 al MQT2
VCC ( pin1) : conexión VCC del MQT2
GND(pin2): conexión GND del MQT2
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
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
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.
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.
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.
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
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:
Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
Seleccionar un trigger desde el cuadro de abajo.
El nombre de su trigger, voy a llamar a la mía “demasiado caliente”.
Ahora arrastrar y soltar su Node MCU desde la esquina izquierda en el caso de la caja.
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)
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.
Ahora haga clic en “Save trigger”.
Ahora se debe guardar y le enviará una alerta cada vez que el sensor de temperatura es más de 40 grados Celsius.
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.
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.
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.
Ahora arrastrar el Node MCU en cuadro a continuación. Seleccione nuestra salida digital y marque la casilla de verificación activada.
Ahora haga clic en Save trigger.
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.
//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
// 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
# 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
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
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.
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.
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
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:
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
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
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
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:
Ir a añadir en la esquina superior izquierda del tablero de instrumentos.
Seleccionar un trigger desde el cuadro de abajo.
Nombrar el trigger con un texto identificativo
Ahora arrastrar y soltar su ESP12E desde la esquina izquierda en el caso de la caja.
Por debajo de esto seleccionar el sensor
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.
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
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:
Tensión
Intensidad
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.
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
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
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:
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
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.
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:
Orange Pi PC
5V / 2A con el barril del CC Jack o el cable grueso del USB (utilicé 5V / 1,5A de mi teléfono viejo)
Tarjeta SD – Clase 10!
Teclado y ratón
Cable HDMI
Cable ethernet de LAN
Lector de tarjetas
Software necesario:
Descargar Armbian – Jessie,versión servidor para el Orange Pi PC Aquí
Upzip, formato e instalación de Armbian a la 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:
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 sí » 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í
Techovator0819 deseaba crear un reloj de alarma con temporizadores personalizados combinados con una estación meteorológica , así como por supuesto mostrar la hora y fecha.
EL prototipo trabaja con nodeMCU utilizando un sensor de temperatura DHT11 para medir la temperatura de la habitación y ademáas obtienen información de internet sobre el tiempo para que puedan tener una buena comparación entre ambos.
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:
nodeMCU (regulador Micro, versión 0.9)
Pantalla LCD – 16 x 2
Botones – 3
Sensor de temperatura DHT11
Timbre o zumbador
Placa de prototipos tamaño mini
Cables de puente
Resistencia de 1000 Ω – 3
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.
Creo que tenemos que empezar con los botones. Usé un palito de helado estrecho para hacer una base para los botones.
Luego tomar el nodeMCU y las placa de prototipos y pegarloo a la base de la caja con cinta de doble cara.
Entonces conectar los botones a los pines de I/O digitales apropiados.
En tercer lugar, colocar la pantalla LCD y luego agarrarla bien a la caja con algunas cintas desde el interior. .
Hacer las conexiones de la pantalla LCD.
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
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.
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?
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.
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.
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.
Biblioteca en tiempo de. Para mantener a nuestro tiempo. Las funciones de biblioteca se enumeran aquí.
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
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»);
// 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
Como hemos visto en este blog el autor h aoptado por el frameworl Cayyene de MyDevices para salvar la informacion procedente del sensor DHT11
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,
Inicio modo: para obtener los datos meteorológicos y visualizarlos. Así como percibir el entorno.
Modo set timer – establecer temporizadores para usted
Modo de programar la alarma – establecer alarmas para que usted
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
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:
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 ‘.
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.
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.
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 desudo systemctl set-default graphical.target417 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.
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
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.
Paso 2
Conectar tierra de Pi al VSS (pin 10) en el MCP23017.
Paso 3
Conectar los pines SCL del MCP23017 (pin 12) a la Pi.
Paso 4
Conecte las clavijas SDA de la MCP23017 (pin 13) a la Pi.
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.
Paso 6
Para el Reset (pin 18) en el MCP23017 . Debe conectar el pin de Reset para el funcionamiento normal.
Paso 7
¡Listo! Ahora puede Agregar el MCP23017 en el panel de Caynne, con dirección por defecto de 0 x 20.
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.
Paso 2
Conectar la tierra de la Pi a VSS (pin 18) en el MCP23009.
Paso 3
Conectar los pines SCL de la MCP23009 (pin 3) y la Pi.
Paso 4
Conecte las clavijas SDA de la MCP23009 (pin 4) y la Pi.
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.
Paso 6
Alimentar el reset (pin 6) en el MCP23009. Conectar Reset es necesario para el funcionamiento normal.
Paso 7
¡Listo! Ahora puede Agregar el MCP23009 en el panel de cayenne, con dirección por defecto de 0 x 20.
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.
Paso 2
Conecte las líneas de tierra, conexión de tierra al VSS (pin 9) en el MCP23008.
Paso 3
Conecte las clavijas SDA de la MCP23008 (pin 2) y la Pi.
Paso 4
Conectar los pines SCL de la MCP23008 (pin 1) y la Pi.
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.
Paso 6
Alimentar el reset (pin 6) en el MCP23008. Conectar el pin Reset es necesario para el funcionamiento normal.
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
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.
Paso 2
Conectar la tierra del Pi a la tierra de DS2408 (pin 5).
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 .
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
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).
Paso 2
Conectar la tierra del Pi al MCP23S09 pin 18 (VSS).
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.
Paso 4
Conectar patillas SCLK del Pi y el MCP23S09 4 (SCK).
Paso 5
Conectar patillas MOSI del Pi y el MCP23S09 5 (SI).
Paso 6
Conectar patillas MISO del Pi y el MCP23S09 6 (SO).
Paso 7
¡Listo! Ahora puede Agregar el convertidor de MCP23S09 a tu panel de control usando el chip-select 0.
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).
Paso 2
Conectar la tierra del pastel de Pi al MCP23S08 pin 9 (VSS).
Paso 3
Conectar patillas SCLK del Pi y el MCP23S08 pin 1 (SCK).
Paso 4
Conectar patillas MOSI del Pi y el MCP23S08 pin 2 (SI).
Paso 5
Conectar patillas MISO del Pi y el MCP23S08 pin 3 (SO).
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.
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.
Paso 8
¡Listo! Ahora puede Agregar el convertidor de MCP23S08 a su panel de control de Cayenne usando el chip-select (pin 0).
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.
Paso 2
Conectar la tierra del Pi a VSS (pin 1) en el MCP23S18.
Paso 3
Conectar patillas SCLK del Pi y el MCP23S18 13 (SCK).
Paso 4
Conectar patillas MOSI del Pi y el MCP23S18 14 (SI).
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.
Paso 6
Conectar patillas MISO del Pi y el MCP23S18 pin 15 (SO).
Paso 7
¡Listo! Ahora puede Agregar el convertidor de MCP23S18 a tu panel de control de Cayenee usando el chip-select 0.
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.
Paso 2
Conectar la tierra del Pi a VSS (pin 10) en el 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.
Paso 4
Conectar patillas SCLK del Pi y el pin 12 del MCP23S17 (SCK).
Paso 5
Conectar patillas MOSI del Pi y el pin 13 del MCP23S17 (SI).
Paso 6
Conectar patillas MISO del Pi y el pin 14 del MCP23S17 (SO).
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.
Paso 8
Alimentar al pin de RESET (pin 18) en el MCP23S17. Conectar el pin de Reset es necesario para el funcionamiento normal.
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
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:
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
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
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
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
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)
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:
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.
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 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
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?
Debe estar conectado para enviar un comentario.