Telerruptor en Arduino

Buenas tardes, ante todo, pido disculpas si este no es el apartado adecueado, he estado buscando por todo el foro y no he encontrado nada parecido.
La cuestión es que estoy intentando usar un arduino como controlador del alumbrado de un local. El problema es que consigo activar una salida desde un pulsador y apagarlo desde otro. También mantener una salida activa mientras se acciona un pulsador. Esto normalmente lo he realizado, usando un LOGO, que si que dispone de la opción de rele de impulsos o telerruptor. alguien sabe como programar esto en un Arduino.

Muchas gracias a todos y un saludo.

Espero que esto te sirva el siguiente ejemplo.

Un saludo.

int Pin_pulsador = 8; // Numero del pin en el que se conecta el pulsador al arduino
int Pin_led = 13; // Numero del pin en el que se conecta la salida del led ( o lo que se quiera conectar) al arduino
boolean Telerruptor = false; // Declaramos la variable del telerrupto y la ponemos en fase al arranque del arduino

void setup()
{
pinMode(Pin_pulsador,INPUT); // Declaramos la variable Pin_pulsador como entrada del arduino
pinMode(Pin_led,OUTPUT); // Declaramos la variable Pin_led como salida del arduino
}

void loop()
{
if (digitalRead(Pin_pulsador) == HIGH) // comprobamos si se acciona el pulsador
{
Telerruptor=!Telerruptor; // Invertimos la salida del telerruptos desde la ultima pulsacion
digitalWrite(Pin_led,Telerruptor); // Escribimos en la salida
delay(100); //Realizamos una pausa para evitar los rebotes de la pulsacion
}
}

Buenas noches.

Efectivamente así funciona. Lo que si que es cierto, que con pulsos cortos no funciona correctamente. De todas formas, ya he visto como solucionas el tema y me ha servido de una gran ayuda.

Muchas gracias y un saludo.

Me alegro que te ayude el ejemplo, si quieres realizar pulsaciones muy cortas entre una pulsación y otra te recomiendo que quites o bajes el tiempo del delay, yo lo he puesto como una seguridad por si la pulsación es mas larga de lo normal y a sí evitar que en una pulsación se encienda y se apague.

También te recomiendo nu usar mucho la función delay ya que retrasa el programa, yo suelo usar los millis y realizo unas comparaciones para sacar la pausa deseada.

Un saludo.

Buenas, yo te tenia un ejemplo preparado. te lo pongo también para ser criticado por chapuzero jejeej

int PinPulsador=5;                                       // Entrada que vas a funcionar como un pulsador
int PinConmutador1=6;                                    // Entrada que vas a funcionar como un conmutador
int PinConmutador2=7;                                    // Entrada que vas a funcionar como un conmutador
int PinLuzPulsador=13;                                   // Pin que va a hacer de salida
int PinLuzConmutador=14;                                 // Pin que va a hacer de salida
boolean C1Pulsado=false;                                 // Conmutador 1 pulsado
boolean C2Pulsado=false;                                 // Conmutador 1 pulsado
boolean LuzEncendida=false;                              // Estado de la luz
void setup() 
{
  pinMode(PinPulsador, INPUT);                           // pin del pulsador
  pinMode(PinConmutador1, INPUT);                        // pin del pulsador
  pinMode(PinConmutador2, INPUT);                        // pin del pulsador
  pinMode(PinLuzPulsador, OUTPUT);                       // pin luz pulsador
  pinMode(PinLuzConmutador, OUTPUT);                     // pin luz pulsador
  digitalWrite(PinLuzPulsador, LOW);                     // luz apagado hasta pulsar 
  digitalWrite(PinLuzConmutador, LOW);                   // luz apagado hasta pulsar 
}
void loop() 
{
  // Manejo del pulsador
  digitalWrite(PinLuzPulsador, digitalRead(PinPulsador));// Ponemos en la salida el valor q hay en la entrada                     
  
  
  // Conmutador
  if (digitalRead(PinConmutador1) && !C1Pulsado)          // Si pulsamos conmutador 1 pro primera vez o despues de soltarlo
  {
    C1Pulsado=true;                                       // comnutador 1 pulsado hasta soltarlo
    if (!LuzEncendida)                                    // si la luz no esta encendida
    {
      LuzEncendida=true;                                  // La luz esta encendida
      digitalWrite(PinLuzConmutador, HIGH);               // luz encendida
    }
    // esto sirve para poder apagar desde el mismo que enciende
    else
    {
      LuzEncendida=false;                                 // La luz esta encendida
      digitalWrite(PinLuzConmutador, LOW);                // luz apagada
    }
  }
  if (!digitalRead(PinConmutador1) && C1Pulsado)          // Hemos pulsado y soltado en conmutador 1
  {
    C1Pulsado=false;                                      // comnutador 1 soltado
  }
  
 if (digitalRead(PinConmutador2) && !C2Pulsado)          // Si pulsamos conmutador 2 por primera vez o despues de soltarlo
  {
    C2Pulsado=true;                                      // comnutador 2 pulsado hasta soltarlo
    if (LuzEncendida)                                    // si la luz esta encendida
    {
      LuzEncendida=false;                                // La luz esta apagada
      digitalWrite(PinLuzConmutador, LOW);               // luz apagada
    }
    // esto sirve para poder encender desde el mismo que apaga
    else
    {
      LuzEncendida=true;                                 // La luz esta encendida
      digitalWrite(PinLuzConmutador, HIGH);              // luz encendida
    }
  }
  if (!digitalRead(PinConmutador2) && C2Pulsado)          // Hemos pulsado y soltado en conmutador 2
  {
    C2Pulsado=false;                                      // comnutador 2 soltado
  }
}

tienes algo parecido a un detector de flancos, no se si habra alguna manera mejor de hacerlo

Hola, te adjunto el código que te pase antes modificado, quitando el delay y poniendo un detector de flanco de subida del pulsador, que lo he echo con una memoria, no se si sera lo mejor pero funciona muy bien.

espero que te sirva.

Saludos

PD: si te das cuenta la parte del código la he separado en una función para que quede mas ordenado el código.

Hola. Telerruptor con Grafcet.

//Telerruptor. un pulsador controla un led. pulsas led= on vuelves a pulsar led=off off.
//Lógica positiva.
//se ha montado un circuito rc para evitar el rebote del pulsador
int pulsador=2;
int led=13;
int cnt_etapa=0; //contador de etapas y estado//
void setup(){
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(digitalRead(pulsador)==HIGH&&cnt_etapa==0){
digitalWrite(led,HIGH);
cnt_etapa=1;
}
if(digitalRead(pulsador)==LOW&&cnt_etapa==1){
cnt_etapa=2;
}
if(digitalRead(pulsador)==HIGH && cnt_etapa==2){
digitalWrite(led,LOW);
cnt_etapa=3;
}
if(digitalRead(pulsador)==LOW && cnt_etapa==3){
cnt_etapa=0;
}
Serial.println(cnt_etapa); //puedes dónde está el programa viendo en qué etapa está
}

Ofuscao. Me vas a perdonar, pero ese sketch tuyo es un intermitente que funciona mientras está el pulsador en on. No es un telerruptor ya que no mantiene el enclavamiento.

capdesoca:
Hola. Telerruptor con Grafcet.

//Telerruptor. un pulsador controla un led. pulsas led= on vuelves a pulsar led=off off.
//Lógica positiva.
//se ha montado un circuito rc para evitar el rebote del pulsador
int pulsador=2;
int led=13;
int cnt_etapa=0; //contador de etapas y estado//
void setup(){
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
Serial.begin(9600);
}
void loop(){
if(digitalRead(pulsador)==HIGH&&cnt_etapa==0){ //detecta pulsador on
digitalWrite(led,HIGH);
cnt_etapa=1;
}
if(digitalRead(pulsador)==LOW&&cnt_etapa==1){ //detecta pulsador off
cnt_etapa=2;
}
if(digitalRead(pulsador)==HIGH && cnt_etapa==2){ //detecta pulsador on
digitalWrite(led,LOW);
cnt_etapa=3;
}
if(digitalRead(pulsador)==LOW && cnt_etapa==3){ //detecta pulsador off
cnt_etapa=0;
}
Serial.println(cnt_etapa); //puedes dónde está el programa viendo en qué etapa está
}