[SOLUCIONADO] Conectar interruptor palanca

Hola,

tengo montado un prototipo para encender y apagar leds; con un botón enciendo o apago conjuntamente dos leds, otro botón para otros dos y un ultimo botón que hace lo mismo para un ultimo led, cada grupo de leds hace una cosa, el primer grupo se queda fijo o se apaga, el segundo parpadean o se apagan y el ultimo led hace un fade in-fade out continuo o se apaga.

Hasta aquí todo funciona, pero quiero cambiar los botones por interruptores de estos que tienen una palanquita (toggle switch).

Dejo una foto de uno parecido a los que tengo: |500x500

Los leds están con configurados con resistencias pull-down.

He probado a conectarlos como tengo los pulsadores, pero para encender o apagar tengo que subir la palanca y luego bajarla por lo que queda siempre en la misma posición, la idea es que con la palanca hacia abajo este apagado y hacia arriba encendido cada grupo de leds.

Soy nuevo en este mundo...

No se si es cuestión de hardware solamente o también de software, por lo que pego el código.

byte pinBotonNav = 3;
byte pinLedNavG = 4;
byte pinLedNavR = 5;

byte pinBotonStb = 8;
byte pinLedStbIzq = 9;
byte pinLedStbDch = 10;

byte pinBotonBcn = 12;
byte pinLedBcn = 11;


void setup(){

  pinMode(pinBotonNav, INPUT);
  pinMode(pinLedNavG, OUTPUT);
  pinMode(pinLedNavR, OUTPUT);

  pinMode(pinBotonStb, INPUT);
  pinMode(pinLedStbIzq, OUTPUT);
  pinMode(pinLedStbDch, OUTPUT);
  
  pinMode(pinBotonBcn, INPUT);

  Serial.begin(9600);

}

void loop(){
    
  monitor_estado_pulsador_nav();

  monitor_estado_pulsador_stb();

  monitor_estado_pulsador_bcn();
}

void monitor_estado_pulsador_nav(){

  boolean pulEnav = pulsacionEncendidoNav(pinBotonNav);
  delay(10); //Para evitar el efecto rebote.
  
  if (pulEnav == true){
    digitalWrite(pinLedNavG, HIGH);
    digitalWrite(pinLedNavR, HIGH);
  }else{
    digitalWrite(pinLedNavG, LOW);
    digitalWrite(pinLedNavR, LOW);
  }
}

void monitor_estado_pulsador_stb(){

  boolean pulEstb = pulsacionEncendidoStb(pinBotonStb);
  delay(10); //Para evitar el efecto rebote.
  
  if (pulEstb == true){
    parpadear();
  }else{
    digitalWrite(pinLedStbIzq, LOW);
    digitalWrite(pinLedStbDch, LOW);
  }
}

void monitor_estado_pulsador_bcn(){

  boolean pulEstb = pulsacionEncendidoBcn(pinBotonBcn);
  delay(10); //Para evitar el efecto rebote.
  
  if (pulEstb == true){
    beacon();
  }else{
    digitalWrite(pinLedBcn, LOW);
  }
}

boolean pulsacionEncendidoNav(byte pinBotonNav){
  static boolean estadoUltimo = 0;
  static int contador = 0;
  boolean estadoActual;

  estadoActual = digitalRead(pinBotonNav);
  if(estadoActual != estadoUltimo){
    if(estadoActual == HIGH){
      if(contador % 2 == 0){
        Serial.print('1');
      }else{
        Serial.print('0');
      }
      contador++;
    }
  }

  estadoUltimo = estadoActual;

  if(contador % 2 == 0){
    return false;
  }else{
    return true;
  }
}

boolean pulsacionEncendidoStb(byte pinBotonStb){
  static boolean estadoUltimo = 0;
  static int contador = 0;
  boolean estadoActual;

  estadoActual = digitalRead(pinBotonStb);
  if(estadoActual != estadoUltimo){
    if(estadoActual == HIGH){
      if(contador % 2 == 0){
        Serial.print('1');
      }else{
        Serial.print('0');
      }
      contador++;
    }
  }

  estadoUltimo = estadoActual;

  if(contador % 2 == 0){
    return false;
  }else{
    return true;
  }
}

boolean pulsacionEncendidoBcn(byte pinBotonBcn){
  static boolean estadoUltimo = 0;
  static int contador = 0;
  boolean estadoActual;

  estadoActual = digitalRead(pinBotonBcn);
  if(estadoActual != estadoUltimo){
    if(estadoActual == HIGH){
      if(contador % 2 == 0){
        Serial.print('1');
      }else{
        Serial.print('0');
      }
      contador++;
    }
  }

  estadoUltimo = estadoActual;

  if(contador % 2 == 0){
    return false;
  }else{
    return true;
  }
}

void parpadear(){
    static boolean estadoLed = LOW;
    static unsigned long tUCambioLed = 0;
    unsigned long intervalo = 50;
    unsigned long tActual = millis();

    if(tActual - tUCambioLed >= intervalo){
          tUCambioLed = tActual;

          if(estadoLed == LOW){
              estadoLed = HIGH;
          } else {
              estadoLed = LOW;
          }
          digitalWrite(pinLedStbIzq, estadoLed);
          digitalWrite(pinLedStbDch, estadoLed);
      }  
}

void beacon(){
    int value;
    int periode = 2000;
    int displace = 500;
    long time=0;

    time = millis();
    value = 128+127*cos(2*PI/periode*time);
    analogWrite(pinLedBcn, value);           // sets the value (range from 0 to 255)  

}

Gracias por vuestro tiempo!

Un saludo, Jose.

yo creo que te estas complicando la vida. ¿no te sirve algo como lo siguiente? (es solo un ejemplo simbólico que no funciona tal como está)

if entrada2=HIGH
{
salida 3 and salida 4= ON
}
else
{
salida 3 and salida 4= OFF
}

Hola efect2000, son pruebas que he ido haciendo sacando información de libros, evitando los delay ya que mi intención es sumarle sensores de temperatura o mover motores, entre otras cosas.

Además mandaré información por el serial que esta leyendo una aplicación que estoy haciendo en processing para que dibuje distintas cosas. Los datos que aparecen ahora en el código, solo ceros y unos, son simplemente de prueba.

Creo que básicamente lo que hago es el pseudocódigo que me propones pero encapsulado.

Por otra parte, me interesa bastante la parte de hardware, y es que no se como hacer para conectar este interruptor y que si está hacia abajo este apagado y hacia arriba encendido, es mi pregunta original, releyendo mi post creo que no habia quedado muy clara mi duda.

Gracias por tu aporte, un saludo!

jcduino: es que no se como hacer para conectar este interruptor y que si está hacia abajo este apagado y hacia arriba encendido

hola, un pulsador es como un interruptor, pero que solo tiene el contacto cerrado (o abierto) mientras se mantiene presión (pulsado) sobre el boton externo. el interruptor que muestras es un "pulsador con enclavamiento", en reposo tiene contacto NO y pulsado NC, tiene un comun y dos conmutados. Ahora bien, por tu pregunta me parece que no sabes electricidad ni electronica, si es así, dilo, porque entonces las respuesta iran encaminadas en un sentido u otro. saludos

Efectivamente, no tengo ni idea de electrónica ni electricidad, únicamente cosas básicas, muy generales de teoría, vamos, lo típico del bachillerato...

Aprovecho para colgar un vídeo con el proyecto.

Saludos y Gracias!

https://www.youtube.com/watch?v=HdSBEfVvntU

como he indicado antes, el interruptor es como un pulsador, tiene un común y dos posiciones. Habitualmente el del medio es el comun y cada uno de los dos extremos es contacto cerrado en una u otra posicion. tal y como está el de la foto que adjuntas, el del medio es el comun y el terminal de la derecha está ahora "unido" al central, si mueves la palanca entonces será el central con el derecho los que estan haciendo contacto. saludos

Hola, creo que me voy haciendo una idea, de hecho he logrando que funcione, pongo una foto de como están las conexiones y el código.

Quiero hacer notar que cuando el interruptor esta hacia abajo están apagadas y cuando está hacia arriba están encendidas.

Además los interruptores no son los de este dibujo, sino iguales a los de la foto que adjunte al principio.

byte pinBotonNav = 8;
byte pinLedNavG = 2;
byte pinLedNavR = 3;

byte pinBotonBcn = 9;
byte pinLedBcn = 4;

byte pinBotonStb = 10;
byte pinLedStbIzq = 5;
byte pinLedStbDch = 6;

byte pinLedPrueba = 13;

boolean estadoUltimo = 0;

void setup(){

    pinMode(pinLedPrueba, OUTPUT);

    pinMode(pinBotonNav, INPUT);
    pinMode(pinLedNavG, OUTPUT);
    pinMode(pinLedNavR, OUTPUT);

    pinMode(pinBotonStb, INPUT);
    pinMode(pinLedStbIzq, OUTPUT);
    pinMode(pinLedStbDch, OUTPUT);

    pinMode(pinBotonBcn, INPUT);

    Serial.begin(9600);

}

void loop(){
    
    monitor_estado_pulsador_nav();

    monitor_estado_pulsador_stb();

    monitor_estado_pulsador_bcn();
}

void monitor_estado_pulsador_nav(){

    boolean estadoActual;

    
    estadoActual = digitalRead(pinBotonNav);
  
    if (estadoActual == HIGH){
        digitalWrite(pinLedNavG, HIGH);
        digitalWrite(pinLedNavR, HIGH);
    } else {
        digitalWrite(pinLedNavG, LOW);
        digitalWrite(pinLedNavR, LOW);
    }

    if(estadoActual != estadoUltimo){
        if(estadoActual == HIGH){
            Serial.print("navOn");
        } else {
            Serial.print("navOff");
        }
    }

    estadoUltimo = estadoActual;
}

void monitor_estado_pulsador_stb(){
    boolean estadoActual;

    estadoActual = digitalRead(pinBotonStb);
    if (estadoActual == HIGH){
        //Serial.print("stbOn");
        parpadear();
    } else {
        //Serial.print("stbOff");
        digitalWrite(pinLedStbIzq, LOW);
        digitalWrite(pinLedStbDch, LOW);
    }
}

void monitor_estado_pulsador_bcn(){

    boolean estadoActual;

    estadoActual = digitalRead(pinBotonBcn);
  
    if (estadoActual == HIGH){
        //Serial.print("bcnOn");
        beacon();
    } else {
        //Serial.print("bcnOff");
        digitalWrite(pinLedBcn, LOW);
    }
}

void parpadear(){
    static boolean estadoLed = LOW;
    static unsigned long tUCambioLed = 0;
    unsigned long intervalo = 50;
    unsigned long tActual = millis();

    if(tActual - tUCambioLed >= intervalo){
          tUCambioLed = tActual;

          if(estadoLed == LOW){
              estadoLed = HIGH;
          } else {
              estadoLed = LOW;
          }
          digitalWrite(pinLedStbIzq, estadoLed);
          digitalWrite(pinLedStbDch, estadoLed);
      }  
}

void beacon(){
    int value;
    int periode = 2000;
    int displace = 500;
    long time = 0;

    time = millis();
    value = 128 + 127 * cos(2*PI / periode*time);
    analogWrite(pinLedBcn, value); // sets the value (range from 0 to 255)  

}

Ahora el problema es que no logro que mande por el serial solo una vez que está encendido o apagado.
La parte del código a la que me refiero es void monitor_estado_pulsador_nav() que es la que estoy utilizando para pruebas.
Además hay una variable global que no me gustan demasiado, que es : boolean estadoUltimo = 0;

Saludos!!

Hola, bueno, creo que esta solucionado. Creo que era un tema de rebote de estos interruptores, porque poniendo un pequeño delay detrás de la lectura va sin problemas y no envia datos por el serial “a lo loco”.

Dejo un vídeo y el código por si alguien quiere hacer algún comentario o tiene algún problema.

byte pinBotonNav = 8;
byte pinLedNavG = 2;
byte pinLedNavR = 3;

byte pinBotonBcn = 9;
byte pinLedBcn = 4;

byte pinBotonStb = 10;
byte pinLedStbIzq = 5;
byte pinLedStbDch = 6;

byte pinLedPrueba = 13;

void setup(){

    pinMode(pinLedPrueba, OUTPUT);

    pinMode(pinBotonNav, INPUT);
    pinMode(pinLedNavG, OUTPUT);
    pinMode(pinLedNavR, OUTPUT);

    pinMode(pinBotonStb, INPUT);
    pinMode(pinLedStbIzq, OUTPUT);
    pinMode(pinLedStbDch, OUTPUT);

    pinMode(pinBotonBcn, INPUT);

    Serial.begin(9600);

}

void loop(){
    
    monitor_estado_pulsador_nav();

    monitor_estado_pulsador_stb();

    monitor_estado_pulsador_bcn();
}

void monitor_estado_pulsador_nav(){
    static boolean estadoUltimo = 0;
    boolean estadoActual;
    
    estadoActual = digitalRead(pinBotonNav);
    delay(30); //Delay para evitar un pequeño efecto rebote que tienen estos interruptores
    if (estadoActual == HIGH){
        digitalWrite(pinLedNavG, HIGH);
        digitalWrite(pinLedNavR, HIGH);
    } else {
        digitalWrite(pinLedNavG, LOW);
        digitalWrite(pinLedNavR, LOW);
    }

    if(estadoActual != estadoUltimo){
        if(estadoActual == HIGH){
            Serial.print("navOn");
        } else {
            Serial.print("navOff");
        }
    }

    estadoUltimo = estadoActual;
}

void monitor_estado_pulsador_stb(){
    static boolean estadoUltimo = 0;
    boolean estadoActual;

    estadoActual = digitalRead(pinBotonStb);
    delay(30); //Delay para evitar un pequeño efecto rebote que tienen estos interruptores
    if (estadoActual == HIGH){
        strobe();
    } else {
        digitalWrite(pinLedStbIzq, LOW);
        digitalWrite(pinLedStbDch, LOW);
    }

    if(estadoActual != estadoUltimo){
        if(estadoActual == HIGH){
            Serial.print("stbOn");
        } else {
            Serial.print("stbOff");
        }
    }

    estadoUltimo = estadoActual;
}

void monitor_estado_pulsador_bcn(){
    static boolean estadoUltimo = 0;
    boolean estadoActual;

    estadoActual = digitalRead(pinBotonBcn);
    delay(30); //Delay para evitar un pequeño efecto rebote que tienen estos interruptores
    if (estadoActual == HIGH){
        beacon();
    } else {
        digitalWrite(pinLedBcn, LOW);
    }

    if(estadoActual != estadoUltimo){
        if(estadoActual == HIGH){
            Serial.print("bcnOn");
        } else {
            Serial.print("bcnOff");
        }
    }

    estadoUltimo = estadoActual;
}

void strobe(){
    static boolean estadoLed = LOW;
    static unsigned long tUCambioLed = 0;
    static int contador = 1;

    unsigned long intervalo = 1;
    unsigned long tActual = millis();

    if((tActual - tUCambioLed >= intervalo)&&(contador<=3)){
          tUCambioLed = tActual;

          if(estadoLed == LOW){
              estadoLed = HIGH;
              contador++; //Suma del contador para saber que ha entrado 
          } else {
              estadoLed = LOW;
          }
          digitalWrite(pinLedStbIzq, estadoLed);
    } else if((tActual - tUCambioLed >= intervalo)&&(contador>3)&&(contador<=6)){
          tUCambioLed = tActual;

          if(estadoLed == LOW){
              estadoLed = HIGH;
              contador++; //Suma del contador para saber que ha entrado 
          } else {
              estadoLed = LOW;
          }
          digitalWrite(pinLedStbDch, estadoLed);
          digitalWrite(pinLedStbIzq, LOW);
    } else if((tActual - tUCambioLed >= intervalo)&&(contador>6)&&(contador<=15)){
          tUCambioLed = tActual;

          if(estadoLed == LOW){
              estadoLed = HIGH;
              contador++; //Suma del contador para saber que ha entrado 
          } else {
              estadoLed = LOW;
          }
          //digitalWrite(pinLedPrueba, estadoLed);
          digitalWrite(pinLedStbIzq, LOW);
          digitalWrite(pinLedStbDch, LOW);
    } else if (contador>15){
        contador = 1;
    }
}

void beacon(){
    int value;
    int periode = 2000;
    int displace = 500;
    long time = 0;

    time = millis();
    value = 128 + 127 * cos(2*PI / periode*time);
    analogWrite(pinLedBcn, value); // sets the value (range from 0 to 255)  

}

Pongo el tema como resuelto.

Gracias y un saludo!!