Você está na página 1de 24

Por Fernando Koyanagi

Intenção dessa aula


1. Apresentar a família de sensores de
pressão MPX como opção para
medida de pressão.

2. Apresentar o sensor de pressão


MPX5700.

3. Realizar uma montagem de exemplo


usando o ESP WiFi LoRa 32.
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)
Seu e-mail
Em www.fernandok.com

5
forum.fernandok.com
Instagram
fernandok_oficial

Telegram
fernandok_oficial

7
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
A pressão p2 pode
ser aplicada através
• São transdutores de pressão em tensão do orifício
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).
A pressão p2 NÃO
• Aparecem em vários encapsulamentos.
pode ser aplicada
• Podem medir pressão absoluta (em relação ao através do orifício. A
vácuo), pressão diferencial (a diferença entre região é selada em
duas pressões p1 e p2) ou manométrica (em alto vácuo
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.

Relação entre a Tensão de saída versus a Pressão Diferencial para


o 5700DP, segundo o fabricante.

A primeira letra do sufixo indica a forma


de medida:
• A para absoluta
• D para diferencial
• G para manométrica
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 demostraçã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
5V USB
SoC para outro, vamos então começar fazendo uma
determinação simples de seu comportamento.
3V3 do ESP

• Utilizando um potenciômetro e um multímetro,


mediremos a tensão aplicada no AD e relacionaremos Pino 13
com o valor indicado. Potenciômetro de ADC do ESP
10k ESP WiFi LoRa

GND

GND
Calibrando o ADC do ESP ADC
0
Tensão(V)
0,025
111 0,193
208 0,29
313 0,37
410 0,45
• Com um programa simples para a leitura do AD e coletando 505 0,52
as informações em uma tabela, pudemos determinar a 618
717
0,62
0,68
curva de seu comportamento. 818 0,767
1037 0,959
1183 1,08
1254 1,14
1311 1,16
1471 1,3
1563 1,39
1684 1,48
2039 1,76
2222 1,93
2421 2,1
2637 2,24
2836 2,41
3004 2,53
3135 2,64
3342 2,78
3642 2,94
3829 3,01
4037 3,09
4095 3,11
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.

𝑉𝑜𝑢𝑡
= 0,0012858 ∙ 𝑃 + 0,04
𝑉𝑠
* Lembre-se que a fração da tensão
aplicada no ADC pela tensão de
𝐴𝐷𝐶 𝐴𝐷𝐶 referência deve ter o mesma valor que
− 0,04
= 0,0012858 ∙ 𝑃 + 0,04 𝑃= 4095 o ADC lido pelo ADC total.
4095 0,0012585 (desconsiderando a correção)
Montagem P1 P2
(alta pressão) (baixa pressão)

• Para ligar o sensor, vamos procurar pelo


entalhe em um de seus terminais, que indica
o pino 1.
5V USB
• Contando daí:

GND (2)
– O pino 1 fornece a saída do sinal (de 0V à 4,7V) Vs (3)

Vout (1)
– 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
Pino 13
um divisor de tensão para que o valor Divisor de ADC do ESP
ESP WiFi
tensão para
máximo seja equivalente à 3V3. Para isso adequar 5V LoRa
fizemos o ajuste com o potenciômetro. para 3V3

GND
GND
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

//Instanciando e ajustando os pinos do objeto "display"


SSD1306 display(0x3c, SDA, SCL, RST);

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 (não utilizada)
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 pressão em kPa


Código-fonte: Loop()

//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)));
}
Código-fonte: Loop()

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.

𝐴𝐷𝐶
− 0,04
𝑃= 4095
0,0012585
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;
}
Em www.fernandok.com
Download arquivos PDF e INO do código fonte

24

Você também pode gostar