Controle de temperatura com ds18b20 e relés (RESOLVIDO)

Boa tarde pessoal,  gostaria de pedir a ajuda dos garagista para um problema que estou tendo no controle de temperatura das caixas de abelhas do meu irmão. Foram instaladas em 4 caixas, 4 sensores ds18b20 e 4 reles para ligar resistências. Tambem, dentro das caixas há sensores dht-11. Os sensores ds18b20 fazem o controle de temperatura no interior das caixas, ligando e desligando as resistências e os dht-11 só monitoração. Fizemos a implementação com o scadabr via modbus ip, onde acompanhamos as indicações de temperatura e status dos relés. Ainda não colocamos em operação porque estamos fazendo testes e um problema que surgiu é com relação a falha no ds-18b20. Estes sensores são de controle das resistências e caso haja algum problema com eles, as resistências não devem ligar. Como teste, desconecto o cabo de dados referente aos 4 sensores e a temperatura que tenho no scadabr é 0. Coloquei no skecth para que caso isso ocorra, a saída para o rele deva ser low, mas não esta dando certo. Quando desligo o fio de dados dos sensores ds18b20, todas as saídas dos reles vão para 1 ligando as resistencias. Caso haja uma falha no cabo dos sensores, as resistências ficariam ligadas direto. Gostaria de ver se alguém pode dar uma olhada nos anexos e me dar uma ajuda. Estou colocando em anexo o code que fiz, print da tela do scadabr com as indicações em 0 e as saídas para os reles em 1, as indicações normalizadas e a saida para os reles em zero. Tambem dei um print da tela do serial monitor onde coloquei o arduino e monitorei a saida de temperatura com o cabo desconectado via serial. Desde já agradeço a todos.

Exibições: 610

Anexos

Responder esta

Respostas a este tópico

Olá.

Só um chute:

em:

"if( DS18B20_1 <= 0 || DS18B20_1 == -127 )
{
Mb.R[20] = 1000;
}
else
{
Mb.R[20] = DS18B20_1 * 100;// registro datapoint 19 Scadabr
}"

Vc não estaria atribuindo 10°C ao leitor em caso de falha ? Não seriam 99.99°C como fez no outro sensor ?

Digo baseado no fato de vc colocar a leutura *100 do sensor na variável. Não lembro agora mas a leitura já vem em graus.

Bom dia Eduardo,

Verifiquei a leitura do sensor em caso de falha de comunicação que a indicação vai para 0.00 C, no monitor serial. A ideia seria que a indicação no ScadaBR subisse para 100 C, pois seria um valor que a resistência nunca iria chegar.

Como aqui em Curitiba pode chegar a 0 C, escolhi esse valor de 100 C. Essa parte do código refere-se somente a indicação para o ScadaBR ( registrador Mb.R[20] ), onde se houvesse falha a indicação subisse para 100 C ou caso não estivesse em falha indicasse a temperatura x 100 ( no ScadaBR coloquei o multiplicador em 0,01 para aumentar a resolução da indicação).

Ja a parte do  código que faria o controle seria essa:

"if ( DS18B20_1 < set_liga_DS && DS18B20_1 > 0.00 )
{
digitalWrite (pin_rele_cx01,HIGH);
}

if ( DS18B20_1 >= set_desl_DS || DS18B20_1 <= 0.00 || DS18B20_1 == -127 ) 
{
digitalWrite (pin_rele_cx01,LOW);
}

Status_Rele_cx01 = digitalRead(pin_rele_cx01);

Mb.R[29] = Status_Rele_cx01;"

caso ele entrasse em falha, a indicação na variável DS18B20_1 seria 0.00 fazendo com que a indicação no registrador Mb.R[20] fosse para 100 C no ScadaBR mas fazendo com que a saída para o rele fosse para 0, visto que a condição para desligar o rele é :

DS18B20_1 >= set_desl_DS || DS18B20_1 <= 0.00 || DS18B20_1 == -127 ).

Acrescentei também a condição de a temperatura estar maior que 0.00 para acionar o relé, mas mesmo assim, esta acionando indevidamente.

Minha Ideia seria essa. Agora não sei, Sera que a indicação do registrador pode estar interferindo? 

Ok Eduardo vamos fazer os testes, mas desde ja agradeço a ajuda.

Ahhh

Enfim, ta confuso, deveria funcionar.

Primeira coisa:

Observe a precedência das contas. O || é feito antes da comparação ou depois ???

Tente:

((DS18B20_1 >= set_desl_DS) || (DS18B20_1 <= 0.00) || (DS18B20_1 == -127.0 ))
Confira se tão todos float. Sempre que comparar float com constante se certifique que a constante seja float tb (coloque o ".0" no final).

Veja se vai.

Tb -127 é menor que 0. Nem precisa comparar <=0 e depois <=-127.0

Olá Eduardo, fiz as alterações mas não obtivemos sucesso. Removi as operações 

((DS18B20_1 >= set_desl_DS) || (DS18B20_1 <= 0.00) || (DS18B20_1 == -127.0 ))

ficando somente (DS18B20_1 >= set_desl_DS || DS18B20_1 <= 0.00). Quando entram em falha os ds18b20, as indicações no ScadaBR vão a 0.00 e a saida para os reles vão para 1. Realmente não estou conseguindo ver o por que os relés energizam na falha.

Em anexo o code alterado. teste_modbus_ide_1_0_5.ino

Tente:

((DS18B20_1 >= set_desl_DS ) || (DS18B20_1 <= 1.00))

Pode ser que vc veja 0 mas o numero acumulado seja 0.00000000000000001 por ex.

Aih não é 0.000000000000000000 

Use a serial para debugar.

Por ex:

if (DS18B20_1 >= set_desl_DS ) serial.write('V') else serial.write('F');

if ((DS18B20_1 <= 1.00) ) serial.write('V') else serial.write('F');

serial.println(DS18B20_1)

Bom dia Eduardo,

Agora mesmo estava analisando a biblioteca dallas e encontrei isso:

// returns temperature in 1/128 degrees C or DEVICE_DISCONNECTED_RAW if the
// device's scratch pad cannot be read successfully.
// the numeric value of DEVICE_DISCONNECTED_RAW is defined in
// DallasTemperature.h. It is a large negative number outside the
// operating range of the device

1/128 = 0,0078125

Essa é a ultima biblioteca dallas, e não é a que estou usando, mas pintou esta duvida, que o valor poderia ser um numero muito pequeno, próximo de zero mas maior que zero, exatamente como você passou. Estou fazendo as alterações no code e fazer os teste. Ai posto o resultado. Valeu Eduardo

Bom dia Eduardo, dando o feedback que realmente esse era o problema. Foi alterado para temperatura menor que 1 grau e tudo funcionou corretamente. Certeza que a indicação não era 0 e sim 0,000000001!!!!

Muito obrigado pela ajuda.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço