Problemas con proyecto

Buenas, dispongo de una pantalla LCD nokia 3310 para arduino en la cual necesito desarrollar un pequeño menú donde pueda por un lado ver los valores de humedad, temperatura e iluminación (cosa que ya he conseguido), y por otro lado poder establecer los puntos de consigna para esas variables anteriores.

Necesito que me guíen un poco en como poder terminar de hacer el menú de la pantalla y como introducir esos tres valores independientemente para los puntos de consigna.

Gracias.

Buenas, iria bien que pusieras aquí tu código para echarte una mano, y por otra parte, ser mas preciso en lo que necesitas

#include <LCD5110_Graph.h>
#include <Keypad.h>
#include <DHT11.h>

////////////////PANTALLA LCD//////////////////
//      CLK  - Pin 28
//      Din - Pin 27
//      DC   - Pin 26
//      CE   - Pin 25
//      RST  - Pin 24
 int LDR;
 int LM35;
 int opc;
 int opci;
 float tempe;
 float milivol;
 int valor;
 int luz;
 int hume;
 float hum;
 float temp;
 
LCD5110 myGLCD(28,27,26,24,25);
extern unsigned char MediumNumbers[];
extern unsigned char BigNumbers[];
extern unsigned char SmallFont[];
extern unsigned char TinyFont[];
int contrast = 60;
int inv=0;

 //////ILUMINACION//////////
const long A = 1000;     //Resistencia en oscuridad KO
const int B = 15;        //Resistencia a la luz (10 Lux) KO
const int Rc = 10;       //Resistencia calibracion KO
int ilum; 

///////////////TECLADO//////////////////
const byte Filas = 4;     //Cuatro filas
const byte Cols = 4;    //Cuatro columnas

byte Pins_Filas[] = {47, 46, 45, 44};  //Pines Arduino a los que contamos las filas.
byte Pins_Cols[] = { 43, 42, 41, 40};   // Pines Arduino a los que contamos las columnas.
char Teclas [ Filas ][ Cols ] = 
{
  {'D','C','B','A'},
  {'#','9','6','3'},
  {'0','8','5','2'},
  {'*','7','4','1'}
};
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

DHT11 dht11(5);

void setup()
{
 
  Serial.begin(9600);
  myGLCD.InitLCD(contrast);

}
///////LUZ////////////
float lectura_ldr()
{
  LDR=analogRead(A0);
  LDR=analogRead(A0);
  LDR=analogRead(A0);
  LDR=analogRead(A0);
  ilum = ((long)(1024-LDR)*A*10)/((long)B*Rc*LDR);
  return ilum;
}
/////////////TEMPERATURA////////////////
  float lectura_lm35()
  {
  valor = analogRead(A7);
  milivol = (valor / 1023.0) * 5000;
  LM35 = milivol / 10;
  return LM35;
  }
///////////////HUMEDAD//////////////////
  float lectura_dht11()
  {
  dht11.read(hum,temp);
  return hum;
  }
//////////////////////////////////////
 
void loop()
{
  tempe=lectura_lm35();
  luz=lectura_ldr();
  hume=lectura_dht11();

  
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("ORNYCLEAN",CENTER,0);
  myGLCD.print("A) Temperatura",0,15);
  myGLCD.print("B) Humedad",0,25);
  myGLCD.print("C) Iluminacion",0,35);
  myGLCD.update();
   
 switch(Teclado.getKey()){
    case'A':
      do{
      tempe=lectura_lm35();
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("Temperatura",CENTER,5);
      myGLCD.setFont(BigNumbers);
      myGLCD.printNumI((tempe),CENTER,20);
      myGLCD.update();
      delay(500);}
      while(Teclado.getKey() != '#');
      myGLCD.clrScr();
      break;
  case'B':
      do{
      hume=lectura_dht11();  
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("Humedad",CENTER,5);
      myGLCD.setFont(BigNumbers);
      myGLCD.printNumI((hume),CENTER,20);
      myGLCD.update();
      delay(500);}
      while(Teclado.getKey() != '#');
      myGLCD.clrScr();
      break;
  case'C':
      do{
      luz=lectura_ldr();  
      myGLCD.clrScr();
      myGLCD.setFont(SmallFont);
      myGLCD.print("Iluminacion",CENTER,5);
      myGLCD.setFont(BigNumbers);
      myGLCD.printNumI((luz),CENTER,20);
      myGLCD.update();
      delay(1000);}
      while(Teclado.getKey() != '#');
      myGLCD.clrScr();
      break;
 }
}

Ese es mi codigo actual, con el que consigo mostrar las tres variables. Lo que necesito es ampliar ese menu para tener otros tres apartados en los que poder introducir los setpoints para esas variables. Tambien me seria de ayuda como poder introducir esos setpoint a traves de un teclado numerico y que queden guardados en arduino para trabajar con ellos.

Para introducir valores tienes varias opciones,

Una opción es lo que comentas, leer del teclado (busca en google teclado + arduino, hay infinitos ejemplos), imprimirlo en la LCD para ver qué estás introduciendo y simultaneamente al darle aceptar guardar ese valor en una variable.

Otra opción es mediante pulsadores que vaya incrementando la variable de 1 en 1 o como quieras (como hacen los botones de cambio de hora de un reloj)

También puedes mandarle los datos por puerto serie (RS232, bluetooth, WiFi....)

Mi duda es a la hora de mostrar varios numeros en la pantallas introducidos por el teclado y luego enviar ese numero de dos o tres digitos a arduino

Lo que tienes que haces es ir metiendolos en una variable tal y como los vas leyendo del teclado. y representando esa variable en la LCD. como vas leyendo carater a caracter lo que tendrás que hacer si te llega un 2 o 3 número es multiplicar el valor actual por 10 y sumarle el nuevo número.

Un saludo!

Entiendo, me podrías ayudar un poco con el código en el que vaya guardando dígito por dígito?

Desconozco que libreria utilizas para el teclado pero te voy a exponer un análogo a lo que se haría por puerto serie y ya lo extrapolas al teclado que será similar.

char caracter;
int valor;
char numero = 0;

if (Serial.available()>0)
{
    if (numero == 0)
    {
        caracter = Serial.read() - 48; // le restamos 48 por ser código ASCCI, así conseguimos el valor 
                                                       numérico
        valor = caracter;
        numero ++;
    }
    else 
    {
        caracter = Serial.read() - 48; // le restamos 48 por ser código ASCCI, así conseguimos el valor 
                                                       numérico
        valor = (valor*10) + caracter;
        numero ++;
    }
}
else
{
    numero = 0;
}

algo de este estilo, revísalo conla librería que coja datos del teclado

Un saludo!

Para el teclado estoy usando la libreria:

#include <Keypad.h>

La parte del "Serial.available()" la tendria que sustituir??

Y otra duda... no consigo sacar por pantalla lo introducido por el teclado, este es el codigo que estoy probando:

void loop(){
  char key = Teclado.getKey();
  if(key){
  myGLCD.setFont(SmallFont);
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key),CENTER,20);
  myGLCD.update();*/
 // Serial.println(key);
  }
}

la variable "key" la he probado como char y como int y sigue sin mostrarmelo correctamente
La libreria de la pantalla es: #include <LCD5110_Graph.h>

Lo ultimo ya está resuelto, ya me lo muestra correctamente. Lo que necesito es que se me muestre numeros de dos o tres digitos, por ejemplo, el 58 cuando marco el 8 me borra el 5 y solo muestra 8 por pantalla

Vamos por partes,

Primero, si todo lo que esta en el Serial.Available tienes que "traducirlo" con la libreria keypad.h

Segundo, si descomentas el Serial.println te lo saca bien por puerto serie? si es así el problema lo tienes con el manejo de la LCD y no con el teclado.

Tercero, al hacerlo con el teclado tendrás que utilizar una de las teclas para aceptar la orden, para saber que ya has terminado de introducir números.

char key = Teclado.getKey();
if(key)
{
    if (key = '#')   //Tecla para finalizar la inserción de numeros
    {
        numero = 0;
    }
    if (numero ==0)
    {
        valor = key;
    }
    else
    {
        valor = (valor*10) + key;
    }
}

Algo así, dale una vuelta. En cuanto a la LCD no te se decir no he trabajado con esa LCD ni librería pero si con el println se saca por el serial el valor de la tecla el problema lo tienes en el manejo de la LCD.

De todos modos, pon el código completo para ver las inicializaciones del teclado también no vaya a ser que esté ahí el error.

También puedes probar, aunque esto no debería ser el problema a sustituir:

if (key)

por

if (key != 0)

Un saludo!

De momento he conseguido, con ayuda de tu codigo anterior, desarrollar este. De momento me lo muestro todo correcto por pantalla y puedo enviarlo al puerto serie (que seria el que usaria para guardar en los setpoint que necesito).

#include <LCD5110_Graph.h>
#include <Keypad.h>

LCD5110 myGLCD(28,27,26,24,25);
extern unsigned char MediumNumbers[];
extern unsigned char BigNumbers[];
extern unsigned char SmallFont[];
extern unsigned char TinyFont[];
int contrast = 60;
int inv=0;

const byte Filas = 4;     //Cuatro filas
const byte Cols = 4;    //Cuatro columnas

byte Pins_Filas[] = {47, 46, 45, 44};  //Pines Arduino a los que contamos las filas.
byte Pins_Cols[] = { 43, 42, 41, 40};   // Pines Arduino a los que contamos las columnas.
char Teclas [ Filas ][ Cols ] = 
{
  {'D','C','B','A'},
  {'#','9','6','3'},
  {'0','8','5','2'},
  {'*','7','4','1'}
};

Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

int numero=0;
int valor=0;
int key1,key2,key3;

void setup()
{
 
  Serial.begin(9600);
  myGLCD.InitLCD(contrast);

}

void loop(){

  if(numero==0){
  key1=Teclado.getKey();
  if(key1){
  myGLCD.setFont(SmallFont);
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==1){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(SmallFont);
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(SmallFont);
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valor=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    Serial.println(valor);
    myGLCD.update();
    numero,key1,key2,key3=0;
  }
}

Creo que esa parte queda mas o menos solucionada, mi otro problema viene al ampliar el menu de la pantalla que quiero.

Mi propuesta es que crees varias funciones, cada función que represente una pantalla de LCD (lo que vas a mostrar vamos) y crees una función maestra que gestione la LCD pasando las pantallas que se precise.

El cambio entre pantallas lo puedes hacer por tiempo o mediante la pulsación de algún botón, eso ya a gustos.

Pseudo-Código

pantalla1:
LCD.print("T = xxº   H = xx%")
LCD.print("L= xx lumenes")

Pantalla2 :
LCD.print("T deseada: ")
LCD.print(valorObtenidoDelTeclado);

Pantalla3 :
LCD.print("H deseada: ")
LCD.print(valorObtenidoDelTeclado);


Pantalla4 :
LCD.print("L deseada: ")
LCD.print(valorObtenidoDelTeclado);


GestionarLCD:

//por ejemplo con un boton
if (pindelboton && boton <4)
{
   boton ++;
}
else if (pindelboton && boton >3)
{
    boton =0;
}

if  (boton == 0)
{
    Pantalla1
}
else if (boton == 1)
{
    Pantalla2
}
else if (boton == 2)
{
    Pantalla3
}
else if (boton == 3)
{
    Pantalla4
}

Algo así, miralo, dale un vuelta y ya me dirás.

Un saludo!

Este es el codigo que he sacado a partir del tuyo, pero no me funciona, ¿ves algunos fallos?

#include <LCD5110_Graph.h>
#include <Keypad.h>
#include <DHT11.h>

////////////////PANTALLA LCD//////////////////
//      CLK  - Pin 28
//      Din - Pin 27
//      DC   - Pin 26
//      CE   - Pin 25
//      RST  - Pin 24
 int LDR;
 int LM35;
 int opc;
 int opci;
 float tempe;
 float milivol;
 int valor;
 int luz;
 int hume;
 float hum;
 float temp;
 int pinboton=8;
 int boton=0;
 
LCD5110 myGLCD(28,27,26,24,25);
extern unsigned char MediumNumbers[];
extern unsigned char BigNumbers[];
extern unsigned char SmallFont[];
extern unsigned char TinyFont[];
int contrast = 60;
int inv=0;

 //////ILUMINACION//////////
const long A = 1000;     //Resistencia en oscuridad KO
const int B = 15;        //Resistencia a la luz (10 Lux) KO
const int Rc = 10;       //Resistencia calibracion KO
int ilum; 

///////////////TECLADO//////////////////
const byte Filas = 4;     //Cuatro filas
const byte Cols = 4;    //Cuatro columnas

byte Pins_Filas[] = {47, 46, 45, 44};  //Pines Arduino a los que contamos las filas.
byte Pins_Cols[] = { 43, 42, 41, 40};   // Pines Arduino a los que contamos las columnas.
char Teclas [ Filas ][ Cols ] = 
{
  {'D','C','B','A'},
  {'#','9','6','3'},
  {'0','8','5','2'},
  {'*','7','4','1'}
};
Keypad Teclado = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);

DHT11 dht11(5);

int numero=0;
int valtemp,valhum,valluz=0;
int key1,key2,key3;

void setup()
{
 
  Serial.begin(9600);
  myGLCD.InitLCD(contrast);

}
////////////////////////////////
void pantalla1(){ 
  myGLCD.setFont(SmallFont);
  myGLCD.print("ORNYCLEAN",CENTER,0);
  myGLCD.print("T=   C",0,15);
  myGLCD.print("H=   %",0,25);
  myGLCD.print("L=    lumenes",0,35);
  myGLCD.print("20",15,15);
  myGLCD.print("30",15,25);
  myGLCD.print("308",15,35);
  myGLCD.update();
}
//////////TEMPERATURA////////////
//int recibir_temperatura()
int pantalla2(){
  myGLCD.setFont(SmallFont);
  myGLCD.print("TEMPERATURA",CENTER,5);
  myGLCD.update();
  
  if(numero==0){
  key1=Teclado.getKey();
  if(key1){  
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==1){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valor=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    Serial.println(valtemp);
    myGLCD.update();
    numero,key1,key2,key3=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update(); 
  }
  return valtemp;
}
//////////HUMEDAD////////////////
//int recibir_humedad()
int pantalla3(){
  myGLCD.setFont(SmallFont);
  myGLCD.print("HUMEDAD",CENTER,5);
  myGLCD.update();
  
  if(numero==0){
  key1=Teclado.getKey();
  if(key1){  
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==1){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valor=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    Serial.println(valhum);
    myGLCD.update();
    numero,key1,key2,key3=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update(); 
  }
  return valhum;
}
///////////////ILUMINACION//////////////////
//int recibir_iluminacion()
int pantalla4(){
   myGLCD.setFont(SmallFont);
  myGLCD.print("ILUMINACION",CENTER,5);
  myGLCD.update();
  
  if(numero==0){
  key1=Teclado.getKey();
  if(key1){  
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==1){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valor=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    Serial.println(valluz);
    myGLCD.update();
    numero,key1,key2,key3=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update(); 
  }
  return valluz;
}
//////////////////////////////////////
 
void loop(){
if (pinboton && boton <4)
{
   boton ++;
}
else if (pinboton && boton >3)
{
    boton =0;
}

if  (boton == 0)
{
    pantalla1();
}
else if (boton == 1)
{
    pantalla2();
}
else if (boton == 2)
{
    pantalla3();
}
else if (boton == 3)
{
    pantalla4();
}

Así a ojo lo único que veo es que en todas las funciones de pantalla tienes que cambiar la variable valor, por la que corresponda valtemp, valhum, valluz....

Por lo demás no he visto así nada raro, te funciona? En cuanto a los comandos de la librería de la LCD ya ni idea que no la he utilizado así que ahí no te se decir, pero por lo que he ido viendo parece tener sentido.

lo del los botones con el if _(se que te lo puse así yo) igual queda más limpio con un switch, pero vamos eso ya son detalles menores.

Un saludo!

Antes de nada agradecerte toda la ayuda que me estas dando!

Me di cuenta de lo de los valores y lo corregí y le he seguido añadiendo cosas y me funciona todo, lo unico que cuando recibo los datos no terminan de ser correctos, por ejemplo, cuando tapo la LDR para que me varien los lumenes tambien me varia la temperatura... esa es la unica pega que tengo de momento.

#include <LCD5110_Graph.h>
#include <Keypad.h>
#include <DHT11.h>

 int LDR;
 int LM35;
 float milivol;
 int valor;
 float luz;
 int sp_luz;
 float hum;
 int sp_hum;
 float temp;
 int sp_temp;
 int pinboton=50;
 int boton=0;
 int salida;
 int confirm;

 int ventilador=10;
 int leds=11;
 int extractor=12;
 int humificador=13;

float hume;
float tempe;

int numero=0;
int valtemp,valhum,valluz=0;
int key1,key2,key3;

int y0;
float y;
float k;

void setup()
{
 
  Serial.begin(9600);
  myGLCD.InitLCD(contrast);
  pinMode(pinboton,INPUT);
  pinMode(ventilador,OUTPUT);
  pinMode(leds,OUTPUT);
  pinMode(humificador,OUTPUT);
  pinMode(extractor,OUTPUT);

  k=-1;
  y0=127;

  //Consignas predefinidas
  sp_temp=25;
  sp_hum=30;
  sp_luz=400;
}
////////////RECIBIR_TEMPERATURA//////////////
  float lectura_lm35()
  {
  valor = analogRead(A7);
  milivol = (valor / 1023.0) * 5000;
  LM35 = milivol / 10;
  delay(50);
  return LM35;
  }
////////////RECIBIR_HUMEDAD//////////////
  float lectura_dht11()
  {
  dht11.read(hume,tempe);
  delay(50);
  return hume;
  }
////////////RECIBIR_ILUMINACION//////////////
float lectura_ldr()
{
  LDR=analogRead(A0);
  LDR=analogRead(A0);
  LDR=analogRead(A0);
 // ilum = ((long)(1024-LDR)*A*10)/((long)B*Rc*LDR);
  delay(50);
  return LDR;
}
//////////////MENU_PRINCIPAL/////////////////
void pantalla1(){
  temp=lectura_lm35();
  hum=lectura_dht11();
  luz=lectura_ldr();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("ORNYCLEAN",CENTER,0);
  myGLCD.drawLine(0,10,83,10);
  myGLCD.print("T=   C",0,15);
  myGLCD.print("H=   %",0,25);
  myGLCD.print("L=    lumenes",0,35);
  myGLCD.printNumI((temp),15,15);
  myGLCD.printNumI((hum),15,25);
  myGLCD.printNumI((luz),15,35);
  myGLCD.update();
}
/////////////MENU_CONSIGNAS///////////////
void pantalla2(){
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("CONSIGNAS",CENTER,0);
  myGLCD.drawLine(0,10,83,10);
  myGLCD.print("T=   C",0,15);
  myGLCD.print("H=   %",0,25);
  myGLCD.print("L=    lumenes",0,35);
  myGLCD.printNumI((sp_temp),15,15);
  myGLCD.printNumI((sp_hum),15,25);
  myGLCD.printNumI((sp_luz),15,35);
  myGLCD.update();
}
//////////ENVIAR_TEMPERATURA////////////
//int recibir_temperatura()
int pantalla3(){
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("TEMPERATURA",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.print("Pulse A para",CENTER,18);
  myGLCD.print("introducir",CENTER,28);
  myGLCD.print("valor",CENTER,38);
  myGLCD.update();

  if(numero==0){
  confirm=Teclado.getKey();
  if(confirm=='A'){
  numero++;
  salida=0;
  myGLCD.clrScr();
  myGLCD.update();}
  }
  myGLCD.setFont(SmallFont);
  myGLCD.print("TEMPERATURA",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.update();
  do{
  if(numero==1){
  key1=Teclado.getKey();
  if(key1){  
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==3){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valtemp=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    //Serial.println(valtemp);
    myGLCD.update();
    numero,key1,key2,key3=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update();
    salida++;
    numero=0;
  }
  }while(salida==0 && numero!=0);
  return valtemp;
}
//////////ENVIAR_HUMEDAD////////////////
//int recibir_humedad()
int pantalla4(){
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("HUMEDAD",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.print("Pulse A para",CENTER,18);
  myGLCD.print("introducir",CENTER,28);
  myGLCD.print("valor",CENTER,38);
  myGLCD.update();

  if(numero==0){
  confirm=Teclado.getKey();
  if(confirm=='A'){
  numero++;
  salida=0;
  myGLCD.clrScr();
  myGLCD.update();}
  }
  myGLCD.setFont(SmallFont);
  myGLCD.print("HUMEDAD",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.update();
  do{
  if(numero==1){
  key1=Teclado.getKey();
  if(key1){  
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==3){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valhum=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    //Serial.println(valhum);
    myGLCD.update();
    numero,key1,key2,key3=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update();
    salida++;
    numero=0;
  }
  }while(salida==0 && numero!=0); 
  return valhum;
}
///////////////ENVIAR_ILUMINACION//////////////////
//int recibir_iluminacion()
int pantalla5(){
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("ILUMINACION",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.print("Pulse A para",CENTER,18);
  myGLCD.print("introducir",CENTER,28);
  myGLCD.print("valor",CENTER,38);
  myGLCD.update();

  if(numero==0){
  confirm=Teclado.getKey();
  if(confirm=='A'){
  numero++;
  salida=0;
  myGLCD.clrScr();
  myGLCD.update();}
  }
  myGLCD.setFont(SmallFont);
  myGLCD.print("ILUMINACION",CENTER,5);
  myGLCD.drawLine(0,13,83,13);
  myGLCD.update();
  do{
  if(numero==1){
  key1=Teclado.getKey();
  if(key1){  
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key1-48),20,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==2){
  key2=Teclado.getKey();
  if(key2){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key2-48),35,20);
  myGLCD.update();
  numero++;  }
  }
  if(numero==3){
  key3=Teclado.getKey();
  if(key3){
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI((key3-48),50,20);
  myGLCD.update();
  numero++;  }
  }
  if(Teclado.getKey()=='*'){
    valluz=(((key1-48)*100)+((key2-48)*10)+(key3-48));
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("GUARDADO",CENTER,20);
    //Serial.println(valluz);
    myGLCD.update();
    numero,key1,key2,key3=0;
    delay(1500);
    myGLCD.clrScr();
    myGLCD.update(); 
    salida++;
    numero=0;
  }
  }while(salida==0 && numero!=0);
  return valluz;
}
//////////CONTROL_PANTALLA///////////
void control_pantalla(){
if (digitalRead(pinboton)==HIGH && boton <5)
{
   boton ++;
}
else if (pinboton && boton >4)
{
    boton =0;
}

if  (boton == 0)
{
    pantalla1();
}
else if (boton == 1)
{
    pantalla2();   
}
else if (boton == 2)
{
    sp_temp=pantalla3();   
}
else if (boton == 3)
{
    sp_hum=pantalla4();
}
else if (boton == 4)
{
    sp_luz=pantalla5();
}
delay(100);
}
///////////CONTROL_VENTILADOR//////////////
void control_ventilador(){
if(temp <= sp_temp){
  digitalWrite(ventilador,LOW);
}
else if(temp > sp_temp){
  digitalWrite(ventilador,HIGH);
}
}
/////////////CONTROL_LUCES//////////////
void control_luces(){
  y=y0+k*(sp_luz - luz);
  y=constrain(y,0,255);
  analogWrite(leds,y);
}
////////////CONTROL_HUMEDAD//////////////
void control_humedad(){
  if(hum < sp_hum){
    digitalWrite(humificador,HIGH);
    digitalWrite(extractor,LOW);
  }
  if(hum > sp_hum){
    digitalWrite(humificador,LOW);
    digitalWrite(extractor,HIGH);
  }
}
/////////////////////////////////
void loop(){
control_pantalla();
//control_ventilador();
//control_luces();
//control_humedad();
Serial.print(boton);
}

Si te fijas en las tres lecturas que hago, hay unos delay(50), con la idea de estabilizar un poco cada lectura pero nada.

Suprimo algunas partes para que quepa el mensaje xD

Pon condensadores de filtrado a las entradas analógicas, lo único que se me ocurre es que al acercar la mano o lo que sea para tapar la LDR estés causando interferencias electromagnéticas y de ahí te cambie el valor del LM.

Un saludo!