Monitoramento ao vivo de temperatura e umidade pela Internet usando Arduino e ThingSpeak

Tempo de leitura: 6 minutes

Umidade e temperatura são parâmetros muito comuns para medição em muitos lugares como fazendas, casas de vegetação, médicos, indústrias, residências e escritórios. Já cobrimos a medição de umidade e temperatura usando Arduino e exibimos os dados no LCD.

Neste projeto de IoT, vamos monitorar a umidade e temperatura na Internet usando o ThingSpeak, onde mostraremos os dados atuais de umidade e temperatura na Internet usando o servidor ThingSpeak. É realizado pela comunicação de dados entre Arduino, Módulo Sensor DHT11, módulo WIFI ESP8266 e LCD. O termômetro em escala Celsius e o medidor de umidade em escala percentual exibem a temperatura ambiente e a umidade por meio de um display LCD e também os envia ao servidor ThingSpeak para monitoramento ao vivo de qualquer lugar do mundo.

Configuração do Working e do ThingSpeak:

Este projeto baseado em IoT tem quatro seções, em primeiro lugar o sensor de umidade e temperatura DHT11 detecta os dados de umidade e temperatura. Em segundo lugar, o Arduino Uno extrai os dados do sensor DHT11 como um número adequado em porcentagem e escala Celsius e os envia para o Módulo Wi-Fi. Em terceiro lugar, o módulo Wi-Fi ESP8266 envia os dados para o servidor do ThingSpeak. E, finalmente, o ThingSpeak analisa os dados e os mostra em forma de gráfico. O LCD opcional também é usado para exibir a temperatura e a umidade.

ThingSpeak fornece uma ferramenta muito boa para projetos baseados em IoT para Arduino. Ao usar o site ThingSpeak, podemos monitorar nossos dados pela Internet de qualquer lugar, e também podemos controlar nosso sistema pela Internet, usando os canais e páginas da web fornecidos pela ThingSpeak. ThingSpeak “coleta” os dados dos sensores, “analisa e visualiza” os dados e “atua” desencadeando uma reação. Aqui estamos explicando sobre como enviar dados para o servidor ThingSpeak usando o módulo WIFI ESP8266:

1. Em primeiro lugar, o usuário precisa criar uma conta em ThingSpeak.com, em seguida, entrar e clicar em Get Started.

2. Agora vá para o menu ‘Channels’ e clique na opção New Channel na mesma página para prosseguir com o processo.

3. Agora você verá um formulário para a criação do canal, preencha o Nome e a Descrição de acordo com sua escolha. Em seguida, preencha ‘Umidade’ ou ‘Humidity’ e ‘Temperatura’ ou ‘Temperature’ nos rótulos do Campo 1 e Campo 2, marque as caixas de seleção para ambos os campos. Além disso, marque a caixa de seleção da opção ‘Make Public’ abaixo no formulário e, por fim, Salvar o canal. Agora seu novo canal foi criado.

4. Agora clique na guia ‘API keys’ e salve as chaves de API Write e Read, aqui estamos usando apenas a chave Write. Você precisa copiar esta chave em char*api_key no código.

5. Depois disso, clique em ‘Data Import/Export’ e copie o URL de solicitação GET do feed do canal de atualização, que é:

https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0

6. Agora o usuário precisa abrir “api.thingspeak.com” usando a função httpGet com o postUrl como “update?Api_key=SIWOYBX26OXQ1WMS&field1=0” e então enviar dados usando feed de dados ou endereço de solicitação de atualização.

Antes de enviar os dados, o usuário precisa editar esta string de consulta ou postUrl com os campos de dados de temperatura e umidade, conforme mostrado abaixo. Aqui, adicionamos os dois parâmetros na string que precisamos enviar por meio de uma solicitação GET ao servidor, depois disso, usamos httpGet para enviar os dados ao servidor. Verifique o código completo abaixo.

​sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
httpGet("api.thingspeak.com", postUrl, 80);​

Todo o processo é demonstrado na seção de Vídeos, ao final deste Artigo.

O trabalho neste projeto é baseado na comunicação serial de fio único para buscar dados do DHT11. Primeiro, o Arduino envia um sinal de início para o módulo DHT e, em seguida, o DHT dá um sinal de resposta contendo os dados. O Arduino coleta e extrai os dados em duas partes, primeiro a umidade e a segunda, a temperatura, e depois os envia para o LCD 16×2 e o servidor ThingSpeak. ThingSpeak exibe os dados na forma de gráfico como abaixo:

 

Descrição do circuito:

As conexões para este projeto de monitoramento de umidade e temperatura ThingSpeak são muito simples. Aqui, uma tela de cristal líquido é usada para exibir a temperatura e a umidade, que está diretamente conectada ao Arduino no modo de 4 bits. Os pinos do LCD, a saber, RS, EN, D4, D5, D6 e D7, são conectados ao pino digital número 14, 15, 16, 17, 18 e 19. do Arduino. Este LCD é opcional.

O Módulo Sensor DHT11 é conectado ao pino digital 12 do Arduino. Os pinos Vcc e GND do módulo Wi-Fi ESP8266 são conectados diretamente a 3,3V e GND do Arduino e o CH_PD também está conectado a 3,3V. Os pinos Tx e Rx do ESP8266 são conectados diretamente aos pinos 2 e 3 do Arduino. A biblioteca serial do software também é usada aqui para permitir a comunicação serial nos pinos 2 e 3 do Arduino.

 

Parte de programação:

A parte de programação deste projeto desempenha um papel muito importante para realizar todas as operações. Em primeiro lugar, incluímos as bibliotecas necessárias e inicializamos as variáveis.

#include"dht.h"      // Including library for dht
#include<LiquidCrystal.h>
#include<Timer.h>
#include <SoftwareSerial.h>

LiquidCrystal lcd(14,15,16,17,18,19);
Timer t;
SoftwareSerial Serial1(2, 3);

Depois disso, insira sua chave Write API e pegue algumas strings.

char *api_key="SIWOYBX26OXQ1WMS";    // Insira sua chave de API de gravação do ThingSpeak
static char postUrl[150];
int humi,tem;
void httpGet(String ip, String path, int port=80);

Na função void loop(), lemos a temperatura e a umidade e mostramos essas leituras no LCD.

A função void send2server() é usada para enviar os dados ao servidor. A função Send2server é uma rotina de serviço de interrupção do cronômetro, chamando a cada 20 segundos. Quando chamamos a função de atualização, a rotina de serviço de interrupção do cronômetro é chamada.

void send2server()
{
  char tempStr[8];
  char humidStr[8];
  dtostrf(tem, 5, 3, tempStr);
  dtostrf(humi, 5, 3, humidStr);
  sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
  httpGet("api.thingspeak.com", postUrl, 80);
}

 

Código

#include"dht.h"                      // Incluindo biblioteca para dht
#include<LiquidCrystal.h>
#include<Timer.h>
#include <SoftwareSerial.h>
LiquidCrystal lcd(14,15,16,17,18,19);
Timer t;
SoftwareSerial Serial1(2, 3);

#define dht_dpin 12 
#define heart 13
dht DHT;

char *api_key="SIWOYBX26OXQ1WMS";    // Insira sua chave de API de gravação do ThingSpeak
static char postUrl[150];
int humi,tem;
void httpGet(String ip, String path, int port=80);

void setup()
{
 lcd.begin(16, 2);
 lcd.clear();
 lcd.print("   Umidade   ");
 lcd.setCursor(0,1);
 lcd.print("  Medição ");
 delay(2000);
 lcd.clear();
 lcd.print("CapSistema");
 lcd.setCursor(0,1);
 lcd.print("Bem Vindo");
 delay(2000);
 Serial1.begin(9600);
 Serial.begin(9600);
 lcd.clear();
 lcd.print("WIFI Connecting");
 lcd.setCursor(0,1);
 lcd.print("Please wait....");
 Serial.println("Connecting Wifi....");
 connect_wifi("AT",1000);
 connect_wifi("AT+CWMODE=1",1000);
 connect_wifi("AT+CWQAP",1000);  
 connect_wifi("AT+RST",5000);
 connect_wifi("AT+CWJAP=\"1st floor\",\"muda1884\"",10000);
 Serial.println("Wifi Connected"); 
 lcd.clear();
 lcd.print("WIFI Connected.");
 pinMode(heart, OUTPUT);
 delay(2000);
 t.oscillate(heart, 1000, LOW);
 t.every(20000, send2server);
}

void loop()
{
  DHT.read11(dht_dpin);
  lcd.setCursor(0,0);
  lcd.print("Humidity: ");
  humi=DHT.humidity;
  lcd.print(humi);   // imprimindo umidade no LCD
  lcd.print(" %    ");
  lcd.setCursor(0,1);
  lcd.print("Temperature:");
  tem=DHT.temperature;
  lcd.print(tem);   // Temperatura de impressão no LCD
  lcd.write(1);
  lcd.print("C   ");
  delay(1000);
  t.update();
}

void send2server()
{
  char tempStr[8];
  char humidStr[8];
  dtostrf(tem, 5, 3, tempStr);
  dtostrf(humi, 5, 3, humidStr);
  sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
  httpGet("api.thingspeak.com", postUrl, 80);
}

//GET https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0

void httpGet(String ip, String path, int port)
{
  int resp;
  String atHttpGetCmd = "GET /"+path+" HTTP/1.0\r\n\r\n";
  //AT+CIPSTART="TCP","192.168.20.200",80
  String atTcpPortConnectCmd = "AT+CIPSTART=\"TCP\",\""+ip+"\","+port+"";
  connect_wifi(atTcpPortConnectCmd,1000);
  int len = atHttpGetCmd.length();
  String atSendCmd = "AT+CIPSEND=";
  atSendCmd+=len;
  connect_wifi(atSendCmd,1000);
  connect_wifi(atHttpGetCmd,1000);
}

void connect_wifi(String cmd, int t)
{
  int temp=0,i=0;
  while(1)
  {
    lcd.clear();
    lcd.print(cmd);
    Serial.println(cmd);
    Serial1.println(cmd); 
    while(Serial1.available())
    {
      if(Serial1.find("OK")) i=8;
    }
    delay(t);
    if(i>5) break;
    i++;
  }

  if(i==8)
  {
    Serial.println("OK");
    lcd.setCursor(0,1);
    lcd.print("OK");
  } else {
    Serial.println("Error");
    lcd.setCursor(0,1);
    lcd.print("Error");
  }
}