DHT22 - Arduino Modbus

Boa tarde a todos!
Gostaria de pedir uma ajudar de vocês para solucionar um problema que eu estou tendo com a minha comunicação Modbus.
Estou utilizando um sensor DHT22 para medir temperatura e umidade do ambiente, da seguinte forma conforme o código:

DHT dht(DHTPIN, DHTTYPE);
float DHTtemperature = dht.readTemperature();

E para salvar no registrador:

regs[SENSOR_TEMPERATURA] = DHTtemperature;

Infelizmente quando abro o ScadaBR não aparece nada até mesmo a parte da programação que estava funcionando, para totalmente e quando comento esses dois códigos ela volta a funcionar.

Alguém teria alguma ideia do porque não está funcionando ou alguma alternativa que possa fazer em minha programação!?

Agradeço a atenção e o apoio de todos!
Obrigado!
William Maldonado

Mostrar o código é o primeiro passo para obter ajuda...

Segue código completo:

#include "DHT.h"
/* DEFINIÇÃO DE CONEXÕES E PARÂMETROS */
/* CONFIGURAÇÃO  */
#define NUM_SAMPLES 50
#define DHTTYPE DHT22
//DEFINIÇÃO DE PINOS DE LEITURA DIGITAL
#define RTC_DIGITAL 2
#define DHTPIN 3

void configure_mb_slave(long baud, char parity, char txenpin);
int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);

/* PARÂMETROS MODBUS RTU DE COMUNICAÇÃO, O MESTRE E OS ESCRAVOS DEVEM USAR OS MESMOS PARÂMETROS */
enum {
 COMM_BPS = 9600, /* BAUD RATE */
 MB_SLAVE = 1, /* ENDEREÇO DO ESCRAVO MODBUS */
 PARITY = 'n', /* PARIDADE */
 TXEN = 0 /* DEFINIÇÃO DO PINO USADO PARA COLOCAR O DRIVER */
};
/* DEFINIÇÃO ORDENADA DE TODOS OS REGISTROS DE LEITURA E ESCRITA DA COMUNICAÇÃO ENTRE O MESTRE E O ESCRAVO (SCADA E ARDUINO) */
enum { 
 SENSOR_UMIDADE, /* REGISTRADOR DO SENSOR DE LUMINOSIDADE */
 SENSOR_TEMPERATURA, /* REGISTRADOR DO SENSOR DE TEMPERATURA */
 MB_REGS /* NUMERO TOTAL DE REGISTRO DO ESCRAVO */
};
int regs[MB_REGS]; /* MAPA MODBUS DO SLAVE */
void setup() 
{
 /* CONFIGURAÇÃO DA COMUNICAÇÃO MODBUS: 9600 BPS, 8N1, RS485 NETWORK */
 configure_mb_slave(COMM_BPS, PARITY, TXEN);
 dht.begin();
}
void loop() 
{
/* VERIFICA SE HÁ SOLICITAÇÃO DO MESTRE - PARA TODOS OS SLAVES*/
  update_mb_slave(MB_SLAVE, regs, MB_REGS);
// PROGRAMAÇÃO DE COLETA DE DADOS DE UMIDADE
    DHT dht(DHTPIN, DHTTYPE);
    float DHThumidity = dht.readHumidity();
    regs[SENSOR_UMIDADE] = DHThumidity ;
// PROGRAMAÇÃO DE COLETA DE DADOS DE TEMPERATURA    
    int DHTtemperature = dht.readTemperature();
    regs[SENSOR_TEMPERATURA] = DHTtemperature;
}

Obrigado

Segue código completo:
De certeza que esta aqui todo o código é que não vejo onde estao as funçoes referente a estes prototypes:
void configure_mb_slave(long baud, char parity, char txenpin);
int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);

De certeza que esta aqui todo o código é que não vejo onde estao as funçoes referente a estes prototypes:
void configure_mb_slave(long baud, char parity, char txenpin);
int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);

Boa tarde,

Acabei esquecendo de comentar que o resto do código é a configuração de pacotes do Modbus, e não coloquei pois excede o limite de caracteres da mensagem, estou anexando um arquivo com a programação completa ok!?

Obrigado,
William

SENSOR_DE_TEMPERATURA.txt (16.7 KB)

E isto já funcionou?

Eu vejo o problema óbvio de passares um float para um int.
Também vejo o problema de criares um array de inteiros com o membro dum enum... Sabes o que o enum faz?

O primeiro excerto de código não é igual ao código completo.

Qual foi o exemplo que funcionou? Que mudança fizeste?

Já funcionou quando recebia os dados na porta serial do Arduino, mas quando passei a envia-los através de registradores por Modbus para o ScadaBR ler, parou de funcionar.

