Crie um leitor de volume de tanque por menos de $30 usando o ESP32

A Internet das Coisas trouxe muitas aplicações de dispositivos antes complexos para as casas de muitos cervejeiros e vinicultores artesanais. Aplicações com sensores de nível são usadas 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 público em geral podem monitorar o volume de qualquer tanque, barril ou recipiente.

Os sensores disponíveis no mercado podem detectar praticamente qualquer coisa e são classificados de acordo com sua função. O sensor usado para medir umidade é chamado de sensor de umidade, o de pressão, de sensor de pressão , o de distância, de sensor de posição, e assim por diante. De maneira semelhante, o sensor usado para medir o nível de fluidos é chamado de sensor de nível .

Os sensores de nível são usados ​​para medir o nível de substâncias que fluem livremente . Essas substâncias incluem líquidos como água, óleo, pastas, etc., bem como sólidos em forma granular/em pó (sólidos que podem fluir). Essas substâncias tendem a se depositar nos tanques de armazenamento devido à gravidade e mantêm seu nível em repouso.

sensor caseiro de nível, temperatura e . Também estão incluídas instruções para que os dados coletados sejam utilizados por meio Ubidots , uma plataforma de habilitação de aplicativos.

Requisitos

Fiação e Revestimento

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):

Construí um pequeno protótipo com um tanque em escala reduzida para demonstrar as funções do sensor, mas o protótipo final com a caixa deverá ter esta aparência:

Como você pode ver, o sensor ultrassônico deve estar no topo do tanque, para que possamos medir a distância entre a parte superior do tanque e o ponto final da substância:

Posicione os sensores de temperatura e umidade para monitorar o ambiente.

Para programar seu dispositivo conectado, utilize a IDE do Arduino.

Antes de começar a usar o ESP32, configure sua placa com a IDE do Arduino. Se você não estiver familiarizado com a configuração da placa, consulte o artigo abaixo e siga o passo a passo até concluir a compilação:

Após compilar sua placa, instale as bibliotecas necessárias para executar os sensores: “ PubSubClient ” e “ DHT

  1. Acesse Sketch/Program -> Incluir Biblioteca -> Gerenciador de Bibliotecas e instale a PubSubClient . Para encontrar a biblioteca correta, basta pesquisar por PubSubClient na barra de pesquisa.
  2. Acesse o repositório da biblioteca para baixar a biblioteca DHT . Para baixar a biblioteca, clique no botão verde chamado “ Clone or download ” e selecione “ Download ZIP ”.
  3. Agora, de volta à IDE do Arduino, clique em Sketch -> Incluir Biblioteca -> Adicionar Biblioteca .ZIP
  4. Selecione o arquivo .ZIP do DHT e clique em “ Aceitar ” ou “ Escolher ”.

Feche a IDE do Arduino e abra-a novamente. É necessário reiniciar; por favor, não pule esta etapa.

Agora é hora de começar a programar 🙂

Copie o código abaixo e cole-o na IDE do Arduino.

Em seguida, atribua os parâmetros: nome e senha da rede Wi-Fi, além do seu TOKEN exclusivo Ubidots . Se você não sabe como encontrar seu TOKEN Ubidots , consulte o artigo abaixo.

/**************************************************************************************************** * Este exemplo envia dados fixos para Ubidots usando um ESP32. O código envia um valor de distância * entre um dispositivo e seu ponto final oposto para Ubidots, e então o valor será gerenciado no * Ubidots para calcular o volume de um tanque com as características do seu tanque. * * Este exemplo é fornecido NO ESTADO EM QUE SE ENCONTRA, sem qualquer garantia. * * Criado por María Carlina Hernandez. *****************************************************************************************************/ /**************************************** * Incluir Bibliotecas ****************************************/ #include<WiFi.h> #incluir<PubSubClient.h> #incluir<DHT.h> /**************************************** * Definição de Constantes ****************************************/ namespace { const char * WIFISSID = "Atribua_seu_SSID_de_wifi_aqui"; // Insira seu SSID de Wi-Fi aqui const char * PASSWORD = "Atribua_seu_SSID_de_wifi_aqui"; // Insira sua senha de Wi-Fi aqui const char * TOKEN = "Ubidots"; // Insira seu TOKEN do Ubidotsconst char * MQTT_CLIENT_NAME = "Atribua_o_cliente_MQTT_aqui"; // Nome do cliente MQTT, insira uma string ASCII de 8 a 12 caracteres alfanuméricos; const char * VARIABLE_LABEL_1 = "distance"; // 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 = "temperatura"; // Atribuindo o rótulo da variável const char * DEVICE_LABEL = "esp32"; // Atribuindo o rótulo do dispositivo const char * MQTT_BROKER = "ubidots"; const int DHTPIN = 33; // Pino onde o DHT11 está conectado 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 */ long duration; float distance; /* Espaço para armazenar a solicitação */ char payload[300]; char topic[150]; /* Espaço para armazenar os valores a serem enviados */ char str_sensor[10]; char str_TempSensor[10]; char str_HumSensor[10]; /**************************************** * Funções Auxiliares ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); DHT dht(DHTPIN, DHTTYPE); void callback(char* topic, byte* payload, unsigned int length) { char p[length + 1]; memcpy(p, payload, length); p[length] = NULL; String message(p); Serial.write(payload, length); Serial.println(topic); } void reconnect() { // Loop até que a conexão seja restabelecida while (!client.connected()) { Serial.println("Tentando conexão MQTT..."); // Tentar conectar se (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Conectado"); } else { Serial.print("Falha, rc="); Serial.print(client.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); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = (pulseIn(echoPin, HIGH)); distance = float(duration/29/2); return distance; } /**************************************** * Funções Principais ****************************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, PASSWORD); /* Inicializando o DHT11 */ dht.begin(); /* Atribuindo os pinos como ENTRADA/SAÍDA */ pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.println(); Serial.print("Aguardando WiFi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi Conectado"); Serial.println("Endereço IP: "); Serial.println(WiFi.localIP()); client.setServer(MQTT_BROKER, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } /* Lendo temperatura e umidade */ float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); /* Chama a função readDistance() */ distance = readDistance(); /* 4 é a largura mínima, 2 é a precisão; o valor float é copiado para str_sensor */ dtostrf(distance, 4, 2, str_sensor); dtostrf(humidity, 4, 2, str_HumSensor); dtostrf(temperature, 4, 2, str_TempSensor); /* Construindo a requisição Ubidots */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Limpa o payload 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 Monitor Serial */ Serial.println("Publicando valores na Nuvem Ubidots "); Serial.print("Distância = "); Serial.println(distance); Serial.print("Umidade = "); Serial.println(umidade); Serial.print("Temperatura = "); Serial.println(temperatura); /* Publica a solicitação para Ubidots */ client.publish(tópico, payload); client.loop(); delay(1000); }

Depois de colar o código e atribuir a rede Wi-Fi correta, verifique no IDE do Arduino. Para verificar, no canto superior esquerdo do IDE do Arduino, você verá os ícones abaixo. Selecione o ícone de marca de seleção para verificar o código.

Após a verificação, você receberá a mensagem " Compilação concluída " na IDE do Arduino.

Em seguida, carregue o código no seu ESP32. Selecione o ícone de seta para a direita ao lado do ícone de marca de seleção para fazer o upload.

Após o upload, você receberá a mensagem " Upload concluído " na IDE do Arduino.

Com isso, o sensor agora está enviando os dados para a Nuvem Ubidots !

Gestão de dados no Ubidots

Se o seu dispositivo estiver conectado corretamente, você verá um novo dispositivo criado na seção de dispositivos do seu Ubidots . O nome do dispositivo será “ esp32 ” e, dentro dele, você verá as variáveis ​​distância, umidade e temperatura.

Se desejar alterar os nomes do seu dispositivo e das variáveis ​​para algo mais amigável, consulte este artigo:

Em seguida, para calcular o volume de substâncias que fluem livremente no tanque, precisamos criar uma variável derivada para calcular um valor de volume.

A variável derivada nos permite construir operações usando as variáveis ​​padrão; portanto, 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ética ”:

Como pode ver na nova janela, você precisa inserir a fórmula no seguinte campo:

Depois de associar a fórmula às características do seu tanque, selecione a variável “ distância

Após inserir a fórmula, o volume começará a ser lido no seu aplicativo Ubidots .

Resultados

Seu sensor agora está pronto para funcionar! Abaixo, você pode ver o funcionamento do sensor de nível em diferentes volumes:

Para saber mais sobre Ubidots , confira estes tutoriais em vídeo .

Boa sorte com a programação 🙂