Node-RED: Recibiendo datos y controlando cosas.

Holi,.

hoy vamos a controlar ledes, desde nuestra plataforma NodeRed asi como enviar informacion de sensores para poder mostrarla en nuestro dashboard, por cierto un saludo a mi querido amigo Jose Mario, fundador de la comunidad Arduino Chiquimula que dice que deberia de dedicarme a dar mas tutoriales y no a contar mi vida personal, pues bueno este blog es mio jaja, asi que bueno que te diré Jose Mario siempre podes leer otra cosa xD.

 

Requerimientos:

NodeMCU
Libreria PubSubClient
Arduino IDE
Una computadora con Node-RED instalado
muchas ganas de aprender

Node-RED

Lo primero que vamos a hacer es crear varios flujos y un dashboard para poder mostrar los datos que mandemos desde nuestro NodeMCU:

Aqui el codigo para importarlo:

[{"id":"67e54d52.b4f634","type":"ui_gauge","z":"446dad17.4f9cb4","name":"","group":"b18000a4.85d5c","order":0,"width":0,"height":0,"gtype":"wave","title":"Humedad","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":424.9409942626953,"y":247.45834350585938,"wires":[]},{"id":"3bcce651.ca346a","type":"ui_chart","z":"446dad17.4f9cb4","name":"","group":"b18000a4.85d5c","order":0,"width":0,"height":0,"label":"Temperatura","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"x":435.93753719329834,"y":287.66322326660156,"wires":[[],[]]},{"id":"3ec6ed73.b16f92","type":"mqtt in","z":"446dad17.4f9cb4","name":"","topic":"/humedad","qos":"2","broker":"a90b13cb.1595c","x":186.93751525878906,"y":245.70486450195312,"wires":[["67e54d52.b4f634"]]},{"id":"16a54a79.7c8d66","type":"mqtt in","z":"446dad17.4f9cb4","name":"","topic":"/temperatura","qos":"2","broker":"a90b13cb.1595c","x":193.95140075683594,"y":286.6944580078125,"wires":[["3bcce651.ca346a"]]},{"id":"f688eed3.8a309","type":"mqtt out","z":"446dad17.4f9cb4","name":"","topic":"/led1","qos":"","retain":"","broker":"a90b13cb.1595c","x":404.9409942626953,"y":105.56597900390625,"wires":[]},{"id":"99e3af91.d673f","type":"mqtt out","z":"446dad17.4f9cb4","name":"","topic":"/led2","qos":"","retain":"","broker":"a90b13cb.1595c","x":406.89581298828125,"y":152.88888549804688,"wires":[]},{"id":"a050e0b5.910b7","type":"mqtt out","z":"446dad17.4f9cb4","name":"","topic":"/led3","qos":"","retain":"","broker":"a90b13cb.1595c","x":411.89581298828125,"y":198.88888549804688,"wires":[]},{"id":"ad75f425.a0d788","type":"ui_switch","z":"446dad17.4f9cb4","name":"","label":"Switch led 1","group":"d835c868.19b298","order":0,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"1","onvalueType":"num","onicon":"fa-sun-o","oncolor":"white","offvalue":"0","offvalueType":"num","officon":"fa-moon-o","offcolor":"white","x":201.89584350585938,"y":104.88888740539551,"wires":[["f688eed3.8a309"]]},{"id":"2feaae68.52f6c2","type":"ui_switch","z":"446dad17.4f9cb4","name":"","label":"Switch led 2","group":"d835c868.19b298","order":0,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"1","onvalueType":"num","onicon":"fa-sun-o","oncolor":"white","offvalue":"0","offvalueType":"num","officon":"fa-moon-o","offcolor":"white","x":206.8958282470703,"y":157.88888549804688,"wires":[["99e3af91.d673f"]]},{"id":"6a9c44de.3deb8c","type":"ui_switch","z":"446dad17.4f9cb4","name":"","label":"Switch led 3","group":"d835c868.19b298","order":0,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"1","onvalueType":"num","onicon":"fa-sun-o","oncolor":"white","offvalue":"0","offvalueType":"num","officon":"fa-moon-o","offcolor":"white","x":206.8958282470703,"y":203.88888549804688,"wires":[["a050e0b5.910b7"]]},{"id":"b18000a4.85d5c","type":"ui_group","z":"","name":"Sensores","tab":"42cdb6aa.8ff2e8","order":1,"disp":true,"width":"6"},{"id":"a90b13cb.1595c","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"d835c868.19b298","type":"ui_group","z":"","name":"Control","tab":"42cdb6aa.8ff2e8","order":2,"disp":true,"width":"6"},{"id":"42cdb6aa.8ff2e8","type":"ui_tab","z":"","name":"tutorial","icon":"dashboard","order":1}]

Código Arduino

Es hora de programar nuestro pequeño NodeMCU (este no es un arduino asi que por favor dejen de llamarlo de esa manera), el NodeMCU esta basado en el SoC esp8266 creado por ESPRESSIF y bueno distribuido por un montón de casas productoras de chips, necesitamos instalar un par de cosas asi que les dejo un tutorial pasado para que lo hagan en este caso hay que llegar hasta la parte de la instalación de PUBSUB y la de las placas, se los dejo acá

El codigo es el siguiente.

/*
 Tutorial recibiendo datos y controlando cosas
 Este programa recibe datos por medio de
 mqtt enciende ledes y envia datos
 de sensores a un servidor en la nube
 Requerimientos
 PubSubClient libreria
 NodeMCU
 3 Ledes




Yeffri J. Salazar
 Themicrofcontrol.wordpress.com

*/
/************************************
 ** Librerias **
 ***********************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
/************************************
 ** constantes **
 ***********************************/
#define led1 D7
#define led2 D6
#define led3 D5
#define puertoMqtt 1883
/***********************************
 ** objetos y variables **
 ***********************************/
WiFiClient clienteWifi;//este cliente se encarga de la comunicacion con el wifi
PubSubClient clienteMQTT(clienteWifi);//este utiliza el cliente anterior para hacer poder crear la conexion mqtt
//si pasan por el hackerspace Xibalba pues ya tienen la clave
const char * ssid = "Hackerspace";
const char * claveWifi = "IOT12345";
const char * brokerMqtt = "";// ip del broker sin http ni nada solo los numeros
uint32_t ultimoIntentoReconexion;
uint32_t timerEnvioDatos;
void conectarAlWifi() {

WiFi.begin(ssid, claveWifi);
 Serial.print("conectando a");
 Serial.println(ssid);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }

Serial.println("");
 Serial.println("Wifi Conectado ");
 Serial.println("direccion IP: ");
 Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* mensaje, unsigned int length) {
 String topico = topic;
 /* String mensaje;
 for(uint8_t i; i <length;i++){
 mensaje+=char(payload[i]);
 }*/
 Serial.print("Mensaje Recibido del topico: ");
 Serial.println(topico);
 Serial.print("mensaje : ");
 Serial.println((char)mensaje[0]);
 if (topico == "/led1") {
 digitalWrite(led1, mensaje[0]);
 }
 else if (topico == "/led2") {
 digitalWrite(led2, mensaje[0]);
 }
 else if (topico == "/led3") {
 digitalWrite(led3, mensaje[0]);
 }
 else {
 Serial.println("error de mensaje");
 }

}

boolean reconexion() {
 Serial.print("Conectando al broker mqtt");
 //intentando conectar al broker
 if (clienteMQTT.connect("ESP8266Client")) {
 Serial.println("Conectado");
 //publicamos que estamos conectados
 clienteMQTT.publish("/conexion", "Conectado");
 //nos suscribimos a los topicos para controlar los ledes
 clienteMQTT.subscribe("/led1");
 clienteMQTT.subscribe("/led2");
 clienteMQTT.subscribe("/led3");
 } else {
 Serial.print("falló, rc=");
 Serial.print(clienteMQTT.state());
 }
 return clienteMQTT.connected();
}

void setup() {
 Serial.begin(115200);
 Serial.println("iniciando programa Holi mami");
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 conectarAlWifi();
 clienteMQTT.setServer(brokerMqtt, puertoMqtt); //le decimos cual es el servidor y el puerto al que se debe conectar
 clienteMQTT.setCallback(callback);//le decimos como se llama la funcion de callback
}

void loop() {
 if (!clienteMQTT.connected()) {
 if (millis() - ultimoIntentoReconexion > 5000) {
 ultimoIntentoReconexion = millis();
 // Attempt to reconnect
 if (reconexion()) {
 ultimoIntentoReconexion = 0;
 }
 }
 } else {
 //cliente conectado 
 if (millis() - timerEnvioDatos > 5000) {
 timerEnvioDatos=millis();
 //a falta de sensores enviamos valores aleatorios
 char msg[4];
 snprintf (msg, 3, "%ld", random(35));
 clienteMQTT.publish("/temperatura", msg);

snprintf (msg, 4, "%ld", random(100));
 clienteMQTT.publish("/humedad", msg);
 }
 clienteMQTT.loop();

}
}

Dejo una pequeña variacion para el ESP32 y funcionara de la misma manera. Aqui github.

Saludos a especiales a Kenia que estuvo acompañando en la realizacion de este tutorial, tiene un don especial para hacerme enojar pero esta bien xD

Eso ha sido todo por el dia de hoy. Todo esto es hecho con el afan de que aprendan cosas nuevas el internet de las cosas es un ambito muy nuevo y aun podemos meternos a la ola dentro de 5 años veremos los frutos de este hermoso tutorial.

Recuerden:
Solo necesitan una excusa para cambiar el mundo ❤

PD: habia puesto un delay V: pero lo quite para no parecer noob xD jaja
mentira los delay son buenos cuando no tenemos algo muy critico que hacer

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: