Led mit einem Taster ein und aus schalten.

Hallo allerseits,
ich bin recht neu in Sachen Arduino und finde trotz suche einfach nicht die richtige Antwort.
Obwohl ich denke, dass dies Jeder schon hinter sich hat. :frowning:

Ich möchte eine LED mit einem Taster Ein und auch Aus schalten.

Also:
Druck auf den Taster>>Led an.
Druck auf den Taster>>Led aus.

Dachte ich hätte auch schon etwas Passendes gefunden, aber das funktioniert auch nicht.
Umbauen und Einfügen der "else" Anweisung hielt ich für die Lösung, vergeblich.

Wisst ihr vielleicht einen Rat?

Gruß Friese

const int buttonPin = 4;    
const int ledPin =  2;      
int merker=0;

int buttonState = 0;        

void setup() 
  {
    pinMode(ledPin, OUTPUT);      
    pinMode(buttonPin, INPUT);
    Serial.begin(9600);
    buttonState = digitalRead(buttonPin);
  }

void loop()
 {

  if ((buttonState == HIGH)&&(merker==0)) 
    {   
      digitalWrite(ledPin, HIGH); 
      merker=1;
    } 
    else
    {
    digitalWrite(ledPin,LOW);
    }
  if ((buttonState == HIGH)&&(merker==1)) 
    {   
      digitalWrite(ledPin, LOW);
      merker=0;
    } 
    else
    {
    digitalWrite(ledPin, HIGH);
    }
    {
    Serial.print("buttonstate= ");
    Serial.println(buttonState);
    } 
    {
    Serial.print("MERKER=");
    Serial.println(merker);
    }
 }
    buttonState = digitalRead(buttonPin);

Das gehört wohl nach loop().

Die else dürften überflüssig sein.

Was fehlt, ist eine Entprellung der Tasten.

Damit willkommen im Forum!

versuch es mal so:

/*
 *© Ardubu März 2016
 *Umschalten eines Ausgangs mit einem Taster, 
 *Taster wird zwischen GND und pin_x angeschlossen
 *interner Pullup Widerstand aktiviert
 *der counter zählt von 0 bis 255 jeden Tastendruck
*/

#define DEBUG //Nur zur Fehlersuche aktivieren
#define taster_pin 3
#define led_pin 7
#define debounce_delay 15 //Entprellzeit für den Taster
  bool led_state, taster_state, taster_state_alt;// Variablendeklaration (global)
  uint8_t counter;
void setup() {
  #ifdef DEBUG
  Serial.begin(115200);
  Serial.println("Setup");
  #endif
  pinMode(taster_pin, INPUT_PULLUP);
  pinMode(led_pin, OUTPUT);
 }

void loop() {

 static uint32_t debounce_time;
 if (millis()-debounce_time>debounce_delay)taster_state = digitalRead(taster_pin); //einlesen des Tasters
   
 if (taster_state != taster_state_alt) // bei Pegelwechsel 
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!taster_state)//wenn Taster gedrückt
       {
        counter++;
        led_state = !led_state;//Ausgang wechseln
        digitalWrite(led_pin,led_state);}
        taster_state_alt = taster_state; // state aktualisieren
        }
}//Ende loop

agmue:

    buttonState = digitalRead(buttonPin);

Das gehört wohl nach loop().

Die else dürften überflüssig sein.

Was fehlt ist eine Entprellung der Tasten.

Ja das stand auch mal im Loop.

Entprellen Hört sich gut an!

Wie mach ich das am dümmsten?
Einfach ein delay?

agmue:
Damit willkommen im Forum!

Danke, Sorry für das fehlende "Hallo".

Friese:
Entprellen Hört sich gut an!

Wie mach ich das am dümmsten?

Siehe #2 :slight_smile:

So, habe den Sketch von Ardubu auf meinen Nano installiert und die Anschlüsse geändert.
Passiert ist nichts.
Habe dann den Taster vom Board geworfen (sitzt nicht gut) und durch eine Drahtbrücke ersetzt, mit der ich "taste".
Ergebniss= Keine Funktion. Im Serial Montor kommt nur "Setup=0"

Ich bin mir sicher, dass ich etwas falsch mache. Habe ich vergessen etwas Auszuklammern?
Aber was? Den Sketch von Ardubu verstehe ich auch nur im Ansatz.

Ich bin doch nur ein dummer Mechaniker. :confused:

Schönen Abend

Friese

pinMode(taster_pin, INPUT_PULLUP);

Der Eingang möchte gegen GND geschaltet werden, da ein PullUp-Widerstand ihn auf HIGH hält, wenn er unbeschaltet ist.

*Umschalten eines Ausgangs mit einem Taster,
*Taster wird zwischen GND und pin_x angeschlossen
*interner Pullup Widerstand aktiviert

Den Sketch von Ardubu verstehe ich auch nur im Ansatz.

Da mach dir mal keinen Kopf. Deine Idee mit dem delay () ist nicht mal das Dümmste.

bool altTaster = HIGH;
bool ledState = HIGH;

void setup() {
  pinMode(taster_pin, INPUT_PULLUP);
  pinMode(led_pin, OUTPUT);
}
void loop () {
  bool neuTaster = digitalRead (taster_pin);
  if ( neuTaster != altTaster ) {
     // Änderung
     altTaster = neuTaster; 
     if ( neuTaster == LOW ) {
        ledState = ! ledState; 
        digitalWrite (led_pin, ledState);
     }
   }
   delay (10); // entprellen
}

Hier der Sketch von ardubu nur mit dem was du brauchst. ist so vielecht einfacher zu durchschauen

#define taster_pin 2
#define led_pin 13
#define  Entprellzeit 15 //Entprellzeit für den Taster in ms
  bool led_state, taster_state, taster_state_alt;// Variablendeklaration (global)
 
static uint32_t Entprell_zeit;
void setup() {
  
   
  pinMode(taster_pin, INPUT_PULLUP);
  pinMode(led_pin, OUTPUT);
 }

void loop() {
 
 if (millis()-Entprell_zeit>Entprellzeit){
  taster_state = digitalRead(taster_pin); //einlesen des Tasters
 }
   
 if (taster_state != taster_state_alt) // bei Pegelwechsel
    {
     Entprell_zeit=millis();
     
    
     if(!taster_state)//wenn Taster gedrückt
       {

        led_state = !led_state;//Ausgang wechseln
        digitalWrite(led_pin,led_state);}
        taster_state_alt = taster_state; // state aktualisieren
        }
}//Ende loop

michael_x:
Da mach dir mal keinen Kopf. Deine Idee mit dem delay () ist nicht mal das Dümmste.

Das sehe ich auch so.
eine so kurze Verzögerung genügt für das Entprellen, verlangsamt den Sketch aber nicht wirklich.

Noch besser als im Beispiel von michael_x ist die Verzögerung in die if Schleife einzubauen. Dann erfolgt die Verzögerung nur dann wenn man sie wirklich braucht: während des Prellens des Tasters bei einer Pegeländerung. Ändert sich der Tasterzustand nicht, ist der Sketch nicht durch das delay() ausgebremst.

Verbesserter Sketch:

bool altTaster = HIGH;
bool ledState = HIGH;

void setup() {
  pinMode(taster_pin, INPUT_PULLUP);
  pinMode(led_pin, OUTPUT);
}
void loop () {
  bool neuTaster = digitalRead (taster_pin);
  if ( neuTaster != altTaster ) {         // Änderung
     altTaster = neuTaster;
     if ( neuTaster == LOW ) {
        ledState = ! ledState;
        digitalWrite (led_pin, ledState);
        }
     delay (10); // Entprellen bei einer Statusänderung des Tasters.
     }
  }

Grüße Uwe

Ich möchte eine LED mit einem Taster Ein und auch Aus schalten.
....
Den Sketch von Ardubu verstehe ich auch nur im Ansatz.

Diese Probleme wirst du auch mit meinen Ansätzen haben.

Also bitte einfach ignorieren, wenn es dir zu weit geht.

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>

using namespace Combie::Tools;
using namespace Combie::Timer;
using namespace Combie::Pin; 

using CounterType = Counter<byte>;

TasterGND<2>      taster; // Taster gegen GND geschaltet
OutputPin<13>     led;
EntprellTimer     entprellen(20); // entprellzeit in ms
FlankenErkennung  flankenerkennung;
CounterType       counter;


void ledAction(CounterType &counter) 
{
  led.toggle();
}

void setup() 
{
    taster.initPullup();
    led.init();
    counter.onCount(ledAction);
}

void loop() 
{ 
  counter = flankenerkennung = entprellen = taster;
}

CombieLib.zip (31.3 KB)

Noch besser als im Beispiel von michael_x ist die Verzögerung in die if Schleife einzubauen

Das hatte ich auch überlegt. Bescheunigt den Sketch ungemein, wenn gar nichts zu tun ist.
Nimmt man das Ganze als Grundgerüst für eine Universal-Lösung, ist nicht sicher, dass sonst gar nichts zu tun ist.

Ob es also "egal" oder "noch besser" ist, können wir also offen lassen.

Hallo zusammen,

ich habe mal den Sketch von ardubu auf meine zwei-Taster-Situation umgemünzt.
Ziel = mit Taster 1 die LED an und aus zu schalten und mit Taster 2 die LED gedimmt-an und aus zu schalten.

