Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Conheça agora um sensor importante!



Como saber o nível de água em uma caixa d’água? Para monitorar este tipo de coisa, por exemplo, você pode utilizar um sensor de pressão, equipamento bastante útil na automação industrial, de forma geral. E, é exatamente sobre a família de sensores de pressão MPX como opção para medida de pressão que vamos falar neste vídeo de hoje. Vou te apresentar o sensor de pressão MPX5700 e realizar uma montagem de exemplo usando o ESP WiFi LoRa 32.
Pessoal, detalhe que, neste circuito de hoje, não vou utilizar comunicação LoRa, nem WiFi e nem Bluetooth, mas optei por esse ESP32 por já ter ensinado em outros vídeos como utilizar todos esses recursos.





Demonstração





Recursos usados

·         Sensor de Pressão Diferencial MPX5700DP
·         Potênciometro 10k (ou trimpot)
·         Protoboard
·         Fios para conexão
·         Cabo USB
·         ESP WiFi LoRa 32
·         Compressor de ar (opcional)





Por que medir pressão?

·         Existem inúmeras aplicações em que a pressão é uma variável de controle importante.
·         Podemos citar sistemas de controle pneumáticos ou hidráulicos.
·         Instrumentação médica.
·         Robótica.
·         Controle de processos industriais ou ambientais.
·         Medida de nível em reservatórios de líquidos ou gases.
·         Entre outros.





A família MPX de sensores de pressão

·         São transdutores de pressão em tensão elétrica.
·         Baseiam-se em um sensor piezo resistivo, onde uma compressão é convertida em variação da resistência elétrica.
·         Existem versões capazes de medir pequenas diferenças de pressão (de 0 à 0,04atm), como grandes variações (de 0 à 10atm).
·         Aparecem em vários encapsulamentos.
·         Podem medir pressão absoluta (em relação ao vácuo), pressão diferencial (a diferença entre duas pressões p1 e p2) ou manométrica (em relação à pressão atmosférica).





O MPX5700DP

·         A série 5700 possui sensores absolutos, diferenciais e manométricos.
·         O MPX5700DP pode medir uma pressão diferencial de 0 até 700kPa (aproximadamente 7atm).
·         A tensão de saída varia de 0,2V à 4,7V.
·         Sua alimentação de 4,75V à 5,25V




Para a demonstração

·         Desta vez não faremos uma aplicação prática usando este sensor, vamos somente montá-lo e realizar algumas medidas como demonstração.
·         Para isso, vamos usar um compressor de ar direto para aplicar uma pressão na entrada de alta pressão (p1) e obtermos o diferença em relação à pressão atmosférica local (p2).
·         O MPX5700DP é um sensor unidirecional, isso significa que ele mede diferenças positivas em que p1 deve ser sempre maior ou igual a p2.
·         p1 > p2 e a diferença será p1 - p2
·         Existem sensores diferenciais bidirecionais, que podem avaliar diferenças negativas e positivas.
·         Embora seja apenas uma demonstração, poderíamos facilmente utilizar os princípios aqui para controlar, por exemplo, a pressão em um reservatório de ar, alimentado por este compressor.






Calibrando o ADC do ESP

·         Como sabemos que a conversão analógica-digital do ESP não é completamente linear e pode variar de um SoC para outro, vamos então começar fazendo uma determinação simples de seu comportamento.
·         Utilizando um potenciômetro e um multímetro, mediremos a tensão aplicada no AD e relacionaremos com o valor indicado.


·         Com um programa simples para a leitura do AD e coletando as informações em uma tabela, pudemos determinar a curva de seu comportamento.






Calculando a pressão

·         Embora o fabricante nos forneça a função com o comportamento do componente, é sempre aconselhável fazer uma calibração quando estamos falando de realizar medidas.
·         No entanto, como é somente uma demonstração, vamos utilizar diretamente a função encontrada no datasheet. Para isso vamos manipular de forma que nos dê a pressão em função do valor do ADC.




* Lembre-se que a fração da tensão aplicada no ADC pela tensão de referência deve ter o mesma valor que o ADC lido pelo ADC total. (desconsiderando a correção)



Montagem

·         Para ligar o sensor, vamos procurar pelo entalhe em um de seus terminais, que indica o pino 1.
·         Contando daí:
-  O pino 1 fornece a saída do sinal (de 0,2V à 4,7V)
-  O pino 2 é a referência. (GND)
-  O pino 3 a alimentação. (Vs)
·         Como a saída do sinal é de 4,7V, vamos usar um divisor de tensão para que o valor máximo seja equivalente à 3V3. Para isso fizemos o ajuste com o potenciômetro.






Código-fonte: #Includes e #defines

//Bibliotecas para utilização do display oLED
#include <Wire.h>  // Necessário apenas para o Arduino 1.6.5 e posterior
#include "SSD1306.h" // o mesmo que #include "SSD1306Wire.h"

//Os pinos do OLED estão conectados ao ESP32 pelos seguintes GPIO's:
//OLED_SDA -- GPIO4
//OLED_SCL -- GPIO15
//OLED_RST -- GPIO16

#define SDA    4
#define SCL   15
#define RST   16 //RST deve ser ajustado por software




Código-fonte: Variáveis globais e constantes

SSD1306  display(0x3c, SDA, SCL, RST); //Instanciando e ajustando os pinos do objeto "display"

const int amostras = 10000; //número de amostras coletadas para a média
const int pin = 13; //pino de leitura

const float fator_atm = 0.0098692327; //fator de conversão para atmosferas
const float fator_bar = 0.01; //fator de conversão para bar
const float fator_kgf_cm2 = 0.0101971621; // fator de conversão kgf/cm2




Código-fonte: Setup()

void setup()
{
  pinMode(pin, INPUT); //pino de leitura analógica
  Serial.begin(115200); //iniciando a serial

  // Inicia o display
  display.init();

  display.flipScreenVertically(); //Vira a tela verticalmente
}



Código-fonte: Loop()

void loop()
{
  float medidas = 0.0;//variável para manipular as medidas
  float pressao = 0.0; //variável para armazenar o valor da pressão

  //inicia a coleta de amostras do ADC
  for (int i = 0; i < amostras; i++)
  {
    medidas = medidas + float(analogRead(pin));
  }

  medidas = (medidas / float(amostras));//Tira a média das amostras

  pressao = calculaPressao(medidas); //Calcula a pressao em kPa

//Exibe o tela inicial ou os valores de pressão
//se está ligado a mais de 5 segundos, exibe os valores de pressão
//se está ligado a menos de 5 segundos, exibe tela inicial

  if (millis() > (5000)) //se está ligado a mais que 5 segundos
  {
    //Limpa o buffer do display
    display.clear();
    //ajusta o alinhamento para a esquerda
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    //ajusta a fonte para Arial 10
    display.setFont(ArialMT_Plain_16);
    //Escreve no buffer do display a pressao
    display.drawString(0, 0, String(int(pressao)) + " kPa");
    display.drawString(0, 16, String(pressao * fator_atm) + " atm");
    display.drawString(0, 32, String(pressao * fator_kgf_cm2) + " kgf/cm2");
    //escreve no buffer o valor do ADC
    display.drawString(0, 48, "adc: " + String(int(medidas)));
  }
  else //se está ligado a menos de 5 segundos, exibe a tela inicial
  {
    //limpa o buffer do display
    display.clear();
    //Ajusta o alinhamento para centralizado
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    //ajusta a fonte para Arial 16
    display.setFont(ArialMT_Plain_16);
    //escreve no buffer
    display.drawString(64, 0, "Sensor Pressão");
    //escreve no buffer
    display.drawString(64, 18, "Diferencial");
    //ajusta a fonte para Arial 10
    display.setFont(ArialMT_Plain_10);
    //escreve no buffer
    display.drawString(64, 44, "ESP-WiFi-Lora");
  }
  display.display();//transfere o buffer para o display

  delay(50);
}



Código-fonte: Função que calcula a pressão em kPa

float calculaPressao (float medida)
{
  //Calcula a pressão com o
  //valor do AD corrigido pela função corrigeMedida()
  //Esta função foi escrita de acordo com dados do fabricante
  //e NÃO LEVA EM CONSIDERAÇÃO OS POSSÍVEIS DESVIOS DO COMPONENTE (erro)

  return  ((corrigeMedida(medida) / 3.3) - 0.04) / 0.0012858;
}


Esta é a função que obtemos a partir da função dada pelo fornecedor.

Observe que corrigimos o valor lido pelo AD antes de utilizá-lo.





Código-fonte: Função que corrige o valor do AD

float corrigeMedida(float x) {
  /*
    Esta função foi obtida através da
    relação entre a tensão aplicada no AD
    e valor lido
  */
  return   4.821224180510e-02
           +   1.180826610901e-03 * x
           +  -6.640183463236e-07 * x * x
           +   5.235532597676e-10 * x * x * x
           +  -2.020362975028e-13 * x * x * x * x
           +   3.809807883001e-17 * x * x * x * x * x
           +  -2.896158699016e-21 * x * x * x * x * x * x;
}




Faça o download dos arquivos:





Postar um comentário

8 Comentários

  1. estou a fazer um sistema parecido com esse, mas uso um lcd20x4 e um arduino uno, o sensor é um mpx5700DP. Estou com um problema, na hora em que ligo o sensor na porta analogica ja configurada no sketch o arduino simplesmente trava. oque pode estar acontecendo??

    ResponderExcluir
  2. peço desculpas por ser leigo mas não entendi o porque do divisor de tensão sendo que ja tem uma saida de 3v3 v no esp?

    ResponderExcluir
  3. Muito bom, será que com esse sensor, sera que seria possivel fazer um pressostato para acionamento de uma bomba em um poço por exemplo?

    ResponderExcluir
  4. Boa noite, otimo tutorial, muito bem explicado.

    Tenho uma dúvida com relação a este sensor. Eu posso utilizar este sensor para medir a pressão de um butijão de gás de cozinha? Eu gostaria de criar um sensor que me informasse quando o nivel do butijao estivesse baixo para que eu comprasse mais gas por exemplo.

    Pensei em um sistema assim que pudesse ser custeado e instalado por exemplo por uma revendedora de gas em diversos restaurantes, padarias, etc, de forma que eles recebesse esses informes e automaticamente iniciasse a entrega e instalação de gas para seus clientes, garantindo assim a continuidade do negocio deles e fidelizando os clientes. O mesmo serveria para residencias, por exemplo se de alguma forma pudesse integrar aos serviços Google home ou Alexa de forma a receber avisos desses assistentes para compra gás sempre que o nivel do gas estiver baixo.

    ResponderExcluir
  5. Olá boa tarde, o codigo está me retornando um erro

    invalid conversion from 'int' to 'OLEDDISPLAY_GEOMETRY' [-fpermissive]

    ResponderExcluir
  6. muito bom o conteúdo , me surgiu somente uma duvida , para que serve as portas 4 , 5 e 6

    ResponderExcluir