Schalter + Led

Hallo, ich habe einen normalen Schalter, also keinen Taster und damit wollte ich eine Led beim Einschalten nur 1 Sec leuchten lassen, danach sollte sie wieder ausgehen. Wenn man den Schalter dann wieder von der Einstellung auf die Ausstellung schaltet, sollte die gleiche Led wieder nur 1 Sec leuchten und danach wieder ausgehen. Hoffe Ihr könnt mir helfen.

Schalter -> entprellen -> Automat mit Flankenerkennung und Monoflopp -> Ausgabe

stonefamer05:
.....Hoffe Ihr könnt mir helfen.

Das können wir bestimmt.

Du musst dir einfach nur den vorherigen Zustand des Schalter merken und dann je nach Zustand die Led ein bzw. ausschalten. Für diese einfache Funktion kannst du sogar ein delay für die Leuchtzeit der Led nutzen. besser ist da aber zukünftig millis (BlinkWithoutDelay) zu verwenden.

Ja, klingt logisch, aber ich bin leider nicht so gut mit Variablen, darum würde mir dazu auch kein Code einfallen.

stonefamer05:
Ja, klingt logisch, aber ich bin leider nicht so gut mit Variablen, darum würde mir dazu auch kein Code einfallen.

Dann schau dir einfach mal die Beispile in der IDE an und übe mit denen. Das ist nicht schwierig.
Weiteres findest du hier.

combie:
Schalter -> entprellen -> Automat mit Flankenerkennung und Monoflopp -> Ausgabe

Bei einem Taster sinnvoll. Bei einem Schalter überflüssig.

urdaino:
Bei einem Schalter überflüssig.

Was denn?
Die Ausgabe?

Probiere den Code morgen nochmal zu schreiben, bis jetzt ist noch nichts Sinnvolles hinausgekommen.
Gute Nacht

combie:
Schalter -> entprellen -> Automat mit Flankenerkennung und Monoflopp -> Ausgabe

urdaino:
Bei einem Taster sinnvoll. Bei einem Schalter überflüssig.

Wieso soll ein Schalter nicht prellen?
Grüße Uwe

(deleted)

stonefamer05:
Hallo, ich habe einen normalen Schalter, also keinen Taster und damit wollte ich eine Led beim Einschalten nur 1 Sec leuchten lassen, danach sollte sie wieder ausgehen. Wenn man den Schalter dann wieder von der Einstellung auf die Ausstellung schaltet, sollte die gleiche Led wieder nur 1 Sec leuchten und danach wieder ausgehen. Hoffe Ihr könnt mir helfen.

Du brauchst zwei Variablen:
eine, die den Status merkt und eine die die aktuelle Laufzeit merkt.
Du prüfst fortlaufend mit der Status-variablen, ob sich der Status des Schalters geändert hat.
Aber nur solange, wie die LED aus ist.

Wäre dann:

im Setup setzt Du die Statusvariable mit dem Zustand des Schalters.

variable=digitalRead(SchalterPIN);

im loop()

if ((variable!=digitalRead(SchalterPIN)&& digitalRead(LEDPIN)==LOW))

wenn der Fall eintritt, setzt Du variable=!variable;
und lässt die LED leuchten digitalWrite(LEDPIN)=HIGH;
und merkst Dir die Zeit lastmillis=millis();

In einer weiteren Prüfung ob die Zeit abgelaufen ist

if (millis()-lastmillis >1000)

Wenn Bedingung erfüllt, LED aus

digitalWrite(LEDPIN)=LOW;

Erst wenn die LED wieder aus ist, wird der Schalter wieder abgefragt.

(deleted)

Moin, Moin,

Peter-CAD-HST:
Mein Vorschlag - nicht getestet:

