Com o conceito da Internet das Coisas (ou IoT) se expandindo, se tornou mais fácil conectar diferentes tipos de hardware com software especializados na obtenção de dados do ambiente ou controle de sistemas. Enquanto não existe ainda uma universalização de modos de conexão IoT, temos que estudar caso a caso e, por meio de testes, concluir qual o melhor método para se alcançar as especificações do projeto.
Neste artigo farei um projeto simples para conectar um sensor de temperatura e umidade (DHT11) na plataforma online DeviceHub para gerar gráficos com os dados deste sensor. Para este projeto, considerei placas de desenvolvimento compatíveis com Arduino, e portanto utilizarei o software Arduino IDE. Mais especificamente, utilizarei a placa NodeMCU v3 (no Arduino IDE será utilizado a placa NodeMCU v1.0, mas não haverá problemas visíveis de compatibilidade), que utiliza de um módulo ESP8266 para conexão Wifi.
Preparando o Arduino IDE
Primeiramente, precisamos preparar o Arduino IDE para se comunicar com a placa NodeMCU. Para isso, siga os seguintes passos:
1 – Vá em Tools -> Board: -> Boards Manager…
2 – Vá na barra de procura e digite “esp8266”. Vai aparecer apenas uma opção, da “ESP8266 Community”. Clique nesta opção, escolha a versão mais recente (estou utilizando a versão 2.3.0), e instale. Assim que terminar, as novas placas estarão disponíveis.
3 – Vá em Tools -> Board: -> “NodeMCU 1.0 (ESP-12E Module)”. Não mude nenhuma configuração vinda com esta placa.
Depois disso, devemos adicionar à IDE as bibliotecas que serão utilizadas neste projeto.
4 – Vá em Sketch -> Include Library -> Manage Libraries…
5 – Vá na barra de procura e procure e faça download das seguintes bibliotecas:
- “ESP8266WiFi” (Versão 1.0.0 ou acima) de “Ivan Grokhotkov”;
- “PubSubClient” (Versão 2.6.0 ou acima) de “Nick O’Leary”;
- “DHT sensor library” (Versão 1.3.0 ou acima) de “Adafruit”;
- “Adafruit Unified Sensor” (Versão 1.0.2 ou acima) de “Adafruit”.
Criando um usuário e projeto no DeviceHub
1 – Crie uma conta em aqui.
2 – Clique em Projects -> Add new project e dê um nome, imagem e descrição ao seu projeto. Pode escrever o que quiser, já que estes dados não serão utilizados no código.
3 – Clique em Add Device.
Coloque os seguintes parâmetros:
- Name: DHT11 teste (ou outro nome, se quiser, pois não afetará o uso);
- Development Board: Arduino;
- Programming Language: C++;
- Connection Type: Wifi.
Outros espaços como “image” e “description” não precisam ser preenchidos.
4 – Clique em Add Sensor.
Coloque os seguinte parâmetros:
- Name: T;
- (x) Analog;
- Measurement Unit: *C.
5 – Crie outro sensor com os seguintes parâmetros:
- Name: U;
- (x) Analog;
- Measurement Unit: %.
6 – Após essas configurações, você achará abaixo das características do dispositivo e projeto um botão chamado “Development Information”. Clicando nele, pode se achar todos os dados que serão utilizados no código deste projeto.
Montando o circuito
O circuito que será utilizado pode ser visto na figura 5:
Os fios vermelho e preto representam as ligações do sensor DHT11 ao 3.3V e GND do NodeMCU, respectivamente. O fio amarelo fará a comunicação serial do tipo Single-Wire Two-Way, ao qual passaremos solicitações de dados e os dados em si. O resistor pull-up no fio amarelo é de 4.7 kOhms. O fio verde já possui a função de reiniciar a placa NodeMCU após o colocarmos em deepSleep, para reduzir consumo de energia nos momentos em que não há transmissão de dados para a plataforma.
Código
O código utilizado pode ser visto abaixo. As partes em negrito devem ser preenchidas com dados do usuário, sendo este a rede Wifi que será utilizada e os dados do Development Information visto do DeviceHub.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
/* Leitura de sensor DHT11 e transmissão via Wifi para a plataforma DeviceHub por protocolo MQTT. Para NodeMCU v3. criado 11 Fev 2017 por Victor Hugo Gadioli */ #include <ESP8266WiFi.h> #include <PubSubClient.h> #include "DHT.h" #include "DHT_U.h" #include <Adafruit_Sensor.h> #define DHTPIN 2 // pino que o sensor está conectado (D4) #define DHTTYPE DHT11 // Tipo sensor: DHT 11 #define API_KEY "API KEY DO SEU PROJETO" #define PROJECT_ID "PROJECT ID DO SEU PROJETO" #define DEVICE_UUID "DEVICE UUID DO SEU PROJETO" #define HUMITY_SENSOR "U" #define TEMPERATURE_SENSOR "T" // Coloque aqui a rede Wifi e a senha. const char* ssid = "Nome da rede Wifi"; const char* password = "Senha da rede Wifi"; // Coloque aqui o período em que o circuito permanecerá desligado (em segundos) const int sleepTimeS = 5; // Coloque aqui o servidor e tópicos que receberão os dados dos sensores const char* mqtt_server = "mqtt.devicehub.net"; String topic_t = String("/a/")+API_KEY+"/p/"+PROJECT_ID+"/d/"+DEVICE_UUID+"/sensor/"+TEMPERATURE_SENSOR+"/data"; String topic_h = String("/a/")+API_KEY+"/p/"+PROJECT_ID+"/d/"+DEVICE_UUID+"/sensor/"+HUMITY_SENSOR+"/data"; WiFiClient espClient; PubSubClient client(espClient); DHT_Unified dht(DHTPIN, DHTTYPE); // conectando-se na rede Wifi void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); //Conectando-se a rede while (WiFi.status() != WL_CONNECTED) { //Espera resposta da rede delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } // conectando ao servidor por MQTT void connect_client() { // Espera ate estar conectado ao servidor while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Cria cliente IP randômico String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Tentativa de conexão if (client.connect(clientId.c_str())) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Espera 5 segundo e tenta novamente delay(5000); } } } // Implementa o modo deepSleep do ESP8266. Quando acordar, repetirá setup(). Para isso, //pino D0 deve ser conectado ao pino RST para que seja possível acordar (devido interrupção). void deepSleep() { Serial.println("ESP8266 in sleep mode"); ESP.deepSleep(sleepTimeS * 1000000); } void setup() { // Inicia módulos Serial.begin(115200); dht.begin(); setup_wifi(); randomSeed(micros()); delay(2000); sensors_event_t event; //Variavel para eventos do sensor client.setServer(mqtt_server, 1883); //Configura servidor // Obtém umidade do sensor e o armazena a estrutura para servidor dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) { Serial.println("Error reading!"); } Serial.print("Umidade: "); Serial.println(event.relative_humidity); String msg_h = "{\"value\": " + String(event.relative_humidity) + "}"; // Obtém temperatura do sensor e o armazena a estrutura para servidor dht.temperature().getEvent(&event); if (isnan(event.temperature)) { Serial.println("Error reading temperature!"); } Serial.print("Temperatura: "); Serial.println(event.temperature); String msg_t = "{\"value\": " + String(event.temperature) + "}"; // Verifica se está conectado ao servidor. Se nao, tenta conectar-se. if (!client.connected()) { connect_client(); } client.publish(topic_t.c_str(), msg_t.c_str()); //Publica temperatura client.publish(topic_h.c_str(), msg_h.c_str()); //Publica Umidade deepSleep(); //Coloca placa em modo de baixo consumo } void loop() { //Como usaremos o deepSleep, não teremos um loop. } |
Testando
Uma vez copiado o código acima e salvo no computador, poderemos fazer upload do código ao NodeMCU. Pode-se clicar a seta de upload do cabeçalho do Arduino IDE ou clicar CTRL+U. Assim, irá começar a baixar para a placa. Deve-se checar uma tela como a de baixo assim que o upload terminar.
Clicando em Ctrl+Shift+M (serial monitor), você poderá checar o processo de obtenção dos dados pelos sensores e a conexão Wifi. Caso o nome ou a senha da rede Wifi estejam errados, você poderá conferir nesta tela. A linha com caracteres aleatórios deve ser ignorada, pois é o momento em que a placa sai do deepSleep e está configurando a comunicação serial.
Para terminar, podemos checar o gráfico sendo atualizado no DeviceHub com os dados recebidos pelo NodeMCU.
Conclusão
Concluirei este artigo com algumas recomendações:
- Com o comando deepSleep e uma bateria conectada ao NodeMCU, pode-se criar pequenos módulos de sensores e colocá-los em diferentes locais com rede Wifi por uma longa duração de tempo. Quanto maior o período de obtenção dos dados dos sensores, maior o período para a troca da bateria;
- A razão para utilizar a biblioteca Adafruit_Sensor.h é para que o leitor tenha maior liberdade para adicionar novos sensores e mantê-los organizados. Lembre-se sempre que muitas das funções que você deseja implementar já foram feitas por alguém e pode ser achada no GitHub ou em outros sites, tornando sua programação mais rápida e organizada. Reinventar a roda pode ser trabalhoso e não tão eficiente quanto uma biblioteca open source que foi modificada por uma comunidade de profissionais da área. Não tenha vergonha de usar o que já existe e é open source.
Sinta-se livre para modificar este projeto como bem entender, e sempre traga algo novo à comunidade, pois é em grupo que criaremos um sistema IoT único e para todos. Qualquer dúvida sobre o projeto, deixar nos comentários.
Olá Victor montei o cenário proposto do seu artigo, mas apresenta um erro não faz leitura dos dados.
O Erro está na ligação do dth11 no cabo amarelo está ligado na perna errada do Dth11.
funcionou perfeitamente depois da alteração.
Paulo, montei e deu esse problema, fui no datasheet do DHT11 e está errada a pinagem.
Acertei os pinos , leu… mas não conecta ao servidor …
Sabes de algo ???
Olá Paulo,
me desculpe pela super demora. Não cheguei a acompanhar o artigo. Você está correto, a pinagem está trocada. De qualquer forma, fico feliz que tenha feito funcionar.
Abraços