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

Exibições: 302

Anexos

Responder esta

Respostas a este tópico

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.

Anexos

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

Anexos

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. 

https://www.esp32.com/viewtopic.php?t=4742

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 :

 dat = buf[0];  (montando o valor com 24 bits) 
  dat = 8;
  dat += buf[1];
  dat = 8;
  dat += buf[2];  
Sugiro que imprima esse valor para verificar se está coerente. 
  if (dat & 0x800000)    (não entendi - esta comparando com o que? ) 
  {
    fadc= dat - 16777216.0;
  }
  else
  {
    fadc = dat;
  }

No manual :
ADC = 3.3* fadc /8388608.0;  (creio que 3,3 seja a tensão de alimentação 3,3V  do sensor - favor confirmar) 
Por exemplo se o range for  : -50kpa…500kPa,  (seu sensor tem esse range?) 

Upper_Range_Limit = 500,
Lower_Range_Limit = -50;
Range = Upper_Range_Limit - Lower_Range_Limit  
Nesse exemplo =>  Range = 500 - (-50) = 550 kPa
P: valor da pressão medida

P = (Range * (ADC-0.5)/2.0)+Lower_Range_Limit;     //  Note:ADC: intermediate variables

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço