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.
Comments
Comentários