Leitura de uma variável tipo float

BOa tarde

estou usando arduino mega e eipse E3, em rede modbus , usando o drive modicon normalmente

estou lendo temperatura e umidade , com sensor dht22

estou com problemas para ler a parte decimal da temperatura e da umidade

no codico arduino , temperatura e umidade s~]ao variaveis tipo float

quando passo para o e3 via modbus, so consigo ler se usar word , no drive

se mudar P2 para 5 que é uma float , noa le nada

se deixar em P2 igual a 1 que é uma word le normal, somente o inteiro da variavel

alguem com mais experiencia consegue me ajudar nessa

@Alessandro_Donizetti, bom dia.

Seria interessante verificar se o código Arduino está mesmo retornando float. Encontrei este tópico que pode lhe ajudar: https://forum.arduino.cc/index.php?topic=274604.0

Via Modscan, conseguiu ler a variável float?

Se possível compartilha também o log do driver Modbus aqui ou me envia por e-mail: fernando@elipse.com.br.

Sds.

entao , fiz de um modo um pouco diferente

habilitei no tag de comunicação do drive a opção de escala. ja funcionou usando word mesmo

so tive que alterar o codico, para multiplicar o valor passado para o modbus (100 vezes)no meu caso, pois utilizei uma escala no tag

Boa noite, estou trabalhando com um projeto parecido. quero monitorar a temperatura e a umidade do ambiente com um sensor dht11 arduino no elipse e3, porem estou tendo dificuldades no codigo. poderia me passar seu email para entrarmos em contato?

alessandroequilibrio@hotmail.com watts 41 996514311

Alguém conseguiu solução para a dificuldade citada acima, estou com o mesmo problema, estou com um sensor de Corrente continua ACS712, na serial ele mostra o valor com a casa decimal más quando leio ele no elipse scada ele aparece como número inteiro, alguém sabe alguma solução? Por gentileza.

Entendo que no caso do @dsm007 o desafio é transformar o float em dois uint16_t.

É possível seguir por este caminho:

  1. Configurar dois Holding Registers.

ModbusTCPServer modbusTCPServer;

void setup
{
  // stuffs...
  modbusTCPServer.configureHoldingRegisters(0x00, 2);
}

  1. Criar uma função que passe o valor do float a uma array de uint16.
void floatToUint16Array(float floatValue, uint16_t uint16Array[2]) {
    // Usa um ponteiro para interpretar os bits do float como dois uint16_t
    uint32_t floatBits = *((uint32_t*)&floatValue);

    // Divide os 32 bits em dois uint16_t
    uint16Array[0] = (uint16_t)((floatBits >> 16) & 0xFFFF);
    uint16Array[1] = (uint16_t)(floatBits & 0xFFFF);
}

  1. Obter o valor de leitura, converter e escrever nos registros.

float sensorValue;
uint16_t uint16Array[2];

void loop()
{
  // stuffs...
  
  // !!! LER o valor do sensor !!!
  
  // Passa o valor do float para array
  floatToUint16Array(sensorValue, uint16Array);

  // Publicar o valor em dois registros
  modbusTCPServer.holdingRegisterWrite(0x00, uint16Array[0]);
  modbusTCPServer.holdingRegisterWrite(0x01, uint16Array[1]);
  
  // other stuffs...
}

  1. No Elipse é possível ler o valor com o operador default 5.

image

Em tempo, em relação a minha resposta anterior, há um jeito mais fácil e mais performático de converter o float e um array de uint16_t.

Usando o tipo union.

union u
{
    float f;
    uint16_t a[2];
};

// ...

void loop()
{
    float sensorValue;
    u s; // variavel do tipo u (union)
   
    // Fazer a leitura do sensor e armazenar
    // na varivel sensorValue

    s.f = sensorValue;

    modbusTCPServer.holdingRegisterWrite(0x00, s.a[1]);
    modbusTCPServer.holdingRegisterWrite(0x01, s.a[0]);
}