Jar inteligente baseado em IoT usando NodeMCU ESP8266 e sensor ultrassônico
Este Jar inteligente nos permite acompanhar os estoques e é facilmente acessível pela internet. O Jar inclui um sensor ultrassônico na parte superior e usa as ondas ultrassônicas refletidas para descobrir até que ponto o Jar é preenchido e quanto espaço resta dentro do jarro. Sempre que a quantidade de conteúdo muda no jar, ela é detectada pelo NodeMCU, e o mesmo é atualizado no servidor web. Isso pode ser útil para rastrear suprimentos e planejar o reabastecimento de qualquer lugar do mundo.
Conteudo
Componentes necessários
- NodeMCU ESP8266
- Sensor Ultrassônico HC-05
- ProtoBoard
- Jumper Wires
Como funciona um sensor ultrassônico?
Antes de prosseguirmos, devemos saber como funciona um sensor ultrassônico para que possamos entender este tutorial muito melhor. O sensor ultrassônico usado neste projeto é mostrado abaixo.
Como você pode ver, ele tem dois olhos circulares como projeções e quatro pinos saindo dele. As duas projeções semelhantes a olhos são o transmissor e o receptor de onda ultrassônica (doravante denominada onda dos EUA). O transmissor emite uma onda dos EUA com uma frequência de 40 Hz, essa onda viaja pelo ar e é refletida de volta quando detecta um objeto. As ondas de retorno são observadas pelo receptor. Agora sabemos o tempo que leva para essa onda ser refletida e voltar e a velocidade da onda dos EUA também é universal (3400cm / s). Usando essas informações e as fórmulas do ensino médio abaixo, podemos calcular a distância percorrida.
Distância = Velocidade × Tempo
Agora que sabemos como funciona um sensor US, vamos ver como ele pode ser conectado a qualquer MCU/CPU usando os quatro pinos. Esses quatro pinos são Vcc, Trigger, Echo e Ground, respectivamente. O módulo funciona em + 5V e, portanto, o Vcc e o pino de aterramento são usados para alimentar o módulo. Os outros dois pinos são os pinos de E/S com os quais nos comunicamos com nosso MCU. O pino do gatilho deve ser declarado como um pino de saída e feito alto para 10µS, isso transmitirá a onda dos EUA para o ar como uma explosão sônica de 8 ciclos. Assim que a onda for observada, o pino Echo ficará alto pelo exato intervalo de tempo que a onda uS levou para retornar ao módulo do sensor. Portanto, este pino de eco será declarado como entrada e um temporizador será usado para medir quanto tempo o pino esteve alto. Isso pode ser melhor compreendido pelo diagrama de tempo abaixo.
Diagrama de circuito
O diagrama do circuito para Jarro baseado em IoT é fornecido abaixo:
O circuito é muito simples, pois estamos usando apenas o sensor ultrassônico e o NodeMCU. O sensor ultrassônico HC-SR04 funciona com 5V, portanto, se você conectá-lo a 3,3V, ele não funcionará. O pino VCC do sensor ultrassônico é conectado ao pino VIN do NodeMCU. Os pinos de disparo e eco são conectados ao pino D5 e D6 do NodeMCU, enquanto o pino GND do sensor é conectado ao pino GND do NodeMCU. Uma fonte de alimentação de 5V alimenta o NodeMCU.
Configuração IFTTT para Jarro baseado Iot
IFTTT (If This Then That) é um serviço baseado na web em que podemos criar cadeias de instruções condicionais, chamadas de miniaplicativos. Usando esses miniaplicativos, podemos enviar notificações de Emails, Twitter, Facebook. Aqui, estamos usando o IFTTT para enviar notificações por e-mail quando o Jar está quase vazio. Anteriormente, usamos o IFTTT em muitos aplicativos para enviar um alerta por e-mail, como neste projeto de campainha Wi-Fi.
Primeiro faça login no IFTTT e pesquise por ‘Webhooks’.
Agora, para obter a chave privada, clique em ‘Documentação’. Copie esta chave em algum lugar, ela será usada no código.
Como temos a chave privada, criaremos um miniaplicativo usando Webhooks e serviços de e-mail. Para criar um miniaplicativo, clique em seu perfil e clique em ‘Create’ a partir das opções disponíveis.
Agora, na próxima janela, selecione If This Then That.
No campo ‘This’, usaremos webhooks para obter as solicitações da web do NodeMCU.
Agora selecione o gatilho ‘Receive a Web Request’, insira o nome do evento como jar_event e clique em ‘Create Trigger’.
Depois disso, clique em ‘Then That’ e, em seguida, clique em E-mail.
Agora, em Email, clique em ‘send me an email’ e digite o assunto e o corpo do email e clique em criar ação.
Na última etapa, clique em ‘Finish’ para concluir a configuração do miniaplicativo.
Explicação do código
Estamos usando o Arduino IDE para programar o NodeMCU. Portanto, certifique-se de ter baixado os arquivos da placa NodeMCU. Para saber mais sobre como programar NodeMCU com Arduino IDE, siga o link.
O código completo é fornecido no final do documento. Aqui estamos explicando o código passo a passo.
Portanto, comece seu código incluindo todos os arquivos de biblioteca necessários. O sensor ultrassônico não requer um arquivo de biblioteca, então só precisamos do arquivo de biblioteca ESP8266WiFi.h.
#include <ESP8266WiFi.h>
Depois disso, defina os pinos onde você conectou os pinos Trig e Echo e também defina duas variáveis para calcular a distância e a duração.
const int trigPin = D5; const int echoPin = D6; long duration; int distance;
Depois disso, crie instâncias para o nome do Wi-Fi, a senha do Wi-Fi, o nome do host IFTTT e a chave privada.
const char* ssid = "Nome do Wi-Fi"; const char* password = "Senha"; const char *host = "maker.ifttt.com"; const char *privateKey = "Chave Privada";
Agora, para acessar o WiFiServer, declaramos uma biblioteca de objetos WifiServer. 80 é a porta padrão para HTTP.
WiFiServer server(80);
Agora, dentro da função void loop, calcule o tempo entre o sinal disparado e o sinal recebido. Este tempo será usado para calcular a distância.
duration = pulseIn(echoPin, HIGH); distance = duration * 0.0340 / 2;
Depois disso, a distância é convertida em uma porcentagem para mostrar a ocupação do Jar.
level =((14-distance)/14.0)*100;
Em seguida, comparamos a ocupação do frasco e, se o nível de ocupação for inferior a 5, ele acionará um evento IFTTT para enviar um e-mail de aviso
if ( level <= 10) { send_event("jar_event"); }
Testando o contêiner inteligente
Assim que seu hardware e código estiverem prontos, carregue o código e coloque o sensor ultrassônico no topo do Jar, ou você pode colá-lo na tampa do Jar como mostrado na figura. Agora verifique a página da Web usando o endereço IP que está impresso no Monitor Serial. Deve mostrar o nível de ocupação do Jar. E se o nível de ocupação do Jar for inferior a 10, ele enviará um e-mail de aviso. Aqui, o nível de aviso é definido de acordo com o comprimento do meu Jar. Você pode alterá-lo de acordo com o seu.
Código
#include <ESP8266WiFi.h> const int trigPin = D5; const int echoPin = D6; long duration; int distance; float level; const char* ssid = "Galaxy-A31"; const char* password = "xxxxxxxx"; // Sua senha void send_event(const char *event); const char *host = "maker.ifttt.com"; const char *privateKey = "xxxxxxxxxxx"; // Sua chave Privada do ifttt WiFiServer server(80); void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); Serial.print("Conectando-se à rede Wifi"); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Conectado com sucesso ao WiFi."); Serial.println("Endereço IP é : "); Serial.println(WiFi.localIP()); server.begin(); Serial.println("Servidor iniciado"); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.0340 / 2; Serial.println("Distance"); Serial.println(distance); level =((14-distance)/14.0)*100; Serial.println("level"); Serial.println(level); delay(1000); WiFiClient client = server.available(); if (client) { Serial.println("Cliente da Web conectado"); String request = client.readStringUntil('\r'); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // a conexão será fechada após a conclusão da resposta client.println("Refresh: 10"); // atualize a página após 10 segundos client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<style>html { font-family: Cairo; display: block; margin: 0px auto; text-align: center;color: #333333; background-color: ##f3ffee;}"); client.println("body{margin-top: 50px;}"); client.println("h1 {margin: 50px auto 30px; font-size: 50px; text-align: center;}"); client.println(".side_adjust{display: inline-block;vertical-align: middle;position: relative;}"); client.println(".text1{font-weight: 180; padding-left: 5px; font-size: 50px; width: 170px; text-align: left; color: #3498db;}"); client.println(".data1{font-weight: 180; padding-left: 1px; font-size: 50px;color: #3498db;}"); client.println(".data{padding: 1px;}"); client.println("</style>"); client.println("</head>"); client.println("<body>"); client.println("<div id=\"webpage\">"); client.println("<h1>Jar baseado em Iot</h1>"); client.println("<div class=\"data\">"); client.println("<div class=\"side_adjust text1\">Status:</div>"); client.println("<div class=\"side_adjust data1\">"); client.print(level); client.println("<div class=\"side_adjust text1\">% Preenchido</div>"); client.println("</div>"); client.println("</div>"); client.println("</body>"); client.println("</html>"); //client.println("<h1>Level Indicator</h1>"); if ( level <= 10) { send_event("jar_event"); } } } void send_event(const char *event) { Serial.print("Connecting to "); Serial.println(host); // Use a classe WiFiClient para criar conexões TCP WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("Conexão falhou"); return; } // Agora criamos um URI para a solicitação String url = "/trigger/"; url += event; url += "/with/key/"; url += privateKey; Serial.print("Solicitando URL: "); Serial.println(url); // Isso irá enviar a solicitação para o servidor client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); while(client.connected()) { if(client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } else { // Sem dados ainda, espere um pouco delay(50); }; } Serial.println(); Serial.println("fechando a conexão"); client.stop(); }