Also an/aus klappt (Taster 1)
Taster 2 schaltet gedimmt an, aber nicht aus.
Könnt Ihr mir nen Tip geben, woran das liegt?

/*
 *© Ardubu März 2016
 *Umschalten eines Ausgangs mit einem Taster,
 *Taster wird zwischen GND und pin_x angeschlossen
 *interner Pullup Widerstand aktiviert
 *der counter zählt von 0 bis 255 jeden Tastendruck
*/

#define DEBUG //Nur zur Fehlersuche aktivieren
#define taster1_pin 8
#define taster2_pin 7
#define led_pin 6
#define debounce_delay 15 //Entprellzeit für den Taster
  bool led_state, taster1_state, taster1_state_alt, taster2_state, taster2_state_alt;// Variablendeklaration (global)
  uint8_t counter;
void setup() {
  #ifdef DEBUG
  Serial.begin(115200);
  Serial.println("Setup");
  #endif
  pinMode(taster1_pin, INPUT_PULLUP);
  pinMode(taster2_pin, INPUT_PULLUP);
  pinMode(led_pin, OUTPUT);
 }

void loop() {

 static uint32_t debounce_time;
 if (millis()-debounce_time>debounce_delay)taster1_state = digitalRead(taster1_pin); //einlesen des Tasters
   
 if (taster1_state != taster1_state_alt) // bei Pegelwechsel
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!taster1_state)//wenn Taster gedrückt
       {
        counter++;
        led_state = !led_state;//Ausgang wechseln
        digitalWrite(led_pin,led_state);}
        taster1_state_alt = taster1_state; // state aktualisieren
        }

 if (millis()-debounce_time>debounce_delay)taster2_state = digitalRead(taster2_pin); //einlesen des Tasters
   
 if (taster2_state != taster2_state_alt) // bei Pegelwechsel
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!taster2_state)//wenn Taster gedrückt
       {
        counter++;
        led_state = !led_state;//Ausgang wechseln
        analogWrite(led_pin, 10);}
        taster2_state_alt = taster2_state; // state aktualisieren
        }
}//Ende loop

Danke und Gruß,
Chris

Hi

Beim Digital-LED-Ausgang wechselst Du mittels led_state = !led_state;//Ausgang wechseln den Status der LED, im anschließendem digitalWrite wird der umgedrehte Status an den Ausgang der LED geschrieben.
In dem Analog-Teil machst Du das Gleiche - nur, daß Du den Status dort akut nicht benutzt.
Du müsstest zwischen der led_state Zeile und dem analogWrite mit einer IF prüfen, ob der Status AN oder AUS ist, bei AUS analogWrite(led_pin,0); (oder digitalWrite(led_pin,LOW); ) und bei AN analogWrite(led_pin,10);
Wobei der Wert 10 Deine 'Dimmstufe' ist - Du also nur schwach gedimmt oder AUS dort bekommen kannst.

Was macht 'counter' in Deinem Sketch?
Vll. kannst Du damit die LED 'hochdimmen'.

MfG

Du meinst quasi nach der State-Zeile:

led_state = !led_state;//Ausgang wechseln
        if (led_state = led_dim)
        analogWrite(led_pin, led_dim);
        else
        digitalWrite(led_pin, LOW);
        }
        taster2_state_alt = taster2_state; // state aktualisieren
        }

Hallo,

du hast/benötigst 4 Zustände zwischen denen du unterscheiden und zwischen denen du springen musst.
Mittels Taster 1 hart ein- und ausschalten.
Mittels Taster 2 gedimmt ein- und ausschalten.
Es kann ja auch sein das du während des ein-dimmens plötzlich hart ausschalten möchtest.
Jetzt baust du dir eine Funktion für die Taster worin du dich zwischen den 4 Zuständen bewegst.
Dann baust du dir 4 Funktionen für das LED schalten/dimmen.
Diese Funktionen werden dann je nach Zustand aufgerufen.

Solltest du nicht weiter kommen, nicht verzagen einfache weiter Fragen :wink:

Hier ein paar Links die dir vielleicht helfen können:

digitalwrite()
analogwrite()
Taster / Button entprellen
Taster entprellen vereinfachen
Zwei Schalter / 1 LED (AN/AUS & Gedimmt)

@ postmaster-ino hat dich auf den "Counter" hingewiesen, vielleicht solltest du dich damit noch einmal befassen :wink:

Solltest du der englischen Sprache mächtig sein, findest du hier weitere Hilfe:
Arduino dimmer
Arduino Fade
Using millis() for timing. A beginners guide
Arduino OneButton Library