Olá pessoal, boa tarde.
Comprei um sensor de pressão na China Modelo WNK80MA com range de 0 a 15 BAR - Saida I2C - alimentado com 3.6V. Uma maravilha para usar com ESP 32 e bateria. Ocorre que eu to apanhando para ler a pressão nele. A temperatura da água eu já até consegui, mas a pressão, nada!!!
O chinês me mandou um código em Arduino que está em anexo mas eu não consigo nenhum resultado com ele. Não sei se esse código fornece o resultado em BAR, PSI, Kpa ou Mca.
Alguém tem conhecimento desse sensor ou consegue destrinchar o código enviado pelo chinês para que possa me ajudar?
Agradeço qualquer ajuda.
Zé Roberto
Tags:
Boa noite,
Envie o link do produto com especificações e protocolo de comunicação.
Olá Murta, obrigado pelo interesse no meu problema! Eu não tenho a documentação do sensor. Estou solicitando o datasheet à empresa chinesa. O único documento que tenho é este em anexo.
Boa tarde,
Está faltando o protocolo de comunicação com o sensor.
Vamos aguardar.
Olá Murta, Segue em anexo a documentação do protocolo do sensor.
Agradeço qualquer ajuda
Bom dia José Roberto,
Você tem experiêcia com comunicação I2C no ESP32 ?
https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/
Você tem a pinagem do sensor?
I2C SDA pino
I2C SCL pino
GND pino
Qual é a tensão de alimentação? 5 ou 3,3V ?
Primeiro teste que eu sugiro que faça para testar a comunicação é rodar o I2C scanner e identificar o endereço do sensor. Poste seu resultado por favor.
Caro Murta,
Com base nesse documento que eu anexei consegui algum progresso aqui. Todos os cálculos estão Kpa e eu estava setando o Range Máximo em BAR, ai eu não conseguia um resultado satisfatório.
Nos testes iniciais com essa nova configuração eu consegui com que o sensor enviasse um valor zerado na pressão e a temperatura certa (testei aquecendo o sensor com soprador térmico e funcionou). Agora, vou fazer um teste com um compressor e colocar pressão nele para ver se ele envia o valor certo.
Depois eu posto o resultado aqui.
Obrigado pela ajuda!
Zé Roberto
Olá, Zé Roberto.
Para facilitar a vida do José Gustavo, informe o código completo do sensor.
Por acaso é o WNK80MA - G-A-C3-3-P1 ( 10 bar, I2C ) ?
Você informou que o sensor tem uma faixa de 0 - 15 bar, mas na datasheet enviada não há nenhum modelo com esta faixa. Além disso, na datasheet fala em 60 bar de faixa, mas não tenho certeza se esta informação corresponde a um modelo específico ou se refere a máxima faixa disponível para este modelo.
Se puder anexar fotos, também ajuda.
D. T. Ribeiro.
Caro Ribeiro,
Penso que essa datasheet é genérica. O sensor que eu tenho é de 0-15BAR mesmo. Esse fabricante tem esse sensor com vários ranges de 0-3BAR em diante.
De qualquer forma já consegui avançar aqui (vide minha resposta ao Murta).
Vou postar os resultados que obtiver.
Obrigado pelo interesse!
Zé Roberto
Boa noite,
Traduzindo a pagina do manual:
Medição de pressão:
Os dados de medição são um inteiro com sinal de 24 bits, armazenado em 3 registradores de endereço 0x06, 0x07, 0x08.
No seu programa :
Olá, José Gustavo!
Aquela parte que você pegunta "Está comparando com o quê?" me deu a impressão de que é uma forma de obter o valor absoluto, caso a medidad seja negativa. Só que está sendo feito em 24 bits, o que é para lá de estranho!
Acho até que, se a intenção é esta, não deve funcionar. No C e no C++ não existem inteiros de 24 bits.
O correto seria fazer primeiro uma "extensão do bit de sinal" .
Vamos aguardar o José Roberto publicar o que achou.
D. T. Ribeiro.
DT boa noite,
Vamos ver o programa do José Roberto.
No caso do "inteiro" de 24 bits com sinal, pode usar o LONG ou talvez o DOUBLE.
https://www.arduino.cc/reference/en/language/variables/data-types/l...
https://www.arduino.cc/reference/en/language/variables/data-types/d...
Estou achando que talvez seja isso :
(Chines é muito avacalhado nas informações)
0xFFFFFF = 16.777.215
No caso do valor 24 bits com sinal :
0xFFFFFF = + 8.388.608
0x800000 = 0
0x000000 = - 8.388.608
Portanto
if (dat > 0x800000) // Maior do que 0
fadc= - (dat - 16777216.0);
Else
fadc = - (dat) ;
Olá, José Roberto!
Analisando a documentação ( horrível ) do chinês, imagino que a coisa funcione assim ( corrijam-me se estiver errado ):
Os sensores desta série do fabricante são oferecidos com saída analógica ( tensão ou corrente ) ou com interface de comunicação I2C.
Os sensores devem ser uma ponte de strain gauges ou coisa que o valha, que converte a pressão em um sinal de tensão.
A saída de tensão desta ponte é tratada por um circuito analógico que condiciona o sinal, conforme o gráfico abaixo, para cada faixa específica de sensor.
Para os sensores que tem uma interface I2C, provavelmente a saída deste circuito analógico de condicionamento de sinal é ligada na entrada de um conversor A/D diferencial de 24 bits, com comunicação por I2C, cujo bus I2C é exposto no conector.
Então, o que se obtém lendo a interface I2C, é um valor digital de 24 bits com sinal, correspondente a tensão do circuito analógico de condicionamento.
Daí o método sugerido pelo chinês para obter a pressão, cuja tradução tento a seguir.
1.
Lê-se o valor digital de 24 bits com sinal do conversor A/D, que o chinês chama de dat, transformando-o em um float, que o chinês chama de fadc, da seguinte forma:
// Exemplo:
dat = 0xFFFB50 ; // -1200 em sinal complemento de 2 de 24 bits
// 16776016 em inteiro sem sinal
if(dat & 0x800000)
{
// if (dat & 0x800000) eh a mesma coisa que
// if ( ( sinal( dat ) ) == negativo ),
// considerando dat como um inteiro com sinal de 24 bits
//
// Note que:
// 24
// 16777216 = 2 ( bit 24 == 1, bits 23 ... 0 == 0 )
// 24
// como os bits bits 23 ... 0 são todos nulos, pode-se considerar 2 como o 'zero' de inteiros de 24 bits
// Então, se dat é negativo, para se obter dat em float, faz-se
//
// dat - 'zero', 'zero' usado como float para forçar "promoção" de dat para float nesta subtração
//
// 24
// 2 é maior do que qualquer valor inteiro de 24 bits,
//
// 24
// logo, dat - 2 será sempre negativo, já que dat é um valor inteiro de 24 bits.
//
fadc = dat - 16777216.0;
// fadc = 16776016.0 - 16777216.0
// fadc = -1200.0
}
else
{
fadc = dat;
}
Ao invés deste if, sob o ponto de vista de clareza, talvez fosse melhor usar
fabc = (float)( int32_t( dat 8 ) / ( 1 8 ) ) ;
Que mostra claramente que a intenção é promover um inteiro com sinal de 24 bits para um inteiro com sinal de 32 bits e depois para um float, já que a promoção 'direta' de um inteiro de 24 bits com sinal para um float não é possível em C ou C++, até porque não existem inteiros de 24 bits com sinal no C ou C++
2.
Este valor digital é então convertido para a tensão que se tinha na entrada do conversor A/D, usando a expressão padrão dos conversores A/D para isto:
tensão = ( valor digital * AD_VRef ) / AD_Max
Onde AD_VRef é a tensão de referência do A/D, neste caso 3.3 V e AD_Max é o máximo valor digital que o A/D pode
23
fornecer, neste caso 2 = 8388608.
Como o chinês chama esta tensão de ADC ( ?!? ), a fórmula fica
ADC = ( 3.3 * fadc ) / 8388608.0;
3.
Este valor de tensão ( ADC ) é então convertido para pressão, de acordo com o gráfico mostrado acima.
A fórmula de conversão é
P = LRL + ( ( ( URL - LRL ) / 2 ) * ( ADC - 0.5 ) )
Onde
LRL: Lower Range Limit, limite inferior da faixa do sensor, por exemplo, -50 kPa
URL: Upper Range Limit, limite superior da faixa do sensor, por exemplo, 500 kPa
Observe que a unidade da pressão obtida será a mesma em que LRL e URL são expressas.
Por exemplo, supondo um valor de tensão obtido como 1.5 V e LRL e URL respectivamente -50 kPa e 500 kPa, a pressão será
P = -50 + ( ( ( 500 * (-50) ) / 2 ) / ( 1.5 - 0.5 ) )
P = -50 + ( ( 550 / 2 ) * 1.0 )
P = -50 + 275
P = 225 kPa
Espero ter ajudado a esclarecer o ponto.
D. T. Ribeiro.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por