Gracias Noter y Surbyte por vuestra respuesta, la velocidad del incremento de temperatura viene marcado por la potencia del calentador.
Eso para el proyecto debe ser transparente, si tarda 5min o una hora, no es significativo para el proyecto.
La intención es que una vez alcanzado el grado de temperatura que debe subir, tarde lo que tarde, se mantenga una hora a esa temperatura, y luego suba otro grado.
Os pongo el código para que veáis lo que tengo hecho hasta ahora, que es solo, control de temperatura.
Seguro que el código es mejorable, pero es lo que he podido hacer con mis conocimientos.
//TERMOSTATO ACUARIO CON LM35
//CONTROLA LA TEMPERATURA DEL AGUA Y ACTIVA O DESACTIVA UN RELE PARA SALIDA DE CALENTADOR
//MEMORIZA EN EEPROM LA TEMPERATURA OBJETIVO A MANTENER
// 30/3/2018 SI LA TEMPERATURA BAJA DE 24 O SUBE DE 31 SALTA UN BUZZER. SE PUEDE SILENCIAR EL BUZZER Y APARECE UN * INDICANDO QUE LA ALARMA ESTA DESABILITADA
// Incluir el código de la biblioteca:
#include <LiquidCrystal.h>
// Inicializa la biblioteca con las conexiones a los pins del interface Arduino:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include<EEPROM.h>
// Patillas y variables globales
int sensor=A0; // Sensor en entrada analógica pin A0
int modo=6; // Pulsador Memo pin 6
int adj=7; //Pulsador de ajuste pin 7
int led=1; // LED de salida pin 1
int buzzer=8; //Buzzer alarma
float valorSensor=0; // Variable con el contenido de la entrada analógica A0
float termo=0; // Variable con el valor real de temperatura
int pulsa1=0; // Variable con estado de pin 6
int pulsa2=0; // Variable con estado de pin 7
int temp_memo; // Variable para guardar el valor de temperatura objetivo
float temp; // Variable de conmutación del relé (LED Rojo)
int flag=0; //Bandera para desactivar buzzer buzzer=LOW
// Subprograma de alarma
void alarma()// Suena alarma
{
digitalWrite(buzzer,HIGH);
delay(50);
digitalWrite(buzzer,LOW);
delay(50);
digitalWrite(buzzer,HIGH);
delay(50);
digitalWrite(buzzer,LOW);
}// Fin Subprograma de alarma
// Subprograma de temperatura
void temperatura()// Control de temperatura. Ajuste de umbral
{
pulsa1=0;
digitalWrite(buzzer,HIGH);
delay(100);
digitalWrite(buzzer,LOW);
while(pulsa1 == LOW) // Umbral de conmutación del relé (LED Rojo)
{
delay(1000);
pulsa1 = digitalRead(modo);
pulsa2 = digitalRead(adj);
if (pulsa2 == HIGH)
{
temp = temp + 1; // Incrementos de grados
}
if ((temp < 24) or (temp > 31))
{
temp = 24;
}
lcd.setCursor(5,0);
lcd.print("AJUSTE");
lcd.setCursor(3,1);
lcd.print("TEMP:");
lcd.print(temp);
lcd.blink();
}
lcd.clear();
lcd.setCursor(2,1);
lcd.noBlink();
lcd.print(temp);
lcd.print(" Grados");
delay(1000);
lcd.setCursor(1,1);
lcd.print("TEMP MEMORIZADA");
temp_memo=temp*100;
EEPROM.put(0,temp_memo);
delay(1000);
} // Fin Subprograma de temperatura
// Inicialización del programa
void setup()
{
lcd.begin(16, 2);
lcd.setCursor(2, 0);
lcd.print("TERMOSTATO");
lcd.setCursor(2, 1);
lcd.print("ACUARIO Ver1");
delay(1000);
EEPROM.get(0,temp_memo);//Leo el valor de la temperatura objetivo ajustada
temp=temp_memo/100;
pinMode(modo,INPUT);
pinMode(adj,INPUT);
pinMode(led,OUTPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer,LOW);
}
void loop() {
pulsa1 = digitalRead(modo);
if (pulsa1 == HIGH)//Pulsador memo
{
temperatura(); //VOY A SUBRUTINA DE TEMPERATURA
}
lcd.setCursor(3,0);
lcd.print("TEMP:");
valorSensor=analogRead(sensor);
termo=(valorSensor / 2);
lcd.print(termo);
if (flag==1)
{
lcd.setCursor(0,0);
lcd.print("*");
}
delay(500);
if (termo < temp)
{
digitalWrite(led,HIGH);
lcd.setCursor(2, 1);
lcd.print("CALENTADOR ON");
delay(500);
}
if (termo >= temp)
{
digitalWrite(led,LOW);
lcd.clear();
}
if (termo < 24)
{
lcd.clear();
lcd.setCursor(3,0);
lcd.print("TEMP:");
lcd.print(termo);
lcd.setCursor(2, 1);
lcd.print("**TEMP LOW**");
if (flag==1)
{
lcd.setCursor(0,0);
lcd.print("*");
}
delay(500);
lcd.clear();
}
pulsa2 = digitalRead(adj);
if (pulsa2 == HIGH)
{
flag=flag+1;
delay(10);
if (flag > 1)
{
flag=0;
}
}
if ((termo <24) && (flag==0)) {alarma();}
if ((termo <24) && (flag==1)) {digitalWrite(buzzer,LOW);}
if ((termo >31) && (flag==0)) {alarma();}
if ((termo >31) && (flag==1)) {digitalWrite(buzzer,LOW);}
if ((termo >=24) && (termo<=31)) {digitalWrite(buzzer,LOW);}
if (termo > 31)
{
lcd.clear();
lcd.setCursor(3,0);
lcd.print("TEMP:");
lcd.print(termo);
lcd.setCursor(2, 1);
lcd.print("*TEMP. HIGH*");
if (flag==1)
{
lcd.setCursor(0,0);
lcd.print("*");
}
delay(500);
lcd.clear();
}
} //Fin