Go Down

Topic: DS18B20 + Buzzer, digam de vossa justiça :) (Read 1 time) previous topic - next topic

tucandroid

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

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

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

tucandroid

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


lneto

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

Code: [Select]

float tempA = sensors.getTempC(insideThermometer);

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


tucandroid

Boas amigo,

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

cumprimentos

tretas

#4
Mar 30, 2013, 07:00 pm Last Edit: Mar 30, 2013, 07:03 pm by tretas Reason: 1
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 ?




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?

Arduino Mega 2560
Arduino Nano
Arduino UNO Rev3
Raspberry PI Model B
EasyPIC v4

tucandroid

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?

lneto

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.  :D

Code: [Select]

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);
}

tucandroid

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



Go Up