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)
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.