void loop() {

if (digitalRead(LED)) if(millis()> meineZeit) digitalWrite(LED,LOW);

Da musste ich tatsächlich mehrmals lesen.
Entweder Du verknüpfst das mit && oder aber machst zwei Zeilen draus dann fehlen aber die geschweiften Klammern.
Dann könnte das werden.

Hier noch mein Codevorschlag, rein vom Frühstückstisch aus.

int LEDPIN = LED_BUILTIN;
bool variable;
int SchalterPIN = 2;
unsigned long lastmillis;
void setup()
{
  pinMode (2, INPUT_PULLUP);
  variable = digitalRead (SchalterPIN);
}

void loop()
{
  if ((variable != digitalRead (SchalterPIN) && digitalRead (LEDPIN) == LOW))
  {
    variable = !variable;
    digitalWrite (LEDPIN, HIGH);
    lastmillis = millis();
  }
  if (millis() - lastmillis > 1000)  // An Stelle eines neuen if könnte hier auch ein else Zweig rein
  {
    digitalWrite (LEDPIN, LOW);
  }
}

Euch einen schönen Tag!

(deleted)

meineZeit=millis()+meinePause;

Das geht ins Auge.

Peter-CAD-HST:
Ganz einfach Beides ausprobieren und gucke was passiert.

Warum soll ich das ausprobieren?
Ich weiß doch wie es geht.

Peter-CAD-HST:
Probieren geht über studieren :slight_smile:

Hmmmm ...

Ich übersetze das mal:
Du sollst (ich soll) blind im Nebel stochern, bis durch Zufall irgendwann mal ein Ergebnis bei rum kommt, welches irgendwie, ein bisschen funktioniert.
Der nächste Schritt: In Form eines Tutorials, in die Öffentlichkeit kippen.

Oder, von einer anderen Seite betrachtet:
Verstehen was man da tut, und koordiniertes handeln, wird völlig überbewertet.

Alle sagten das geht nicht.
Dann kam einer, der wusste das nicht.
Er hat es versucht.
Und es ging nicht

Quelle


Entweder Du verknüpfst das mit && oder aber machst zwei Zeilen draus

Wieso?
Ist doch völlig ok so!
(wenn nicht der Fehler vorher, alles zerrütten würde)

combie:
Schalter -> entprellen -> Automat mit Flankenerkennung und Monoflopp -> Ausgabe

Mechanische Kontakte prellen, aber hoffentlich nicht eine ganze Sekunde lang. Daher kann man auf das Entprellen verzichten, allerdings muß man es berücksichtigen. Das ist beim Frühstücksprogramm in #12 nicht der Fall, da genau genommen die LED während des Prellens flackert. Das kann man durch den Automaten verhindern. Außerdem sollten Konstanten auch so deklariert werden und Ausgänge müssen auch als solche definiert werden:

const byte LEDPIN = LED_BUILTIN;
bool schalterStatusAlt;
const byte SchalterPIN = 2;
unsigned long lastmillis;

void setup()
{
  pinMode(LEDPIN, OUTPUT);
  pinMode(SchalterPIN, INPUT_PULLUP);
  schalterStatusAlt = digitalRead(SchalterPIN);
}

void loop()
{
  if (digitalRead(LEDPIN))
  {
    if (millis() - lastmillis > 1000)
    {
      digitalWrite (LEDPIN, LOW);
    }
  } else {
    if (schalterStatusAlt != digitalRead(SchalterPIN))
    {
      schalterStatusAlt = !schalterStatusAlt;
      digitalWrite(LEDPIN, HIGH);
      lastmillis = millis();
    }
  }
}

Ich glaube nicht, der TO hätte das herausgefunden, vermutlich ist es für seine Aufgabenstellung auch überhaupt nicht relevant, aber ich wollte es mal angemerkt haben.

Daher kann man auf das Entprellen verzichten, allerdings muß man es berücksichtigen.

Du siehst deinen logischen Fehler!
Oder?

Ich formuliere es mal um:
--> Man darf das prellen noch nicht einmal ignorieren.

Oder anders:
Ich sehe, dass ein prellen der Kontakte zu Problemen führt.
Also muss ich das Prellen in meinem Programm korrekt abhandeln.
Die Tätigkeit nenne ich aber keinesfalls entprellen, denn das muss man hier ja nicht.

Ganz ehrlich:
Kontakte prellen.
Jegliches Verfahren, welches die Auswirkungen des, eher unerwünschten, prellens unterbindet, nenne ich entprellen.

Für mich ist es schön, für eine Bedeutung, auch ein Wort zu haben.
Das kommt meiner Naivität sehr entgegen.

Selbst ein gänzlich unbedarfter, könne das Wort "Entprellen" in einer Suchmaschine seiner Wahl hacken. Evtl garniert mit "Arduino Taster entprellen". Hier habe ich bewusst Taster gewählt, weil sie häufiger Thema sind als Schalter.(also nicht, weil ich nur blöd bin....)

Es besteht also die Hoffnung, dass ein jeglicher Mensch erfassen kann, was ich damit, mit entprellen, meine, worauf es zielt.

Die Hoffnung begründet sich auf dem Folgenden:
Ein Wort, für die Verbindung, von dem Wort und das, was es uns sagen möchte ist: Semantik.

Vereinfacht gesagt, ist Semantik die "Lehre" von den Zeichen/Wörten/Sätzen und den ihnen zugeordneten Bedeutungen.

Jetzt mit etwas mehr Humor:
Die Semantik ermöglicht Menschen, über das gleiche zu reden.
Was dann die Grundlage für eine erfolgreiche, zielgerichtete, Kommunikation sein könnte.

Schalter -> entprellen -> Automat mit Flankenerkennung und Monoflopp -> Ausgabe

Hier habe ich 6 Begriffe aufgeführt, deren Bedeutung jedem Arduino Programmierer bekannt sein, oder zumindest bekannt werden sollte.

Daraufhin die Ansage: "Bei einem Schalter überflüssig."

OK, da bleiben von 6 Begriffen dann nur noch 5 übrig.
Was dann äußerst wirkungsvoll verhindert, dass ich die Semantik des Satzes "Bei einem Schalter überflüssig." korrekt erfassen kann.
Natürlich, möchte ich hier möglichst glaubhaft versichern, dass mir der Unterschied zwischen Schalter und Taster durchaus bekannt ist. Schalter haben eine Rastung, welche sie in der gewählten Position hält. Allerdings sehe ich bei der Programmtechnischen Abhandlung, den Unterschied nicht wirklich.

Im englischen heißt ein Taster "tactile switch".
Frei übersetzt: "Ein Ding, welches bei Berührung schaltet."

Taster -- Schaltkontakte ohne Rastung
Schalter -- Schaltkontakte mit Rastung

Wobei auch hier wieder die Semantik kontextabhängig ist.
Denn z.B. der übliche Endschalter, in der Industrie, ist doch eher ein Taster, da ohne Rastung.

Danke für eure Codes. Sie haben sehr gut funktioniert und ich verstehe jetzt auch schon einiges mehr von Variablen, da ich von funktionierenden Codes mehr lerne als wenn ich meine eigen Codes anschaue, die leider nicht funktioniert haben.
Danke für eure Hilfe.
Lg Daniel

(deleted)

meineZeit = millis() + meinePause;

Das wird ins Versagen führen.

Das sagte ich auch hier schon einmal.

Ich könnte dich auch bitten das nicht mehr öffentlich so zu publizieren.
Aber es wäre mir deutlich lieber, wenn du das aus Einsicht nicht mehr so veröffentlichen würdest.

Kann ich dir irgendwie beim verstehen des Problems helfen?
Wie?