Codigo con LDR, LEDs y pulsadores.

Buenas!!

Tengo este codigo, en el que hay varias acciones. 1 LDR y un LED, 3 Pulsadores y 3 LEDs, y un POTENCIOMETRO y un LED. El caso es que todo separado me funciona, pero cuando lo junto solo me funciona lo de los tres pulsadores y los tres leds. Por ejemplo en las ultimas lineas del codigo esta lo del potenciometro y un led que según giro el potenciometro tiene que aumentar o disminuir el brillo del led. El problema es que cuando junto todo no va, es como si se cruzara. Alguien sabe lo que estoy haciendo mal?

//Control de iluminación - Sala Multiusos

int LED13 = 13;     //El LED esta conectado en el pin 9 
int LDR0 = 0;    //El LDR esta conectador en el pin A0

int luz = 0;       
int valor_sensor = 0;       
int valor_limite = 490;

//Control de Accesos - Sala Multiusos

int pLED_10   = 10;
int pLED_11   = 11;
int pLED_12   = 12;

int pBTN_7  = 7;
int pBTN_8  = 8;
int pBTN_9  = 9;

//Techo solar - Piscina

const int led6 =6;  // led conectado al pin 3
const int pot1 =1; // el pot esta conectado al pin A0
int brillo;  //variable para el brillo

void setup() {      

//Control de iluminación - Sala Multiusos
   
  pinMode(LED13,OUTPUT);
  pinMode(LDR0,INPUT);

//Control de Accesos - Sala Multiusos  

  Serial.begin(9600);
    
  pinMode(pLED_10,   OUTPUT);
    pinMode(pLED_11,   OUTPUT);
    pinMode(pLED_12,   OUTPUT);
    
    pinMode(pBTN_7,  INPUT);
    pinMode(pBTN_8, INPUT);
    pinMode(pBTN_9, INPUT);

 //Techo solar - Piscina

  pinMode (led6, OUTPUT);  // declaramos el led como salida 
  }

void loop () 
{

  valor_sensor = analogRead(LDR0); 
  luz = (5.0 * valor_sensor * 100.0)/1024.0; 
           
  delay(300);                       
  
  if (luz <= valor_limite)   //Si el valor de luz es menor o igual que el valor limite
  {
    digitalWrite (LED13, LOW);  //El led se apaga
  }
  if (luz > valor_limite)   //Si es mayor que el valor limite
  {
    digitalWrite (LED13, HIGH);  //El led se eniende
  }

//Control de Accesos - Sala Multiusos  

    if( digitalRead(pBTN_7) );
    {       
        while( digitalRead(pBTN_7) );
        delay(150);
        
        digitalWrite(pLED_10, HIGH);
        Serial.println("1");
        digitalWrite(pLED_12, LOW);
        digitalWrite(pLED_11, LOW);
    }
    
  
      if( digitalRead(pBTN_8) );
    {       
        while( digitalRead(pBTN_8) );
        delay(150);
        
        digitalWrite(pLED_11, HIGH);
        Serial.println("2");
         digitalWrite(pLED_12, LOW);
         digitalWrite(pLED_10, LOW);
    }
    
      if( digitalRead(pBTN_9) );
    {       
        while( digitalRead(pBTN_9) );
        delay(150);
        
        digitalWrite(pLED_11, LOW);
        Serial.println("ACCESO PERMITIDO");
         digitalWrite(pLED_12, HIGH);
         digitalWrite(pLED_10, LOW);
    }  
 
 brillo = analogRead (pot1) / 4; 
 
  analogWrite(led6, brillo);

}

Moderador: Titulo editado x no reflejar la consulta realizada

yo la verdad nunca he puesto un if asi
if( digitalRead(pBTN_8) );
y no se sea válido (me refiero al ; al final del if),
otro punto que veo es que tienes que "atinarle cuando este leyendo el botón y los estes presionando o dejarlo más tiempo presionado, por que a lo que veo tienes como medio segundo ahi en delays más las transmisiones por puerto COM y eso si que es tardado
Saludos.

 if( digitalRead(pBTN_7) );
    {       
        while( digitalRead(pBTN_7) );  // <= comparto con ArduMyth que esto es raro.. QUTIALO
        delay(150);
        
        digitalWrite(pLED_10, HIGH);
        Serial.println("1");
        digitalWrite(pLED_12, LOW);
        digitalWrite(pLED_11, LOW);
    }

edita por

    if( digitalRead(pBTN_7) )
    {       
               
        digitalWrite(pLED_10, HIGH);
        Serial.println("1");
        digitalWrite(pLED_12, LOW);
        digitalWrite(pLED_11, LOW);
    }

ArduMyth:

  1. while() para lectura de pulsadores.
  2. pulsadores sin debouces (se producen rebotes)
  3. uso de delay() en vez de millis()

Al unir todo eso es normal que no te funcione conjuntamente.

Que es eso de los rebotes? Es el origen del problema?

Es que no entiendo por que si lo hago por separado lo de los botones si y el potenciometro si que me funciona pero lo junto y no va.

Hola, si... el código por separado funciona pero esta mal escrito.

usar una función While.
Hace todo lo que esta dentro del while y hasta que no termina no "escucha" o "lee" botones.

Lo que necesitas hacer es escribir el código de manera que trabaje ininterrumpidamente.

El uso de un "delay" por ejemplo. Detiene todo... no lee botones no nada.

Tienes que escribir el codigo de manera que no bloquee las cosas.
Para cambiar delay por codigo sin bloqueo, pues estan muy claros los ejemplos en el Ide.

timer sin delay o algo asi.

1.- Evita los delays
2.- Evita los whiles
3.- usa una libreria (es mas sencillo) para leer e interpretar los botones.

Te recomiendo esta libreria:

sencilla, rapida y bastante configurable.

Animo y después nos cuentas como vas.

-Alex.