Go Down

Topic: DHT22 - Arduino Modbus (Read 30 times) previous topic - next topic

wmaldonadojr

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:

Code: [Select]
DHT dht(DHTPIN, DHTTYPE);
float DHTtemperature = dht.readTemperature();

E para salvar no registrador:

Code: [Select]
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

bubulindo

Mostrar o código é o primeiro passo para obter ajuda...
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

wmaldonadojr

Segue código completo:

Code: [Select]
#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

HugoPT

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);
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

HugoPT


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);
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

wmaldonadojr

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

bubulindo

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?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

wmaldonadojr

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:
Code: [Select]
float TEMPERATURA(){
  DHT dht(DHTPIN, DHTTYPE);
  DHTtemperature = dht.readTemperature();
  return DHTtemperature;
}

Escrita da temperatura no registrador:
Code: [Select]
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)

wmaldonadojr

#8
Today at 01:56 am Last Edit: Today at 01:58 am by wmaldonadojr
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:


Code: [Select]
#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

Go Up