Neste tutorial vamos explicar como conectar sensores que monitoram uma planta à Internet utilizando um conjunto eletrônico simples e a IDE Arduino. Com um módulo NodeMCU, encontrado no mercado, conectamos 3 sensores (de umidade de solo, de temperatura e de umidade) e conectamos o módulo a uma plataforma de nuvem. Para esse experimento foi escolhido o IBM Bluemix. A seguir está listado o que é necessário para a experiência.
O material utilizado para a oficina foi:
- 1 Node MCU
- 1 Cabo USB
- 1 Sensor Umidade de Solo
- 20 Unidades Cabos Jumper Macho – Macho
- 1 Sensor DHT11
- 1 Protoboard
- 1 planta (utilizamos um vaso pequeno com Margarida)
Foi utilizado o sistema operacional Windows 10 para a oficina. Nele foram instalados.
- Instalação da IDE Arduino
Entre neste link e faça o download da IDE Arduino. Utilize a opção Windows ZIP file for non admin install. Baixe o zip e descompacte na pasta c:
- Instalação do plugin para uso do NodeMCU
Abra a IDE do Arduino e instale o Plugin para NodeMCU. Para isso selecione File > Preferences e na opção Additional Boards Manager URLs coloque o seguinte endereço:
Confirme clicando em OK.
Selecione Board > Board Manager
Procure por NodeMCU e clique em Install.

E então selecione a placa utilizada nessa experiência. Procure por NodeMCU.

Antes de conectar o NodeMCU ao PC, é necessário instalar o driver USB para que o Windows 10 reconheça a placa como dispositivo válido. Existem dois NodeMCUs diferentes, cada um deles necessita de um driver diferente. A seguir estão apresentados dois drivers que podem ser utilizados, instale o que for utilizar no seu caso.
Para utilizar a biblioteca do sensor DHT, é necessário fazer o download da pasta lib no link a seguir:
e colocá-la na mesma pasta onde a IDE Arduino busca as bibliotecas. No meu caso, a pasta é a seguinte C:\Users\Thiago\Documents\Arduino\libraries.
É necessário instalar a lib PubSubClient na IDE do Arduino. Para isso clique em Sketch > Include Library > Manage Libraries.

Procure por PubSubClient e instale o plugin.

Para utilizar o IBM Bluemix, é necessário criar uma conta grátis antes da experiência, utilizando o browser em um PC conectado à internet.
Configurar o dispositivo IoT no IBM BLUEMIX
Vamos criar um dispositivo IoT desde o início utilizando o IBM Bluemix.
Acesse
e faça uma conta grátis.
Este é o Dashboard de entrada do Bluemix:

Clique em Explore our Offerings.
Digite internet of things na barra de busca.
Clique em Internet of Things Platform Starter.

Crie um nome único no campo App name. Eu chamei de esalqApp.
Clique em Create para criar o aplicativo.

Aguarde. Esse comando pode demorar um pouco.
Veja que a mensagem starting fica aparecendo…

E então, após um tempo, muda o status pra Running.

A partir de agora, o app está no ar e funcionando. Volte pro Dashboard clicando na esquerda acima.

Clique no serviço de internet of things criado pra sua aplicação. No meu caso o nome do serviço é esalqApp-iotf-service. Clique nele.

Clique em Launch para entrar no serviço IoT.

O seguinte painel vai abrir.

Clique em devices, no desenho do chip, do lado esquerdo da tela.

Clique em Add Device. Você vai criar um novo dispositivo.


Clique em Create a device type.

Clique em Create Device Type. Eu chamei o meu dispositivo de Device1.

Não coloque nada no campo descrição. Clique em Next.

Clique em Next.

Clique em Next.

Clique em Create.

Clique em Next. Em Device ID, eu nomeei meu dispositivo como D1.

Cliquei em Next.

Clique em Next.

Clique em Next.

Clique em Add.

Copie esses dados. Vamos precisar deles para configurar o nosso software.
O tipo de dispositivo criado chama Device1, e o seu ID chama-se D1.
Organization ID n554fo
Device Type Device1
Device ID D1
Authentication Method token
Authentication Token k9&x1&C?VM)gpXhITg

Feche essa janela. O dispositivo está criado.
No painel de Devices, é possível verificar que o dispositivo foi criado e está disponível para uso.

Do lado esquerdo, clique em apps.

Clique em Generate Api Keys.

Anote esses dados:
- API Key a-n554fo-lluxr4ht88
- Authentication Token Cti!qZ-!a5_HHgU?ZO
Clique em generate, para gerar uma nova API. Vamos nos conectar utilizando ela.

Firmware do NodeMCU
Baixe o arquivo da oficina OficinaMakerIoTEsalqShow.ino e modifique os campos que estão marcados como XXXXX. É necessário modificar o firmware para incluir as informações que acabamos de gerar no IBM Bluemix:
Os dados que conseguimos foram os seguintes:
Organization ID n554fo
Device Type Device1
Device ID D1
Authentication Method token
Authentication Token k9&x1&C?VM)gpXhITg
API Key a-n554fo-lluxr4ht88
Authentication Token Cti!qZ-!a5_HHgU?ZO
Então modificamos o firmware abaixo dessa forma:
//__ Informações do dispositivo
#define DEVICE_TYPE “Device1”
#define DEVICE_ID “D1”
//__ Informações da conexão com o servidor
#define ORG “n554fo”
#define TOKEN “Cti!qZ-!a5_HHgU?ZO”
//__ Variáveis de conexão com o servidor (Não customizaveis)
char server[] = ORG “.messaging.internetofthings.ibmcloud.com”;
char topic[] = “iot-2/type/Device1/id/D1/evt/1-anl/fmt/json”;
char authMeth[] = “a-n554fo-lluxr4ht88”;
char token[] = TOKEN;
char clientId[] = “a:” ORG “:” DEVICE_ID;
O firmware utilizado está a seguir:
/*********************************************************************
Oficina de Maker de IoT na EsalqShow
Envia os dados dos sensores para o IBM Watson
Desenvolvido por:
Fábio Souza
Thiago Lima
Com base no exemplo feito pelo Daniel Junho:
Conectando o ESP8266 no Bluemix IoT
E com dicas de Jorge Guzman e Sergio Gama
*********************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN 2 // PINO ONDE ESTÁ CONECTADO O DHT11( SENSOR DE TEMPERATURA E UMIDADE)
#define DHTTYPE DHT11 // ESTAMOS USANDO O DHT11(EXISTEM OUTROS TIPOS DE DHT)
DHT dht(DHTPIN, DHTTYPE); // INSTANCIA O SENSOR DHT11
//__ Informações do WIFI
const char* ssid = "BAITA-FIBRA";
const char* password = "BaitaMelhorAceleradora";
//__variáveis auxiliares
float umidadeSolo = 0;
float umidadeAR = 0;
float temperatura = 0;
//__strings para envio dos dados no JSON
String Str1 = "umidadeSolo";
String Str2 = "temperatura";
String Str3 = "umidadeAR";
//**************************************
//__ Configurações para o IBM Watson
//**************************************
//__ Informações do dispositivo
#define DEVICE_TYPE "Device1"
#define DEVICE_ID "D1"
//__ Informações da conexão com o servidor
#define ORG "n554fo"
#define TOKEN "Cti!qZ-!a5_HHgU?ZO"
//__ Variáveis de conexão com o servidor (Não customizaveis)
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char topic[] = "iot-2/type/Device1/id/D1/evt/1-anl/fmt/json";
char authMeth[] = "a-n554fo-lluxr4ht88";
char token[] = TOKEN;
char clientId[] = "a:" ORG ":" DEVICE_ID;
//__ Inicia WiFi
WiFiClient wifiClient;
PubSubClient client(server, 1883, NULL, wifiClient);
//__ Função de setup do arduino
void setup() {
//__ Inicializa a serial
Serial.begin(115200);
Serial.println();
Serial.print("Conectando-se na rede ");
Serial.print(ssid);
//__ Conecta-se na rede WIFI
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Conectado, endereço de IP: ");
Serial.println(WiFi.localIP());
//inicia DHT
dht.begin();
}
//__ Envia os dados para a cloud
// JSON:
// {"d":{"umidadeSolo":2,"temperatura":2,"umidadeAr":2}}
void enviaDado(float dado1,float dado2, float dado3){
String payload = "{\"d\":{\"" + Str1 + "\":";
payload += dado1;
payload += ", \"" + Str2 + "\":";
payload += dado2;
payload += ", \"" + Str3 + "\":";
payload += dado3;
payload += "}}";
Serial.print("Sending payload: ");
Serial.println(payload);
//__ Envia o dado
if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
} else {
Serial.println("Publish failed");
}
}
//__ Função principal
void loop() {
//__ Verifica se está conectada a cloud para envio dos dados
if (!!!client.connected()) {
//__ Caso não esteja conectada, tenta a conexão
Serial.print("Reconectando-se em ");
Serial.println(server);
while (!!!client.connect(clientId, authMeth, token)) {
Serial.print(".");
delay(500);
}
Serial.println();
}
//__ Le Sensores
umidadeSolo = LeUmidadeSolo();
umidadeAR = LeUmidadeAr();
temperatura = LeTemperatura();
//__ Envia um dado para a cloud
enviaDado(umidadeSolo,temperatura,umidadeAR);
//__ Faz o envio a cada 10 segundos.
delay(10000);
}
//__Funçã que faz a leitura do nível de umidade
float LeUmidadeSolo(void)
{
int ValorADC;
float Umidade;
ValorADC = analogRead(0);
Umidade = -0.0977*ValorADC + 100.0;
return Umidade;
}
float LeTemperatura(){
float temperatura = dht.readTemperature();
if (isnan(temperatura))
{
Serial.println("Falha na leitura do dht11...");
}
else
{
return temperatura;
}
}
float LeUmidadeAr(){
float umidade = dht.readHumidity();
// Se a umidade não for valor válido, acusará falha de leitura.
if (isnan(umidade))
{
Serial.println("Falha na leitura do dht11...");
}
else
{
return umidade;
}
}
Montagem do Hardware e programação
Monte o circuito na protoboard conforme a figura a seguir. Utilize o pino D4 para o dispositivo DHT11, pino 3 (dispositivo azul) e o pino A0 para o sensor de umidade de solo, pino 1. Ligue a alimentação de ambos os sensores, GND e 3V, nos sinais do NodeMCU. Entre os pinos 3 e 4 do sensor DHT11, coloque um resistor de 10k.

A seguir está uma foto de como fica o hardware montado.

Conecte o dispositivo na USB do PC. Verifique se o PC reconheceu o dispositivo. Clique em Tools > Port e verifique se a placa aparece em alguma COM, como, por exemplo, COM5. Compile e Programe utilizando a opção Sketch > Upload. O dispositivo vai ser programado, vai iniciar, se conectar à Internet e depois à IBM e vai começar a enviar dados pra lá.
Verificando se os dados chegaram na nuvem
Pra ver se estão chegando as informações na IBM, acesse
https://console.bluemix.net/catalog/ e vá até o Dashboard.

Clique no serviço – IoT Service.


Clique em launch:

Clique em devices. Escolha um device e clique:

Selecione o dispositivo, role a barra e veja as mensagens chegando.

Trabalhando com Node Red e lendo os dados dos dispositivos
Volte para o Console e abra o app. No meu caso, abriu uma nova janela em:


Clique em Next.
Clique em Not Recommended e em Tick this box e clique em Next.
Clique em finish.


Clique em Go to your Node-Red flow editor.

A seguinte tela vai abrir. Clique em IBM IoT App In:

Em API Key, clique no lápis ao lado do nome.

Utilizei os seguintes parâmetros:
Name Device1
API Key a-n554fo-lluxr4ht88
Authentication Token Cti!qZ-!a5_HHgU?ZO
Clique em Add.

Clique em done. Clique em Deploy no lado direito acima.

A compilação é um sucesso! Clique em debug no lado superior direito da tela. Conecte o dispositivo à internet.

Os dados vão chegar como na imagem anterior.
Se clicar no lado direito na mensagem que está chegando, é possível visualizar todos os dados.

Apague tudo e deixe apenas os seguintes blocos:

Na busca, na esquerda acima, digite change.

Arraste três balõezinhos desse pro meio do diagrama.

Refaça as conexões da seguinte maneira:

Clique no primeiro balãozinho laranja e preencha.

Faça o mesmo para o segundo.

Faça o mesmo pro terceiro.

O diagrama então fica assim:

Clique em deploy.
Três dados vão chegar e já estão filtrados.
Umidade do Solo, Temperatura e Umidade do Ar.

Instalando a Interface de usuário para visualizar os dados
Vamos instalar um plugin de interface com o usuário.

Clique em install.

Procure por node-red-contrib-ui. Clique em install.

Clique em install. Procure por node-red-contrib-aggregator e selecione install para instalar.

Clique em close. Do lado esquerdo é possível encontrar agora as funções para interface de usuário.

Programação dos paineis para visualizações dos sensores
Vamos usar o Gauge
Arraste 3 balõezinhos de Gauge para o node-red

Conecte os três aos três sensores.

Clique no primeiro Gauge. Ao lado de Tab, em Add new ui_tab…, clique no lápis. Coloque o nome Home e clique em Add.

Preenchi o primeiro dessa forma:

Clique em Done. Cliquei duas vezes no segundo Gauge e preenchi da seguinte forma.

Cliquei em Done. Cliquei duas vezes no terceiro Gauge e preenchi da seguinte forma.

Cliquei em Done. Copiei a URL que estava no topo do browser e modifiquei o final para ui
e abra em uma nova aba do navegador. Veja a imagem que deve aparecer no browser.

Agradecimentos
Fizemos essa oficina a pedido da Secretaria de Agricultura do Estado de São Paulo. Fabio Souza e Thiago Lima representaram o Embarcados neste evento. Mais de 50 pessoas realizaram a oficina nos dias 10 e 11 de outubro durante a EsalqShow. Essa foi uma ação para promover o próximo evento chamado Agrifutura, que vai ser realizado no fim do mês de novembro de 2017 em São Paulo.
Gostaríamos de agradecer a Daniel Junho e Jorge Guzman que indiretamente ajudaram na construção do experimento, por conta de sua participação nas noites de Computação Cognitiva do LHC, Laboratório Hacker de Campinas.
Gostaríamos de agradecer ao IBM Thinklab pela distribuição dos vouchers para a realização da oficina.
Gostaríamos de agradecer também à Secretaria que viabilizou a realização desse evento.








qual versão da IDE do Arduíno que você utilizou?
Excelente artigo! Quem já mexeu com este mix de tecnologias sabe das dificuldades da chegada. Isto é para poucos. Parabéns!
Parabéns!!! Show!!! Muito bem detalhado e de grande valia.