Construa um leitor de volume de tanque por menos de $ 30 usando ESP32
A Internet das Coisas trouxe muitos aplicativos de dispositivos anteriormente complexos para as casas de muitos cervejeiros e produtores de vinho artesanais. As aplicações com sensores de nível têm sido utilizadas há décadas em grandes refinarias, estações de tratamento de água e fábricas de produtos químicos. Com a queda dos preços dos sensores, agora tanto a indústria quanto o DIY podem monitorar o volume de qualquer tanque, barril ou vasilha.
Os sensores disponíveis no mercado aberto podem detectar quase tudo e são classificados de acordo. O sensor usado para medir a umidade é denominado sensor de umidade, a pressão é chamada de sensor de pressão , a distância é chamada de sensores de posição e assim por diante. De forma semelhante, o sensor usado para medição dos níveis de fluido é denominado sensor de nível .
Os sensores de nível são usados para medir o nível das substâncias que fluem livremente . Tais substâncias incluem líquidos como água, óleo, lamas, etc., bem como sólidos na forma granular/em pó (sólidos que podem fluir). Essas substâncias tendem a se depositar nos tanques contêineres devido à gravidade e manter seu nível em estado de repouso.
Neste guia, você aprenderá como construir seu próprio sensor caseiro de nível, temperatura e umidade . Também estão incluídas instruções para que os dados recém-coletados sejam utilizados por meio Ubidots , uma plataforma de habilitação de aplicativos.
Requisitos
- ESP32
- Sensor Ultrassônico – HC-SR04
- Sensor DHT11
- Estojo de proteção de plástico
- Fios
- Cabo micro USB
- Arduino IDE 1.8.2 ou superior
- Conta Ubidots – para licenças educacionais
- Conta Ubidots – para licenças comerciais/industriais
Fiação e Invólucro
O sensor HC-SR04 (Sensor Ultrassônico) funciona com lógica de 5V. Por favor, siga a tabela e o diagrama abaixo para fazer as conexões corretas entre o ESP32 e o sensor ultrassônico:
Por favor, siga a tabela abaixo para fazer as conexões corretas entre o ESP32 e o DHT11 (Sensor de Temperatura e Umidade):
Eu construí um pequeno protótipo com um tanque em escala para mostrar as funções do sensor, mas um protótipo final com ele deve ficar assim:
Como você pode ver o sensor ultrassônico deve estar no topo do tanque, então com ele poderemos medir a distância entre a parte superior do tanque e o ponto final da substância:
Coloque os sensores de temperatura e umidade para monitorar um ambiente.
Para programar seu dispositivo conectado, conecte-se ao Arduino IDE.
Antes de começar com o ESP32, configure sua placa com o Arduino IDE. Se você não estiver familiarizado com a configuração de um quadro, consulte o artigo abaixo e siga o passo a passo até compilar o quadro:
Depois que sua placa estiver compilada, instale as bibliotecas necessárias para executar os sensores: “ PubSubClient ” e “ DHT: “
- Vá para Sketch/Program -> Incluir Biblioteca -> Gerenciador de Biblioteca e instale a PubSubClient . Para simplesmente encontrar a biblioteca correta, pesquise PubSubClient na barra de pesquisa.
- Vá para o repositório da biblioteca para baixar a biblioteca DHT . Para baixar a biblioteca clique no botão verde chamado “ Clone ou download ” e selecione “ Baixar ZIP ”.
- Agora, de volta ao Arduino IDE, clique em Sketch -> Incluir Biblioteca -> Adicionar Biblioteca .ZIP
- Selecione o arquivo .ZIP do DHT e depois “ Aceitar ” ou “ Escolher ”
Feche o IDE do Arduino e abra-o novamente. A reinicialização é necessária; por favor não pule esta etapa.
Agora é hora de começar a codificar 🙂
Copie o código abaixo e cole no IDE do Arduino.
Em seguida, atribua os parâmetros: nome e senha do Wi-Fi, além de seu Ubidots TOKEN exclusivo. Se você não sabe como localizar seu Ubidots TOKEN, consulte este artigo abaixo.
/********************************************** ************************************************ * Esse Exemplo envia dados codificados para Ubidots usando um ESP32. O código envia um valor de distância * entre um dispositivo e seu ponto final oposto para Ubidots , então o valor será gerenciado em * Ubidots para calcular o volume de um tanque com as características do seu tanque. * * Este exemplo é fornecido COMO ESTÁ, sem qualquer garantia. * * Feito por María Carlina Hernandez. ************************************************** ***********************************************/ /* *************************************** * Incluir bibliotecas ******** ********************************/ #incluir<WiFi.h> #incluir<PubSubClient.h> #incluir<DHT.h> /**************************************** * Definir constantes ****** **********************************/ namespace { const char * WIFISSID = "Assign_your_wifi_SSID_here"; // Coloque seu WifiSSID aqui const char * PASSWORD = "Assign_your_wifi_SSID_here"; // Coloque sua senha wifi aqui const char * TOKEN = "Assign_your_ Ubidots _token_here"; //Coloque seu TOKEN const char Ubidots * MQTT_CLIENT_NAME = "Assign_MQTT_client_here"; // Nome do cliente MQTT, insira sua própria string ASCII de 8 a 12 caracteres alfanuméricos; const char * VARIABLE_LABEL_1 = "distância"; //Atribuindo o rótulo da variável const char * VARIABLE_LABEL_2 = "humidity"; //Atribuindo o rótulo da variável const char * VARIABLE_LABEL_3 = "temperature"; //Atribuição do rótulo da variável const char * DEVICE_LABEL = "esp32"; // Atribuir o rótulo do dispositivo const char * MQTT_BROKER = "things. ubidots .com"; const intDHTPIN = 33; // Pino onde está conectado o DHT11 const int DHTTYPE = DHT11; // Tipo de DHT const int trigPin = 16; // Pino de disparo do HC-SR04 const int echoPin = 17; // Pino de eco do HC-SR04 } /* Declarações do sensor */ longa duração; distância de flutuação; /* Espaço para armazenar a solicitação */ char payload[300]; tópico de char[150]; /* Espaço para armazenar valores a serem enviados */ char str_sensor[10]; char str_TempSensor[10]; char str_HumSensor[10]; /************************************** *Funções Auxiliares****** **********************************/ WiFiClient ubidots ; Cliente PubSubClient( ubidots ); DHT dht(DHTPIN, DHTTYPE); retorno de chamada void (char* tópico, byte* carga útil, comprimento interno não assinado) { char p[comprimento + 1]; memcpy(p, carga útil, comprimento); p[comprimento] = NULO; Mensagem de string(p); Serial.write(carga útil, comprimento); Serial.println(tópico); } void reconnect() { // Loop até estarmos reconectados while (!client.connected()) { Serial.println("Tentando conexão MQTT..."); // Tentativa de conexão if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Connected"); } else { Serial.print("Falha, rc="); Serial.print(cliente.state()); Serial.println("tente novamente em 2 segundos"); // Aguarde 2 segundos antes de tentar novamente delay(2000); } } } /************************************** * Funções do sensor *** *************************************/ float readDistance() { digitalWrite(trigPin, HIGH); atrasoMicrossegundos(10); digitalWrite(trigPin, LOW); duração = (pulseIn(echoPin, HIGH)); distância = float(duração/29/2); distância de retorno; } /************************************** * Funções principais ***** ***********************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, SENHA); /* Inicializando o DHT11 */ dht.begin(); /* Atribua os PINS como INPUT/OUTPUT */ pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.println(); Serial.print("Aguarde WiFi..."); enquanto (WiFi.status()! = WL_CONNECTED) {Serial.print("."); atraso(500); }Serial.println(""); Serial.println("WiFi conectado"); Serial.println("Endereço IP: "); Serial.println(WiFi.localIP()); cliente.setServer(MQTT_BROKER, 1883); cliente.setCallback(retorno de chamada); } void loop() { if (!client.connected()) { reconnect(); } /* Leitura de temperatura e umidade */ float humidity = dht.readHumidity(); temperatura flutuante = dht.readTemperature(); /* chama a função readDistance() */ distance = readDistance(); /* 4 é largura mínima, 2 é precisão; o valor flutuante é copiado para str_sensor*/ dtostrf(distance, 4, 2, str_sensor); dtostrf(umidade, 4, 2, str_HumSensor); dtostrf(temperatura, 4, 2, str_TempSensor); /* Construindo a solicitação Ubidots */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(carga útil, "%s", ""); // Limpa a carga útil sprintf(payload, "{"%s": %s,", VARIABLE_LABEL_1, str_sensor); // Adiciona o rótulo da variável sprintf(payload, "%s"%s": %s,", payload, VARIABLE_LABEL_2, str_HumSensor); // Adiciona o rótulo da variável sprintf(payload, "%s"%s": %s}", payload, VARIABLE_LABEL_3, str_TempSensor); // Adiciona o rótulo da variável //sprintf(payload, "%s {"value": %s}}", payload, str_sensor); /* Imprime a leitura do sensor no Serial Monitor */ Serial.println("Publicando valores no Ubidots Cloud"); Serial.print("Distância = "); Serial.println(distância); Serial.print("Umidade = "); Serial.println(umidade); Serial.print("Temperatura = "); Serial.println(temperatura); /* Publica a solicitação no Ubidots */ client.publish(topic, payload); cliente.loop(); atraso(1000); }
Depois de colar seu código e atribuir o wifi apropriado, verifique no Arduino IDE. Para verificar, no canto superior esquerdo do nosso Arduino IDE você verá os ícones abaixo. Escolha o ícone Check Mark para verificar qualquer código.
Depois de verificado, você receberá uma mensagem “ Compilação concluída ” no IDE do Arduino.
Em seguida, carregue o código em seu ESP32. Escolha o ícone de seta para a direita ao lado do ícone da marca de seleção para fazer upload.
Após o upload, você receberá uma mensagem “ Done uploading ” no IDE do Arduino.
Com isso, o sensor agora está enviando os dados para o Ubidots Could!
Gestão dos dados em Ubidots
Se o seu dispositivo estiver conectado corretamente, você verá um novo dispositivo criado na seção do seu dispositivo no Ubidots . O nome do aparelho será “ esp32 ”, também dentro do aparelho você verá as variáveis distância, umidade e temperatura:
Se você deseja alterar o nome do seu dispositivo e das variáveis para um nome mais amigável, consulte este artigo:
A seguir, para calcular o volume de substâncias de fluxo livre no tanque, precisamos criar uma variável derivada para calcular um valor de volume.
A Variável Derivada nos permite construir operações utilizando as variáveis padrão, então neste caso vamos aplicar a do volume com a característica de um tanque cilíndrico onde:
- Pi = A razão entre a circunferência de um círculo e seu diâmetro (constante)
- r = O raio do tanque
- h = A altura do tanque
Clique em “ Adicionar variável ” e selecione “ Sintético “:
Como você pode ver na nova janela você deve anexar a fórmula no seguinte campo:
Depois de anexar a fórmula com as características do seu tanque, selecione a variável “ distância. “
Com sua fórmula inserida, seu volume começará a ser lido em seu aplicativo Ubidots .
Resultados
Agora seu sensor está pronto para começar a funcionar! Abaixo você pode ver a função do sensor de nível em diferentes volumes:
Para saber mais sobre Ubidots , confira estes tutoriais em vídeo .
Feliz hacking 🙂