Control de nivel de agua con NodeMCU y Cayenne


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

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

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

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

Picture of Bill of Materials

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

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

Picture of Bill of Materials

3. Módulo de relé de CH

Picture of Bill of Materials

4. Válvula solenoide 12V

5. 12V 2A fuente de alimentación

6. Cables de puente

 

En cuanto al Software necesario:

1. Arduino IDE

2. Cayenne para iOS/Android/Web Browser

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

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

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

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

 

Las conexiones son muy sencillas:

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Configuración Cayenne Dashboard

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

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

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

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

 

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

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

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

Picture of Setting Up Cayenne

Picture of Setting Up Cayenne

 

 

Configuración de  triggers

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

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

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

Haga  este  proceso para las  dos casuisticas:

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

 

Fuente   instructables.com

error: pll_cal exceeds 2ms!!!


Programando con el ESP8266 , puede ser habitual que compile correctamente nuestra aplicación e incluso luego empiece a funcionar  transmitiendo datos  a  un servidor  distante  , para luego ,al reiniciar el ESp8266  ya no responda .

Si conectamos al salida del puerto serie  del IDE de Arduino   entonces veremos con asombro  el origen del problema : el  error pll_cal exceeds 2ms.

¿Como resolver el problema ?

Este problema se puede resolver reemplazando el archivo libphy.a  en el SDK que viene en  las bibliotecas de Arduino para ESP8266.
A partir de ahora, las bibliotecas Arduino ESP8266 vienen con SDK versión 1.5.3_16_04_18 y por  lo que sea en determinados ESP8266  da  problemas de la índole comentada.

La documentación de la versión del SDK 2.0.0_16_08_10 del sitio web de Espressif  lo explica mejor   y se   puede ver  aquí: http://bbs.espressif.com/viewtopic.php?f=46&t=2451.

Descargue todo el repositorio  que ocupa  unos 4.94MB del siguinte l link :   https://bbs.espressif.com/download/file.php?id=1690

Descomprima el fichero ESP8266_NONOS_SDK_V2.0.0_16_08_10.zip

Solo nos interesa el archivo libphy.a                                                                                                                                                                                                                                                                                                              

Reemplacé el archivo situado en C:\Users\xxxxxxxs\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lib\libphy.a (152kb) al nuevo descargado  .Por ejemplo si lo ha descargado en descargas estara en  C:\Users\xxxxxxs\Downloads\ESP8266_NONOS_SDK_V2.0.0_16_08_10\ESP8266_NONOS_SDK\lib\libphy.a (149kb)

Recompilé y cargué el código arduino nuevamente y el problema quedara resuelto!

 

Nota: Si el IDE Arduino vuelve a detectar librerías obsoletas para el ESP8266 ignórelo , pues  si se decide  actualizar justo esta  libreria  se expone a repetir el problema nuevamente

 

 

 

 

 

 

Como enviar y recibir mensajes entre su dispositivo y el concentrador de IoT de Azure


Una  vez que tenemos   un   dispositivo compatible con Azure Iot  (  como por ejemplo una Raspberry pi  3 como vimos   , o  desde un ESP8266   como vimos también recientemente  ) , los hemos  configurado  y   hemos  implementado una aplicación de ejemplo para ejecutar en el dispositivo que envié envíe datos que   los sensores recogen a su hub de IoT , puede  que  queramos intentar gestionar la mensajería en la nube del  dispositivo IoT  

Precisamente  en este contexto  surge  iothub-explorer que pone a  nuestra disposición  varios  comandos para  facilitar la gestión de centro de IoT  permitiéndonos   supervisar mensajes de dispositivo a nube y enviar mensajes de dispositivo de nube.

Los mensajes de dispositivo a nube podrían ser datos de sensores de  un dispositivo  que recolecta y envía a su hub de IoT (   como por ejemplo una Raspberry pi  3 como vimos  en este post , o  desde un ESP8266   como vimos recientemente  en este post )   o   bien los mensajes hacia ese  dispositivo de nube  que  podría ser comandos que IoT hub envía al dispositivo como por ejemplo hacer  parpadear un LED conectado a ese dispositivo.

Resumidamente  hay pues dos usos  muy diferentes del explorador de iothub :

  • Para supervisar mensajes de dispositivo a nube.
  • Para enviar mensajes de dispositivo de nube.

Para ello necesitamos haber completado dos fases:

  1. Haber  configurado el dispositivo , configuración completa que cubre los siguientes requisitos:
    • Haber registrado una cuenta de suscripción a Azure ( la gratuita nos sirve) .
    • Haber registrado un centro de Azure IoT ( una vez mas  también existe una modalidad gratuita para probar el  servicio).
    • Una aplicación de cliente que envíe mensajes a su hub de IoT de Azure.
  2. Haber instalado el  explorador de iothub. (Instalar explorer iothub)

Instalación de iothub-explorer

Iothub Explorer es pues una herramienta CLI para administrar las identidades de los dispositivos en su registro de IoT hub, enviar y recibir mensajes y archivos desde sus dispositivos, y monitorear sus operaciones de centros de IoT. Ademas iothub-explorer también permite simular un dispositivo conectado a su hub de IoT.

En post  anteriores  vimos  como con  una Raspberry pi  3 , o  desde un ESP8266    los   configurábamos   e  implementamos sendas aplicaciones para ejecutar en esos dispositivos procesos para enviar datos de telemetria  procedente de sus  sensores a un  hub de IoT en la nube de Azure Iot Edge

Bien, tenemos nuestra aplicación corriendo en el dispositivo de Iot , por lo que necesitamos ahora instalar el  explorador de iothub. Desgraciadamente no esta disponible para ambiente windows , es decir solo lo podemos ejecutar por el momento en equipos con Linux instalado. Ademas esta herramienta requiere la versión 4.x o superior de Node.js para que funcionen todas las características.

Para instalar la última versión de la herramienta iothub-explorer, ejecute el siguiente comando en su entorno de línea de comandos:

npm install -g iothub-explorer

En caso de querer instalar esta utilidad en una Raspberry pi  desde Raspbian, al no estar disponible el comando npm  instalarlo siguiendo estos pasos:

cd ~
git clone https://github.com/azure/iothub-explorer

gitclone

Manejo de iothub-explorer

Una vez isntalada esta utilidad ,puede usar el siguiente comando para obtener ayuda adicional sobre todos los comandos de ihotub-explorer:

$ iothub-explorer help
Usage: iothub-explorer [options] <command> [command-options] [command-args]


  Commands:

    login                           start a session on your IoT hub
    logout                          terminate the current session on your IoT hub
    list                            list the device identities currently in your IoT hub device registry
    create <device-id|device-json>  create a device identity in your IoT hub device registry
    delete <device-id>              delete a device identity from your IoT hub device registry
    get <device-id>                 get a device identity from your IoT hub device registry
    import-devices                  import device identities in bulk: local file -> Azure blob storage -> IoT hub
    export-devices                  export device identities in bulk: IoT hub -> Azure blob storage -> local file
    send <device-id> <message>      send a message to the device (cloud-to-device/C2D)
    monitor-feedback                monitor feedback sent by devices to acknowledge cloud-to-device (C2D) messages
    monitor-events [device-id]      listen to events coming from devices (or one in particular)
    monitor-uploads                 monitor the file upload notifications endpoint
    monitor-ops                     listen to the operations monitoring endpoint of your IoT hub instance
    sas-token <device-id>           generate a SAS Token for the given device
    simulate-device <device-id>     simulate a device with the specified id
    help [cmd]                      display help for [cmd]

  Options:

    -h, --help     output usage information
    -V, --version  output the version number

Cada comando iothub-explorer tiene su propia ayuda ,la cual  se puede ver pasanDdo el argumento -help (ayuda)  al nombre del comando:

$ iothub-explorer help create

  Usage: iothub-explorer create [options] [device-id|device-json]
  
  Create a device identity in your IoT hub device registry, either using the specified device id or JSON description.

  Options:

    -h, --help                       output usage information
    -a, --auto                       create a device with an auto-generated device id
    -cs, --connection-string         show the connection string for the newly created device
    -d, --display <property-filter>  comma-separated list of device properties that should be displayed
    -l, --login <connection-string>  connection string to use to authenticate with your IoT Hub instance
    -k1, --key1 <key>                specify the primary key for newly created device
    -k2, --key2 <key>                specify the secondary key for newly created device
    -r, --raw                        use this flag to return raw JSON instead of pretty-printed output
    -x, --x509                       generate an x509 certificate to authenticate the device
    -dv, --daysValid                 number of days the x509 certificate should be valid for
    -t1, --thumbprint1 <thumbprint>  specify the primary thumbprint of the x509 certificate
    -t2, --thumbprint2 <thumbprint>  specify the secondary thumbprint of the x509 certificate

 

Puede obtener mas  información en  https://github.com/azure/iothub-explorer

Monitor dispositivo a nube mensajes

Para supervisar los mensajes que se envían desde el dispositivo a su hub de IoT, siga estos pasos:

  1. Abra una ventana de consola.
  2. Ejecute el siguiente comando:iothub-explorer monitor-events <device-id> --login "<IoTHubConnectionString>"
  3. Obtener y de su hub de IoT. Asegúrese de que haya terminado el tutorial anterior. O puedes probar a utilizar si tienes, y.<device-id><IoTHubConnectionString>iothub-explorer monitor-events <device-id> --login "HostName=<my-hub>.azure-devices.net;SharedAccessKeyName=<my-policy>;SharedAccessKey=<my-policy-key>"HostNameSharedAccessKeyNameSharedAccessKey

Enviar mensajes de dispositivo de nube

Para enviar un mensaje desde su hub de IoT en el dispositivo, siga estos pasos:

  1. Abra una ventana de consola.
  2. Iniciar una sesión en su hub de IoT ejecutando el siguiente comando:
    Bash Copia
    iothub-explorer login `<IoTHubConnectionString>`
    
  3. Enviar un mensaje a su dispositivo ejecutando el siguiente comando:
    Bash Copia
    iothub-explorer send <device-id> <message>
    

El comando hace parpadear el LED que está conectado a su dispositivo y envía el mensaje al dispositivo.

Nota:No es necesario para el dispositivo envie un comando ack separado a su hub de IoT al recibir el mensaje.