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

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:

  1. 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.
  2. 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 ”.
  3. Agora, de volta ao Arduino IDE, clique em Sketch -> Incluir Biblioteca -> Adicionar Biblioteca .ZIP
  4. 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 🙂