DS18B20 + Buzzer, digam de vossa justiça :)

amigos, ja consegui colocar a mostrar 2 temperaturas no LCD 16x2, e caso suba dos 23º ou baixe dos 20º "toca" o alarme. :slight_smile:

gostava da vossa ajuda, a ver se o codigo esta direito assim, ou se podia ser melhorado por favor.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int tempAlarmPin = 22;    //Buzzer ligado no PIN 22
#define ONE_WIRE_BUS 28 //Sensores ligados no PIN 28
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Endereços sensores
DeviceAddress insideThermometer = { 0x28, 0x0C, 0x0D, 0xB0, 0x04, 0x00, 0x00, 0x80 };
DeviceAddress outsideThermometer = { 0x28, 0x49, 0x04, 0xB1, 0x04, 0x00, 0x00, 0x62 };

void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);

pinMode(tempAlarmPin, OUTPUT);    //Buzzer

lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
lcd.print("C");

}
if ( (tempC) >= 23) //Temp superior a 23 Graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);
    }
    else if ( (tempC) <= 20) //Temp inferior a 20 graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);

    }
}

void loop(void)
{ 
delay(2000);
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("AGUA: ");
printTemperature(insideThermometer);
lcd.setCursor(0,1);
lcd.print("FORA: ");
printTemperature(outsideThermometer);
}

Boas novamente,

com este codigo tudo funciona perfeitamente.

Agora queria a vossa ajuda no seguinte:
O alarme apenas necessita de tocar caso a temperatura da agua esteja acima ou abaixo do definido, neste momento toca em relaçao as duas temperaturas.

como faço para que seja apenas de uma?

cumprimentos

Podes dentro da condição if substituir a variável que verifica a temperatura dos dois sensores por:

float tempA = sensors.getTempC(insideThermometer);

if ( (tempA) >= 23){
...
}

Boas amigo,

ao fazer dessa maneira, da-me as duas temperaturas iguais. :frowning:

cumprimentos

Boas

Ja li e tornei a ler o teu post e fiquei sem perceber o que querias ... podias trocar isso por miúdos ...

Ja agora para ti a temperatura definida é 23 ou 20 graus ?

tucandroid:
O alarme apenas necessita de tocar caso a temperatura da agua esteja acima ou abaixo do definido, neste momento toca em relaçao as duas temperaturas.

como faço para que seja apenas de uma?

boas tretas,

para começar, este topico foi a pedir ajuda a ver se o codigo estava bem assim, mesmo a funcionar, pudia ser necessario trocar algo que eu nao saiba, hoje aproveitei o mesmo topico para pedir ajuda no seguinte,
quero que o alarme toque apenas quando a temperatura sobe dos 23º ou baixa dos 20º, neste momento consigo fazer isso, mas em relaçao as duas temperaturas, no entanto apenas me interessa a interior, queria que o alarme so toca-se quando a temperatura interior subi-se dos 23º ou baixa-se dos 20º

percebes amigo?

Fiz algumas alterações de modo a tocares o alarme independentemente da escrita no lcd, penso que resultará
senão peço que me corrijam. :smiley:

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
lcd.print("C");
}
}

void alarm(DeviceAddress deviceAddress){
float tempA = sensors.getTempC(deviceAddress);
if ( (tempA) >= 23) //Temp superior a 23 Graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);
    }
    else if ( (tempA) <= 20) //Temp inferior a 20 graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);

    }
}

void loop(void)
{ 
delay(2000);
sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("AGUA: ");
printTemperature(insideThermometer);
alarm(insideThermometer);
lcd.setCursor(0,1);
lcd.print("FORA: ");
printTemperature(outsideThermometer);
}

obrigado ineto, realmente assim apenas toca o alarme em caso da temperatura interior sair dos parametros. :slight_smile: