lmeireles43:
Coloquei o comando para o resfriador e o aquacedor logo abaixo do no more adresseses pois achei que travava, porém não é isto que acontece, o relé fica ligando e desligando..... fiz a leitura da entrada como vc falou e ficou perto dos 280 com o sensor desplugado e 1021 com ele plugado... ou seja quando ele fizer a leitura perto dos 280 eu quero que desligue o aquecedor e o resfiador e ligue uma luz de alerta... como fazer isto?
Quando compilas o programa, aparecem alguns warnings? (provavelmente não por causa dos settings do Arduino)
Existe a remota possibilidade de estares a usar a variável float sem inicializares... daí dar problemas.
Eu não tenho a certeza do que é que o return faz dentro da loop, por isso nada como fazer assim:
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
digitalWrite(LED_ERRO, HIGH); //ligar uma luzinha para dar erro...
while (!ds.search(addr) { //enquanto não encontrar o sensor, fica preso aqui a procurar.
ds.reset_search();
delay(250);
}//return;
}
Ou então, uma solução mais "civilizada"...
#include <OneWire.h>
#include <LiquidCrystal.h>
#define Luz_Fundo 6
LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
OneWire ds(A15); // on pin 10
void setup(void) {
Serial.begin(9600);
pinMode(Luz_Fundo,OUTPUT); //define o pino como saída
lcd.begin(16, 2); //inicia o lcd com 2 linhas e 16 colunas
digitalWrite(Luz_Fundo,HIGH); // Liga a luz do display.
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
// return;
} else { //se o sensor estiver bom... corre esta parte do programa.
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data = ds.read();
}
// convert the data to actual temperature
unsigned int raw = (data[1] << | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
lcd.setCursor(0,0);
lcd.print(celsius);
} //fim do else.
}
Como o Hugo disse, ter as variáveis ali por inicializar não é boa prática.
Quanto ao teu controlo de temperatura... se apenas tivesses uma fonte de energia (aquecedor, arrefecedor), o controlo de termostato funcionaria (duvido que fosse óptimo) com uma histerese tão pequena (dependendo onde tens o sensor e onde tens o actuador). No entanto, com duas fontes de energia isso vai provocar fazer com que o sistema descontrole completamente.
Qual é a gama de conforto que os peixes necessitam? Certamente que serão entre 3 a 5 graus, não? Porque não usar essa gama para a tua histerese?
Outra questão:
Qual é em média a temperatura da tua casa? Eu acredito que não tenhas um ar condicionado para arrefecer no verão, já aquecer no Inverno certamente que terás algo que coloque a temperatura da casa acima daqueles 5 que falaste anteriormente. Tens ideia de qual é a temperatura da casa durante o Inverno? Efectivamente esse será o teu limite baixo para o sistema de controlo.
Tu falaste em ventoínhas para arrefecer a água. Que ventoínhas são essas? São ventoínhas de 230V? Ou ventoínhas de 12? Se tiveres ventoínhas de 12V, poderias implementar diferentes controlos para a temperatura da água.
Por exemplo, para aquecer colocar um controlo tipo termostato (on/off) com o relé e resistência e para arrefecer usar um PWM para controlar a ventoínha e podias ver um PID por exemplo...
Isto não são coisas necessárias... apenas ideias para melhorar o sistema.