Neste trabalho faz-se a análise dos dados dos sensores de temperatura e humidade DHT11 e do sensor de pressão atmosférica BMP180. A visualização destes dados é feita através do serviço Thingspeak, no qual observamos a evolução ao longo do tempo da temperatura, humidade e pressão atmosférica. Os dados são comunicados para este serviço através do Nodemcu, que contém o módulo ESP8266, responsável pelas comunicações via WiFi, sendo este conectado a uma rede local. O ThinkSpeak é uma plataforma de IoT Open Source, que dispõe de uma API que permite que dados sejam enviados e posteriormente mostrados em forma de gráficos. É possível ainda a visualização dos dados com um LCD de 16×2.
Montagem do Circuito
Para a montagem deste circuito utiliza-se as saídas D6 do NodeMcu para comunicação com o sensor DHT11, correspondendo esta saída à GPIO12 do ESP8266. Para o Sensor BMP180 utiliza-se as saídas D3 e D4 do NodeMcu, que correspondem às GPIO0 e GPIO2 do ESP8266, respetivamente, estas por sua vez são ligadas aos pinos SCL e SDA, respetivamente do sensor. Para o LCD utiliza-se as saídas D1 e D2 do NodeMCU, que correspondem às GPIO5 e GPIO4 do ESP8266, respetivamente, estas por sua vez são ligadas aos pinos SCL e SDA, respetivamente do sensor, para o pino VCC utilizou-se 5V, ou seja, o Vin do NodeMCU.
Entre o pino de dados e o de VCC do sensor DHT11 é colocado uma resistência de 10kΩ, para proteger o circuito.
Programação com IDE do Arduino
Para a programção do NodeMcu, utiliza-se a IDE do Arduino e fazem-se a seguintes configurações:
Passo 1 – Entrar em Ficheiro > Prefências e digitar o link seguinte na URLs adicionais de Gerenciadores de Placas: http://arduino.esp8266.com/stable/package_esp8266com_index.json

Passo 2 – Entrar em Ferramentas > Placa > Gestor de Placas e clicar em instalar o esp8266 by ESP8266 Community.

Passo 3 – Entrar em Ficheiro > Preferências e selecionar o NodeMCU 1.0(ESP-12E Module)
Depois de efetuadas estas configurações seleciona-se a Porta onde será feito o upload do programa. O programa utilizado é o seguinte:
#include <Adafruit_BMP085.h> //Biblioteca com as funções do BMP180
#include <Wire.h> // Como BMP180 e o LCD utiliza o protocolo I2C é necessária esta biblioteca para a configuração dos pinos SDA e SCL do sensor
#include <ESP8266WiFi.h>
#include "DHT.h"// biblioteca com funções para o sensor DHT11
#include <LiquidCrystal_I2C.h> //Biblioteca com funções para o lcd
//INICIALIZAÇÕES
LiquidCrystal_I2C lcd(0x27, 16, 2);// Inicialização do LCD, sendo o utilizado um 16x2
const char* ssid = "AndroidAP"; // Nome da Rede
const char* password = "kingkong"; // Password da rede
const char* host = "api.thingspeak.com";
const char* THINGSPEAK_API_KEY = "L4ESA1UD5SC00AZL"; //Write API KEY
// Configurações sensor DHT11
#define DHTPIN D6 // Utilização da GPIO12 do ESP8266 e D6 do NodeMCU
#define DHTTYPE DHT11 // DHT 11
Adafruit_BMP085 bmp; // Inicialização sensor BMP180
//Atualização à taxa de 1 minuto, o Thingspeak necessita no minimo 20segundo
const int UPDATE_INTERVAL_SECONDS = 60;
//Inicialização das funções
// Inicialização do sensor de temperature e humidade
DHT dht(DHTPIN, DHTTYPE);
byte tmp[8] = { //função para desenhar o simbolo da temperatura no lcd
0b00100,
0b01010,
0b01010,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110,
};
// Inicialização do sensor de temperature e humidade
DHT dht(DHTPIN, DHTTYPE);
byte tmp[8] = { //função para desenhar o simbolo da temperatura no lcd
0b00100,
0b01010,
0b01010,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110,
};
byte hum[8] = {//função para desenhar o simbolo da humidade no lcd
0b00100,
0b00100,
0b01010,
0b01010,
0b10001,
0b10001,
0b10001,
0b01110,
};
void setup() {
Serial.begin(115200);
delay(10);
// Comunicação com a rede WiFi
Serial.println();
Serial.println();
Serial.print("Connecting to "); //Mensagem apresentada no monitor série
Serial.println(ssid); // Apresenta o nome da rede no monitor série
WiFi.begin(ssid, password); // Inicia a ligação a rede
while (WiFi.status() != WL_CONNECTED) {// Enquanto a ligação não for efectuada com sucesso é apresentado no monitor série uma sucessão de "."
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected"); // Se a ligação é efectuada com sucesso apresenta esta mensagem no monitor série
Serial.println("Endereço IP: ");
Serial.println(WiFi.localIP()); // Apresentação do Endereço IP no monitor série
}
void loop() {
Wire.begin(2, 0); // Configuração dos pinos para o sensor BMP180. GPIO2 para SDA(pino para a transferência de dados) que corresponde ao D4, GPIO0 para SCL(pino para temporização) que corresponde ao D3
Wire.setClock(400000); //Temporização entre dispositivos
if (!bmp.begin()) {
Serial.println("O sensor BMP180 não foi encontrado!");
while (1) {} //enquanto o sensor não for encontrado executa este ciclo
}
Serial.print("connecting to ");
Serial.println(host);//Apresenta no monitor série o nome da rede à qual é efectuada a ligação
// Uso WiFiClient para criar comunicações TCP
WiFiClient client;
const int httpPort = 80; //Uso Porto80
if (!client.connect(host, httpPort)) {
Serial.println("Falha Comunicação");//Verifica o estado da ligação
return;
}
// Leitura dos dados do sensor
int humidity = dht.readHumidity();// Leitura Humidade
float temperature = dht.readTemperature(); //Leitura Temperatura
int pressure = bmp.readPressure(); // Leitura Pressão Atmosférica em Pa
Wire.begin(4, 5);// Configuração dos pinos para o LCD. GPIO4 para SDA(pino para a transferência de dados) que corresponde ao D2, GPIO5 para SCL(pino para temporização) que corresponde ao D1
lcd.init(); // Inicialização do LCD
lcd.createChar(0, tmp);// Cria o simbolo da temperatura
lcd.createChar(1, hum);// Cria o simbolo da humidade
lcd.backlight(); // Activar a luz de fundo
lcd.setCursor(0, 0); // Posição no LCD para a temperatura, neste casso é na linha de cima, alinhado à esquerda
lcd.write(byte(0));// Desenha no LCD o simbolo da temperatura
lcd.print(" ");
lcd.print(temperature); // Imprime no LCD a temperatura
lcd.print((char)223);// Imprime no LCD "º"
lcd.print("C");
lcd.setCursor(11, 0);
lcd.write(byte(1));// Desenha no LCD o seimbolo da humidade
lcd.print(" ");
lcd.print(humidity); // Imprime no LCD a humidade
lcd.print("%");
lcd.setCursor(0, 1);// Posição no LCD para a pressão, neste casso é na linha de baixo, alinhado à esquerda
lcd.print("Pressao:");
lcd.print(pressure); // Imprime no LCD a pressão
à esquerda
lcd.write(byte(0));// Desenha no LCD o simbolo da temperatura
lcd.print(" ");
lcd.print(temperature); // Imprime no LCD a temperatura
lcd.print((char)223);// Imprime no LCD "º"
lcd.print("C");
lcd.setCursor(11, 0);
lcd.write(byte(1));// Desenha no LCD o seimbolo da humidade
lcd.print(" ");
lcd.print(humidity); // Imprime no LCD a humidade
lcd.print("%");
lcd.setCursor(0, 1);// Posição no LCD para a pressão, neste casso é na linha de baixo, alinhado à esquerda
lcd.print("Pressao:");
lcd.print(pressure); // Imprime no LCD a pressão
lcd.print("Pa");
// Criar URL para o pedido
String url = "/update?api_key=";
url += THINGSPEAK_API_KEY;
url += "&field1="; //Colocar os dados de temperatura no gráfico 1 do Thingspeak
url += String(temperature);
url += "&field2="; //Colocar os dados de humidade no gráfico 2 do Thingspeak
url += String(humidity);
url += "&field3="; //Colocar os dados de pressão no gráfico 3 do Thingspeak
url += String(pressure);
Serial.print("Pedido URL: ");
Serial.println(url);
// Envio de solicitação ao servidor
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(10);
while(!client.available()){//Verificação se o cliente está conectado
delay(100);
Serial.print(".");
}
// Leitura das respostas do servidor e envio para o monitor série
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("Comunicação fechada"); //Depois do cliente efectuar o pedido apresenta esta mensagem no monitor série
delay(1000 * UPDATE_INTERVAL_SECONDS); //Como os valores da função delay são em ms, multiplica-se por 1000 para que a multiplicação com 60 seja igual a 60 segundos e portanto 1 minuto
}
No código acima altera-se o valor SSID para o nome da Rede ao qual o ESP8266 vai comunicar, a password pela palavra-passe dessa rede, o THINGSPEAK_API_KEY pela write API Key obtida pelo canal criado no ThingSpeak. Antes de fazer-se a compilação do programa devem-se incluir as
Serial.println();
Serial.println("Comunicação fechada"); //Depois do cliente efectuar o pedido apresenta esta mensagem no monitor série
delay(1000 * UPDATE_INTERVAL_SECONDS); //Como os valores da função delay são em ms, multiplica-se por 1000 para que a multiplicação com 60 seja igual a 60 segundos e portanto 1 minuto
}
No código acima altera-se o valor SSID para o nome da Rede ao qual o ESP8266 vai comunicar, a password pela palavra-passe dessa rede, o THINGSPEAK_API_KEY pela write API Key obtida pelo canal criado no ThingSpeak. Antes de fazer-se a compilação do programa devem-se incluir as bibliotecas Adafruit_BMP085.h, a Wire.h, a DHT.h e a ESP8266WiFi.h, responsáveis pela execução de algumas das funções chamadas ao longo do código.
No serviço Thingspeak cria-se um novo canal, este deve conter três gráficos, um para a temperatura, um para humidade e um para a pressão atmosférica, como demonstra a figura seguinte:
Após estas configurações faz-se o upload do código e observa-se o seguinte no canal do Thingspeak:
Com os gráficos acima observa-se a evolução ao longo do tempo da temperatura e da humidade através do sensor DHT11, e da pressão atmosférica através do sensor BMP180.
Artigo desenvolvido por Nuno Rocha para o Arduino Portugal
————-
Gostaram deste artigo ? Deixem o vosso comentário no formulário a baixo e partilhem com os amigos.
Não se esqueçam de fazer like na nossa página no facebook.
Todos os produtos utilizados neste artigo podem ser encontrados na loja de componentes eletrónicos ElectroFun.





