Termostato con arduino

Hola, estoy elaborando un trabajo con arduino y llevo ya bastante tiempo trabajando en el.
Con una app creada en appinventor2 envio y recibo datos de mi placa arduino uno. El problema es que al activar el servo, el sensor de temperatura lee datos erróneos de vez en cuando y esto me rompe el sistema. El código es bastante extenso y no lo he copiado de nadie.
He pensado en que la misma placa elimine las lecturas erróneas comparándolas con las anteriores, pero no se como hacerlo y no encuentro ningún lugar a donde se explique.
Espero que me puedan ayudar.
Gracias.

long temperatura;
long diferencia;
long julios;
char val=0;
int temp;
const int litros=1;
#include <Servo.h>
Servo servo;
const int pulsoMin = 650; //0
const int pulsoMax = 2500; //180
int angulo;
int valor;
int brillo;

void setup() {
Serial.begin(9600);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(11,OUTPUT);
servo.attach(4,pulsoMin,pulsoMax);
}

void loop() {
temp = analogRead(5);
temperatura = abs(round(5temp100/1023L));
delay(500);
servo.write(0);

Serial.print(temperatura);
Serial.println("");

if(Serial.available()){
// valor = analogRead(5);
// angulo = map(valor, 0, 500, 0, 180);
val=Serial.read();
}

if(val==‘0’){ //oºC
diferencia=0;
julios=(4180litrosdiferencia);
analogWrite(5,0);
analogWrite(6,0);
servo.write(0);
delay(15);
}
if(val==‘1’){ //5ºC
diferencia=(5-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);

}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘2’){ //1oºC
diferencia=(10-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
//brillo = map(julios, 0, 188100, 0, 255);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘3’){ //15ºC
diferencia=(15-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘4’){ //2oºC
diferencia=(20-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘5’){ //25ºC
diferencia=(25-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘6’){ //3oºC
diferencia=(30-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘7’){ //35ºC
diferencia=(35-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘8’){ //4oºC
diferencia=(40-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘9’){ //45ºC
diferencia=(45-temperatura);
if(diferencia>0){
julios=(4180litrosdiferencia);
}
else{
julios=0;
}
angulo = (julios/1045);
brillo = (julios/737.65);
analogWrite(5,brillo);
analogWrite(6,-brillo);
servo.write(angulo);
delay(15);
}
if(val==‘a’){
analogWrite(11, 255);
}
if(val==‘b’){
analogWrite(11, 0);
}
}

Y cuales son las lecturas erróneas, pon ejemplos que expliquen mejor tu programa.

De paso lee las normas del foro y usa etiquetas para insertar los códigos. Edita tu post#1.

He reescrito tu programa.
Veamos como se comporta

Intenta dar precisiones de cuales son los errores ya que elprograma compila bien

#include <Servo.h>


const byte PinTemp = 5;
Servo servo;
const int pulsoMin = 650; //0
const int pulsoMax = 2500; //180
int angulo;
int valor;
int brillo;

float temperatura;
float diferencia;
float julios;
char  val = 0;

const int litros=1;

void calc_diferencia(char t){
    byte temp = t - '0';

    if (temp == 0) {
		diferencia	= 0;
	  	julios 		= 0; 
	  	analogWrite(5,0);
	  	analogWrite(6,0);
	  	servo.write(0);
	  	delay(15);
	}
	else 
		if (temp < 10) {
			diferencia = temp*5.0 - temperatura;
		  	if (diferencia >0 ){
		  		julios = 4180.0*litros*diferencia; 
		  	}
		  	else{
		  		julios = 0;
		  	}
		  	angulo = (int) (julios/1045.0);
		  	brillo = (int) (julios/737.65);

		  	analogWrite(5, brillo);
		  	analogWrite(6,-brillo);
		  	servo.write(angulo);
		  	delay(15);
		}
	
	if (t == 'a') {
	  	analogWrite(11, 255);
	} 
	
	if (t == 'b') {
	  	analogWrite(11, 0);
	}
}


void setup() {
	Serial.begin(9600);
	pinMode(5,OUTPUT);
	pinMode(6,OUTPUT);
	pinMode(11,OUTPUT);
	servo.attach(4,pulsoMin,pulsoMax);
}

void loop() {
	
	temperatura = 500*analogRead(PinTemp)/1023;
	delay(500);
	servo.write(0);

	Serial.print(temperatura);
	Serial.println("");

	if (Serial.available()){
 		// valor = analogRead(5);
		//  angulo = map(valor, 0, 500, 0, 180); 
		val = Serial.read();
	}
	calc_diferencia(val);

}

Respondiendo a tu pregunta, deberías tomar un promedio de valores de temperaturas. Construye una matriz de un indice (vector ). y almacena las temperatura en el ultimo indice. Al producirse una nueva medición tienes que desplazar todos los valores y almacenar la ultima medición. y luego promediar todos los valores de la matriz. Cuanto mas valores tomes, mas insensible sera tu sistema a pequeños cambios(inercia).

Saludos .

Un sistema que sirve para descartar ademas de los pequeños errores, los grandes es leer X veces y hacer la media, luego comparas cada valor con la media y si la diferencia es superior a por ejemplo 1º los descartas

finalmente con los valores no descartados, vuelves a hacer la media

hola

usa un sensor de temperatura como el ds18b20, es muy fiable, no da errores de temperatura. solo cuando lees rapidamente al encenderlo. en este caso leo diez valores, los descarto y me quedo con el siguiente que ya es correcto.

el dth22 es este sensor mas humedad.

saludos