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.