Boa noite galera,

To bancando o noob aqui, e pelejando em não ter de recorrer ao uso de interrupções.

Tenho o seguinte problema montei um circuito com um Termistor Dallas 18B20, a temperatura tem sido lida corretamente, fiz tambem no código que um cooler seja acionado ao pressionar um botão. Isso tem funcionado corretamente, porem quero que o cooler seja desligado ao chegar a temperatura por volta de 30 graus e ligue automaticamente caso seja superior a 50 graus.

Bem estou morrendo nesta questão.

Agradeço qualquer ajuda da galera.

Código segue abaixo:

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

#define buttonPin 2
#define coolerPin 13
#define pinTemp 0

#define ONE_WIRE_BUS 10

float val = 0;

boolean lastButton = LOW;
boolean currentButton = LOW;
boolean coolerLigado = true;

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
sensors.begin();
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin,HIGH);
pinMode(coolerPin, OUTPUT);

Serial.begin(9600);
}

boolean debounce(boolean last)
{
boolean current = digitalRead(buttonPin);
if (last != current)
{
delay(5);//Tempo de debounce ajuste conforme necessário

current = digitalRead(buttonPin);

}
return current;
}

void loop()
{
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
coolerLigado = !coolerLigado;
Serial.println("Botao Pressionado");
}
lastButton = currentButton;

digitalWrite(coolerPin, coolerLigado);

sensors.requestTemperatures();
Serial.println(sensors.getTempCByIndex(0));

}

Exibições: 2686

Responder esta

Respostas a este tópico

if (lastButton == LOW && currentButton == HIGH) 

vira

if ((lastButton == LOW && currentButton == HIGH) || (sensors.getTempCByIndex(0) >32 ))

Ou algo assim.

Mas eu colocaria assim:

if (((lastButton == LOW) && (currentButton == HIGH)) || (sensors.getTempCByIndex(0) >32 ))

Acho mais claro, alem de que dependendo do compilador o && é feito primeiro (maior precedencia).

Mas acho que vc poderia chegar a essa conclusão sozinho.. pre não ficar mto fácil pra vc recomendo criar uma variável e colocar nela o valor da temperatura.

Aih vc sempre mostraria e testaria pela variável. Isso elimina a dupla leitura e a possibilidade de mostrar um numero e fazer baseado em outro.

Já fiz desta forma, o problema qua agindo assim se a temperatura estiver alta ele fica a cada nova interação ligando e desligando o motor, ele não simplesmente liga e continua ligado ate a temperatura estabilizar nos padrões definidos.

Por isso creio que terei de fazer o debounce usando interrupções.

Ah, realmente respondi sem nem ver direito a pergunta, desculpe.

Vc quer que ele ligue aos 50 e desligue aos 30.

Então

if (temperatura <= 30) coolerLigado=0;

if (temperatura >= 50) coolerLigado=1;

Se estiver na faixa intermediária mantém o estado anterior.

Veja se é isso... 

Grande Eduardo, é por isso que pedi ajuda as vezes a solução simples esta em nossa frente e não vemos, muito obrigado.

Funcionou perfeitamente.

Muito obrigado.

ENTÃO FICARIA ASSIM

sensors.requestTemperatures();
Serial.println(sensors.getTempCByIndex(0));

}

if (temperatura <= 30) coolerLigado=0;

if (temperatura >= 50) coolerLigado=1;

Vou  precisa de fazer coisa parecida, mas em que parte entra esse codigo do eduardo?

Amigo pode colocar abaixo desta linha:

sensors.requestTemperatures();
Serial.println(sensors.getTempCByIndex(0));

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço