Bom dia.
Estou a tentar implementar o seguinte projecto mas estou a ter alguns problemas alguém me poderá ajudar??
O objectivo é o seguinte:
Fazer um programa de controlo de temperatura que terá quatro modos de
funcionamento
- Sempre ligado, em que a resistência de aquecimento estará sempre ligada
- Automático em que a resistência de aquecimento estará ligada se a temperatura for
menor que a temperatura de referência e desligada se for maior ou igual - Sempre desligado, em que a resistência estará sempre desligada
- Configuração de temperatura que permite definir a temperatura de referência
O sistema terá 3 botões de pressão
-
Botão next. Sempre que for pressionado o modo passa para o modo seguinte (1 para
2, 2 para 3, 3 para 4 e 4 para 1. -
Botão +: se o modo for 4 aumenta em 0.1 graus a temperatura de referência. Se neste
modo for premido durante mais de 1 segundo a temperatura de referência começa a
aumentar 0,1 graus a uma frequência de 10Hz enquanto o botão estiver pressionado.
Se o modo for 1, 2 ou 3 liga a resistência durante 30 segundos. -
Botão -: se o modo for 4 diminui em 0.1 graus a temperatura de referência. Se neste
modo for premido durante mais de 1 segundo a temperatura de referência começa a
diminuir 0,1 graus a uma frequência de 10Hz enquanto o botão estiver pressionado.
Se o modo for 1, 2 ou 3 desliga a resistência durante 30 segundos.
Sempre que for detectado que um botão foi premido num intervalo até 100ms desde a
última vez que esse mesmo botão foi premido e considerado válido, essa detecção deve ser
ignorada.
Para simular a resistência (ligar e desligar, obter temperatura) estou a utilizar o seguinte sketch:
#define TEMPERATURA_AMBIENTE 15 //define a temperatura ambiente. essa será a temperatura atingida quando a resistência estiver muito tempo desligada
#define TEMPERATURA_MAXIMA 30 //define a temperatura máxima que se obtém quando a resistência estiver muito tempo ligada
#define CONSTANTE_TEMPO_SUBIDA 30 //tempo em segundos para a temperatura subir 63,21% do intervalo entre TEMPERATURA_MAXIMA e TEMPERATURA_AMBIENTE, partindo da TEMPERATURA_AMBIENTE
#define CONSTANTE_TEMPO_DESCIDA 60 //tempo em segundos para a temperatura descer 63,21% do intervalo entre TEMPERATURA_MAXIMA e TEMPERATURA_AMBIENTE, partindo da TEMPERATURA_MAXIMA
float temperatura = TEMPERATURA_AMBIENTE; //indica a temperatura atual.
unsigned long tempo_inicio = 0; //indica o tempo em que a resistência foi ligada ou desligada;
float tempo_base = 100000000; //indica o tempo que demorou a atingir a temperatura atual. Inicialmente considera-se que a resistência estava desligada há muito, muito tempo
bool ligada = false; //indica se a resistência está ligada ou desligada. Inicialmente está desligada
unsigned long ti = 0; //variável para controlar o tempo de envio de dados para a porta série
#define TEMPO_PRINT 500 //tempo entre envio de dados para a porta série
void liga_resistencia(bool modo)
{
unsigned long t, t_atual;
t_atual = millis();
t = t_atual - tempo_inicio;
tempo_inicio = t_atual;
if (ligada)
temperatura = TEMPERATURA_MAXIMA - (TEMPERATURA_MAXIMA - TEMPERATURA_AMBIENTE) * exp(-(t + tempo_base) / (CONSTANTE_TEMPO_SUBIDA * 1000.0));
else
temperatura = TEMPERATURA_AMBIENTE + (TEMPERATURA_MAXIMA - TEMPERATURA_AMBIENTE) * exp(-(t + tempo_base) / (CONSTANTE_TEMPO_DESCIDA * 1000.0));
ligada = modo;
if (ligada)
tempo_base = -log(((float)(TEMPERATURA_MAXIMA - temperatura)) / (TEMPERATURA_MAXIMA - TEMPERATURA_AMBIENTE)) * CONSTANTE_TEMPO_SUBIDA * 1000.0;
else
tempo_base = -log(((float)(temperatura - TEMPERATURA_AMBIENTE)) / (TEMPERATURA_MAXIMA - TEMPERATURA_AMBIENTE)) * CONSTANTE_TEMPO_DESCIDA * 1000.0;
}
float get_temperatura()
{
unsigned long t, t_atual;
t_atual = millis();
t = t_atual - tempo_inicio;
if (ligada)
temperatura = TEMPERATURA_MAXIMA - (TEMPERATURA_MAXIMA - TEMPERATURA_AMBIENTE) * exp(-(t + tempo_base) / (CONSTANTE_TEMPO_SUBIDA * 1000.0));
else
temperatura = TEMPERATURA_AMBIENTE + (TEMPERATURA_MAXIMA - TEMPERATURA_AMBIENTE) * exp(-(t + tempo_base) / (CONSTANTE_TEMPO_DESCIDA * 1000.0));
return (round(temperatura * 100) / 100.0);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Temperatura ");
}
void loop() {
char ch; //variável para receber o byte da porta série
if (millis() - ti >= TEMPO_PRINT) {
ti += TEMPO_PRINT;
Serial.println(get_temperatura());
}
if (Serial.available()) { //se há bytes na porta série
ch = Serial.read(); //lê-se o byte para a variável ch
switch (ch) {
case '0': //dígito para desligar a resistência
liga_resistencia(false);
break;
case '1': //digito para ligar a resistência
liga_resistencia(true);
break;
}
}
}