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:
8 Comentários
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??
ResponderExcluirpeç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?
ResponderExcluirVOCE VAI COLOCAR UM RESISTOR
ExcluirMuito bom
ResponderExcluirMuito bom, será que com esse sensor, sera que seria possivel fazer um pressostato para acionamento de uma bomba em um poço por exemplo?
ResponderExcluirBoa noite, otimo tutorial, muito bem explicado.
ResponderExcluirTenho 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.
Olá boa tarde, o codigo está me retornando um erro
ResponderExcluirinvalid conversion from 'int' to 'OLEDDISPLAY_GEOMETRY' [-fpermissive]
muito bom o conteúdo , me surgiu somente uma duvida , para que serve as portas 4 , 5 e 6
ResponderExcluir