Controlador de temperatura

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

  1. Sempre ligado, em que a resistência de aquecimento estará sempre ligada
  2. 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
  3. Sempre desligado, em que a resistência estará sempre desligada
  4. Configuração de temperatura que permite definir a temperatura de referência

O sistema terá 3 botões de pressão

  1. 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.

  2. 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.

  3. 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;
}
}
}