Antes de usar o DHT22 para enviar a temperatura e umidade eu usei uma fonte do laboratório apenas para ler valores de 0 a 5V para testar a configuração do Modbus, e consegui comunicação e resultado sem ter problemas, mas quando comecei a usar o DHT aconteceu isso.

Tentei mudar os valores de int para float e mesmo assim não deu certo, e então tentei de uma outra maneira, abrindo uma função apenas para a leitura do sensor, da seguinte maneira:

Leitura da temperatura:

float TEMPERATURA(){
  DHT dht(DHTPIN, DHTTYPE);
  DHTtemperature = dht.readTemperature();
  return DHTtemperature;
}

Escrita da temperatura no registrador:

TEMPERATURA();
regs[SENSOR_TEMPERATURA] = DHTtemperature;

Quando fiz isso funcionou apenas por uma vez, o ScadaBR mostrou o valor uma vez depois de 2s ele some e não mostra mais, como se da primeira vez que ele chamasse a função desse certo e então dava erro na sequencia. (Imagem em anexo)

TEMPERATURA_SCADABR.png

Boa noite Pessoal!

Tentei algumas outras alternativas após a dica do float que o bubulindo me forneceu e consegui fazer funcionar, para isso separei em blocos e para cada ação eu chamo um bloco específico para realiza-la, segue abaixo a programação resumida:

#include "DHT.h"
/* DEFINIÇÃO DE CONEXÕES E PARÂMETROS */
/* CONFIGURAÇÃO  */
#define NUM_SAMPLES 50
#define DHTTYPE DHT22
//DEFINIÇÃO DE PINOS DE LEITURA DIGITAL
#define DHTPIN 3
DHT dht(DHTPIN, DHTTYPE);

void configure_mb_slave(long baud, char parity, char txenpin);
int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);

/* PARÂMETROS MODBUS RTU DE COMUNICAÇÃO, O MESTRE E OS ESCRAVOS DEVEM USAR OS MESMOS PARÂMETROS */
enum {
 COMM_BPS = 9600, /* BAUD RATE */
 MB_SLAVE = 1, /* ENDEREÇO DO ESCRAVO MODBUS */
 PARITY = 'n', /* PARIDADE */
 TXEN = 0 /* DEFINIÇÃO DO PINO USADO PARA COLOCAR O DRIVER */
};
/* DEFINIÇÃO ORDENADA DE TODOS OS REGISTROS DE LEITURA E ESCRITA DA COMUNICAÇÃO ENTRE O MESTRE E O ESCRAVO (SCADA E ARDUINO) */
enum { 
 SENSOR_UMIDADE, /* REGISTRADOR DO SENSOR DE LUMINOSIDADE */
 SENSOR_TEMPERATURA, /* REGISTRADOR DO SENSOR DE TEMPERATURA */
 MB_REGS /* NUMERO TOTAL DE REGISTRO DO ESCRAVO */
};
int regs[MB_REGS]; /* MAPA MODBUS DO SLAVE */

enum enum_estado{
  INICIO,
  ES_TEMPERATURA,
  ES_UMIDADE,
} ESTADO;

void setup() 
{
 /* CONFIGURAÇÃO DA COMUNICAÇÃO MODBUS: 9600 BPS, 8N1, RS485 NETWORK */
 configure_mb_slave(COMM_BPS, PARITY, TXEN);
}
void loop() 
{
  switch(ESTADO) {
  case ES_TEMPERATURA: {
     BLOCO_TEMPERATURA();
     break;
    }
    case ES_UMIDADE: {
     BLOCO_UMIDADE();
     break;   
  }  
/* VERIFICA SE HÁ SOLICITAÇÃO DO MESTRE - PARA TODOS OS SLAVES*/
  update_mb_slave(MB_SLAVE, regs, MB_REGS);
} 
}
void BLOCO_INICIO(){
  ESTADO = ES_TEMPERATURA;
}
void BLOCO_TEMPERATURA(){
  float DHTtemperature = 0;
  DHTtemperature = dht.readTemperature();
  float TEMP = DHTtemperature * 10;
  regs[SENSOR_TEMPERATURA]= TEMP;
  ESTADO = ES_UMIDADE;
}
void BLOCO_UMIDADE(){
  float DHThumidity;
  DHThumidity = dht.readHumidity();
  float UMID = DHThumidity * 10;
  regs[SENSOR_UMIDADE]= UMID;
  ESTADO = INICIO;
}

Em anexo coloquei a programação completa com a programação do Modbus e com comentários.

Agradeço a ajuda e colaboração de todos!
Obrigado,
William Maldonado

SENSOR_DE_TEMPERATURA.txt (17.9 KB)

Coloca como resolvido no cabeçalho, por favor.