no me sale: termometro y fotoresistor

muy buenas, me presento: me llamo Montesinos y llevo muy poco tiempo con esto del Arduino, mis conocimientos de electrónica son medios y de programación casi nulos.

Como para mi esto por ahora solo es una manera de entretenerme y aprender, pues voy a mi ritmo, autodidacta.

Mirad, lo que pretendo es aprender un poco sobre las salidas PWM de arduino UNO y sobre la gestión de dos sensores analógicos, entonces se me ha ocurrido hacer un proyecto que decida por mí si tengo frío, estoy a gustito o tengo calor, y además también pretendía que decidiera por mí si la habitación está suficienteme a oscuras para encender una "luz piloto" o mantenerla apagada, para ello he montado el siguiente esquema:

un led RGB, conectado a las salidas 3, 5 y 6 en él deberia ver si tengo frio o no.
un led estandar conectado a la salida 11, en él debería ver si hay poca luz o no.
un termometro LM35 conectado a 5V, la entrada A0 y Ground
un fotoresistor conectado a A5, 5V(con una resitencia de 10k) y GND
también pretendia leer las indicaciones de temperatura y luz en el monitor serial.

He creado este sketch:

 /* Se trata de una lámpara creada a través de un led RGB, que varirá su color en función de la temperatura de su alrededor.
 así si está en un entorno frío se encenderá azul, si está en un entorno cálido su luz será verde y si está en un entorno muy caluroso, rojo,
 además se la ha añadido un segundo led, monocolor, que asociado a un fotoresistor nos dirá si es de día o no, así si el led está apagado habrá
 mucha luz, y si está encendido será porque las condiciones lumínicas son bajas */

int R = 3;                  //designamos el pin 3 para iluminar la parte roja
int V = 5;                  //designamos el pin 6 para iluminar la parte verde
int A = 6;                  //designamos el pin 5 para iluminar la parte azul 
int led = 11;               //led piloto, indicador del día o la noche.
int termometro = A0;        //designamos la entrada del termometro en la entrada analogica A0
int fotoresistor = A5;      //designamos la entrada del fotoresistor en la entrada analogica A5

float voltageluz;      //se usa como float, con él podremos hacer cálculos usando el voltage dado por el fotoresistor
float voltage;         //se usa como float, con él el valor voltage del termometro podrá ser tomado para cálculos
int Ro, Ve, Az, Le;     //iniciamos Ro, Ve, Az y Le para hacer cálculos al final del skecht
int temperatura;        //iniciamos la variable temperatura
int color;              //iniciamos la variable color para referirse a la intensidad lumínica

void setup() {       
  Serial.begin(9600);      //lo primero es empezar la comunicacion del puerto serie en 9600 baudios
  pinMode(R, OUTPUT);    
  pinMode(V, OUTPUT);      //los pines R, V, A y led decimos que son de salida, no hace falta decir que el fotoresistor y el termómetro, es 
  pinMode(A, OUTPUT);      //entrada porque la placa lo considera ya pin de entrada analogico
  pinMode(led, OUTPUT);
}

void loop() {
  voltage = analogRead(termometro) * (5.0 / 1023.0);  //como al principio designamos el valor voltage, del termometro aqui le damos el valor que tomará
  temperatura= (voltage - 0.500) * 100.0;             // con el valor voltage podemos calcular la temperatura que hace 
  voltageluz = analogRead(fotoresistor) * (5.0/1023)*100; //hacemos lo mismo con el valor voltageluz para la intensidad luminica
  color=map(voltageluz, 0, 5000, 0, 1279);            //mapeamos la salida del voltageluz para trabajar con ella, entre 0 y 1280
 

  if(0<=temperatura && temperatura<23.09){             //si el valor temperatura está entre 0 y 23,09 (condiciones de frío) debe hacer que....  
    //Color entre rojo y amarillo
    Ro=0;
    Ve=0;                                              //...la variables Ro y Ve se vayan a 0 y Az a 255, es decir, el led será azul
    Az=255;
  }
  else if(23.1<=temperatura && temperatura<26.4999999999999999999){      //si el valor temperatura está entre 23,1 y 26,49 entonces....
     
    Ro=0;
    Ve=255;                                                              //las variables Ro y Az se irán a 0 y Ve a 255, luz verde
    Az=0;
  }
  else if(26.5<=temperatura && temperatura<128.0){     //si el valor temperatura se va entre 26,5 y 128.0 (cañpr) deberían...
    
    Ro=255;
    Ve=0;                                              //irse las variables Ve y Az a 0, quedandose Ro a 255, rojo fuego.
    Az=0;
  }
 
  if(85.5<=color && color<128.0){                     //además si la intensidad luminica fuera baja, entonces se debería encender el Led
    Le=255;
  }
  else if(0<=color && color<85.4){                    // y si fueran altas debería apagarse
    Le=0;
  }

  analogWrite(R, Ro);               //como los pines 3, 5 y 6 son PWM, se entiende que 255 es máxima intensidad y 0 apagado...
  analogWrite(V, Ve);               //y asociamos R con la variable Ro, V con la Ve y A con la Az y Le con led
  analogWrite(A, Az); 
  analogWrite(led, Le);

  
  Serial.println("========================================================================================");
  Serial.print("voltaje:");
  Serial.print(voltage);
  Serial.print("  ");
  Serial.print("temperatura:");
  Serial.print(temperatura);                
  Serial.print("                ");
  Serial.print("rojo:");
  Serial.print(Ro);
  Serial.print("  ");
  Serial.print("verde:");
  Serial.print(Ve);
  Serial.print("  ");
  Serial.print("Azul");
  Serial.println(Az);  
  Serial.print("                           condiciones de luz:");
  Serial.print(color);
  Serial.print("                      ");
  Serial.print("luz piloto:");
  Serial.println(Le);
  Serial.println("=======================================================================================");
  delay(1000);                       
}

pues bien, tengo los siguientes problemas que me gustaría depurar y no sé por donde tirar:

1-no creo que tenga muy bien la información de la temperatura, creo que no es muy fiable, también me gustaría verla con al menos un decimal.
2-no siempre funciona el led que deberia indicar si es de día o de noche y cuando lo hace afecta a la lectura del temometro.

Gracias por vuestra ayuda de antemano

algo he avanzado, como veía que al voltaje de salida del termómetro le afectaba que el led de la luz piloto se encendiera o se apagara, me he dado cuenta de que ese led no tenia una resitencia previa conectada :~, se la he montado y ya parece que funciona correctamente, al menos no fluctúa tanto la lectura del voltaje de salida del termómetro. Aclarar que las patillas RGB si tienen cada una su resistencia (3.3k).

De todas formas me gustaría que el valor temperatura y color se tomaran con respecto a una media, de 10 medidias o 20, pq de vez en cuando el led de la temperatura se ilumina en azul o rojo.

Puedes hacer un array de enteros donde almacenarlas y cuando esté lleno calculas la media, en cada iteración del bucle loop no cambiará sino cada 10 o 20, depende del tamaño del array pero a 16 mhz... no lo vas a notar(es como un delay(10) o delay(20)

Un array(por si no lo sabes) es un conjunto de variables, por ejemplo:

int array[9] son 10 variables del tipo int (se cuenta el 0) y para acceder a cada una de ellas es tan simple como esto: array[0](para la primera) array[1] (para la segunda, etc)

la ventaja de esto es que puedes usar un bucle for o un bucle while(o el loop en este caso), sustituyendo el numero array[x] por una variable X que se incrementa en cada iteración del bucle permitiendote así recorrer el array de forma automatica.

Si tienes alguna duda pregunta :wink: