Problema com uma toggle switch

preciso programar um input com isso

que vai ligar um led ou desligar ele.
esse é o programa que troca o estado do led

#define LED_PIN 5
#define TOOGLE_SWITCH_PIN 13

// switch stuff
int readingSwitch;
int previousSwitch = LOW;
boolean on = false;

void setup()
{
    pinMode(TOOGLE_SWITCH_PIN, INPUT);
    
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, LOW);
}

void loop()
{
   if (wasButtonPressed()) {
     switchRelayState();
   } else if (wasSwitchToggled()) {
     switchRelayState();
   }
}

void switchLedState() {
    if (on) {
      digitalWrite(LED_PIN, LOW);
      on = false;
    } else {
      digitalWrite(LED_PIN, HIGH);
      on = true;
    }
}

boolean wasSwitchToggled() {
  readingSwitch = digitalRead(TOOGLE_SWITCH_PIN);
  boolean toggled = false;
  
  if (readingSwitch != previousSwitch) {
    toggled = true;
  }

previousSwitch = readingSwitch;
return toggled;
}

esse é o jeito que a switch está ligada.

Quando a switch esta em aberto, ela fica trocando o estado do led muito rapido.
Nao sei se estou colocando o resistor pull-up corretamente, mas do outro jeito (conectado entre a switch e o pin4)
também acontece a mesma coisa.

Alguem por favor me ajude

Olá gcats,

Dê uma olhada nesse exemplo: http://arduino.cc/en/tutorial/button

Diga se entendeu e se resolveu seu problema ^^

Edit:

Sobre a condição if (wasButtonPressed()), não encontrei método com esse nome. ^^

Achei esse link que eu tinha guardado a bastante tempo atrás, valhe a pena dar uma olhada no pull up e pull down =)

Até

Quando a switch esta em aberto, ela fica trocando o estado do led muito rapido.

Isso acontece porque o pino está com o estado flutuando ou seja nao esta a 0 nem a 1 confirmado, ele apanha tudo que existe no "ar" e assim ele muda de estado rapido.Para isso deves fazer um pull-up.Podes fazer isso atravez dos pull-ups internos usando:

digitalWrite(TOOGLE_SWITCH_PIN, HIGH);

Outro problema que teras quando usas botoes é que ele gera picos rapidos quando comutas o botao.Procura por debouncing para perceberes o que acontece no botao para evitares que ele tambem comute varias vezes quando pressionado

HugoPT:
Outro problema que teras quando usas botoes é que ele gera picos rapidos quando comutas o botao.Procura por debouncing para perceberes o que acontece no botao para evitares que ele tambem comute varias vezes quando pressionado

Nunca testei este tipo de interruptores quanto ao debounce, mas arriscaria dizer que são bem melhores pelo simples facto de não ter de haver o efeito mola no contacto. Mas nada como experimentar. :slight_smile: