Wie kann ich ein Stromstoßschalter erstellen?

Hallo,

ich wollte mit dem Arduino Uno einen Stromstoßschalter bauen. Wie bekomme ich das hin? Oder wie erstelle ich eine Flankenauswertung (von LOW nach HIGH)?

Vielen Dank im voraus

arokh12

Das ist sehr einfach, speichere einfach den letzten Zustand eines digitalen Eingangs, vergleiche den neuen Zustand mit dem gespeicherten, wenn er sich geändert hat und der neue Zustand HIGH ist, hattest Du eine steigende Flanke. Wenn der Eingang per Taster bedient wird, solltest Du ihn noch entprellen, sprich, nach der letzten Flanke ignorierst Du für einen gewisse Zeit weitere Flanken (im einfachsten Fall).

boolean laststate=false;        // letzter Speicherwert aus zyklus davor
boolean actstate=false;        // actueller Status
boolean togglestate=false;    // dein zu toggelender Wert

void setup(){
// deine Ein und ausgänge
}

void loop(){
actstate=digitalRead(DeinEingang);              // Den Aktuellen Wert einlese
if (actstate==true&&laststate==false){           // Wenn der aktueller Zustand HIGH ist und beim letzten durchlauf Low ist ist ein Flankenwechsel
togglestate=!togglestate;                             // invertiern des statues
laststate=true;                                          // Der letzte Zustand des Pines ist high hier läuft er nicht mehr hin ausser man lässt den Taster los
}
if (actstate==false){                                  // Wenn der Taster losgelasen wurde ist auch der letzte Pinstatus LOW
laststate=false;
}
}

Das ist der einfachste weg Gruß Der Dani

Edit: SP1 für den Code eingepflegt :)

wofür brauchst du das in deinem Code?

togglesate=!togglestate;

abgesehen vom Schreibfehler :-))

volvodani:

boolean laststate=false;        // letzter Speicherwert aus zyklus davor

boolean actstate=false;        // actueller Status
boolean togglestate=false;    // dein zu toggelender Wert

void setup(){
// deine Ein und ausgänge
}

void loop(){
actstate=digitalRead(DeinEingang);              // Den Aktuellen Wert einlese
if (actstate==true&&laststate==false){           // Wenn der aktueller Zustand HIGH ist und beim letzten durchlauf Low ist ist ein Flankenwechsel
togglesate=!togglestate;                             // invertiern des statues
laststate=true;                                          // Der letzte Zustand des Pines ist high hier läuft er nicht mehr hin ausser man lässt den Taster los
}
if (actstate==false){                                  // Wenn der Taster losgelasen wurde ist auch der letzte Pinstatus LOW
laststate=false;
}
}




Das ist der einfachste weg
Gruß
Der Dani

Danke für eure Hilfe. Es funktioniert super.

In der Zeile (siehe unten) ist ein kleiner Schreibfehler. Es fehlt beim ersten togglestate ein t.

togglestate=!togglestate; // invertiern des statues

Das: togglestate=!togglestate; dreht bei einer boolean Variable den Status um also toggelstate ist gleich nicht togglestate. Wenn togglestate high war wird er zu nicht(!) high also low und umgekehrt.

Man kann es z.B. wie aus dem Beispiel BlinwitouDelay anweden org:

 if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);

macht das hier:

 if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   
    // if the LED is off turn it on and vice-versa:
      ledState =!ledState;
    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);

Der Invertiert einfach die Variable: Gruß Der Dani

Ich glaube die Verwirrung war dass du da rumtoggelst, aber die Variable in dem Beispiel nie verwendet hast :slight_smile:

Ein Stromstoß-Schalter ist entweder ein oder aus, braucht aber weder in der einen noch in der anderen Stellung selber Energie. Nur zum Umschalten. Und bleibt ohne Stromversorgung in seiner letzten Stellung.

Oder hab ich da was anderes im Kopf?

Mit "togglestate" hat das ganze nur am Rande zu tun, denke ich. Und mit Arduino ist das so nicht zu machen.

Es hing hier um die Fuktionalität eines stromstoßschalters und um die flankenerkennung und die ist in dem Code enthalten. Und die Variable Toggelstate verhält sIch in dem Beispiel wie das henannte relais Gruß Der Dani

Ein Stromstoß-Schalter ist entweder ein oder aus, braucht aber weder in der einen noch in der anderen Stellung selber Energie. Nur zum Umschalten. Und bleibt ohne Stromversorgung in seiner letzten Stellung.

Zumindest nach Wikipedia ist ein bistabiler Wechselschalter, der über eine steigende Flanke des Eingangssignals schaltet bereits ausreichend, dass so ein Ding als Stromstoss-Schalter bezeichnet wird. Es steht nicht davon, dass er in den beiden Stellungen keine Energie brauchen darf. Das ist meiner Meinung nach auch nur bei der mechanischen Variante der Fall, im elektronischen Fall wird immer etwas Energie verbraucht.

Dafür allerdings einen Arduino einzusetzen macht höchstens wegen der Lernerfahrung einen Sinn.

Danke, pylon. Wohl eher meine Assoziation mit "Stromstoß". Da höre ich das Relais heftig klacken, und brummen solange der Taster gedrückt ist ;-) Und dass bei Spannungs-Wiederkehr nicht mit AUS begonnen wird , ist oft eher ein tolerierter Nebeneffekt solcher mechanischen Dinger.

im elektronischen Fall wird immer etwas Energie verbraucht. Dafür allerdings einen Arduino einzusetzen macht höchstens wegen der Lernerfahrung einen Sinn.

Klar. So was elektronisch zu bauen, wäre auch sehr lehrreich. --> http://danyk.cz/zap-vyp_en.html

Wenn man "Stromstoss-Schalter" mit "toggle latch button" übersetzt, findet man auch dieses hübsche Video von Dave Jones

der eine Schaltung wie in meinem vorigen Post, unterhaltsam herleitet.

Ein gesperrter Transistor und ein 1M Widerstand brauchen nicht soo viel Strom. Einen Arduino zu verwenden, ist allerdings in der Tat etwas abwegig.

Hallo, ich hoffe jemand von euch kann mir weiterhelfen. Ich habe die beiden Codes so ungefähr verstanden, aber ich weiß nicht wie ich sie anwenden soll bzw. was der Eingang und der Ausgang ist.

Kann mir jemand das Programm so ändern dass Beispielsweise für das Signal auf Pin 2 und der Ausgang mein Pin 3 ist.

Muss ich dann den Code zweimal schreiben, bloß High und Low tauschen, dass an und ausschalten funktioniert?

Danke im Voraus Mokue

PS: Vielleicht kann mir auch jemand ein fertiges Programm schreiben, dass ich die Funktion verstehe.

michael_x: Danke, pylon. Wohl eher meine Assoziation mit "Stromstoß". Da höre ich das Relais heftig klacken, und brummen solange der Taster gedrückt ist ;-) Und dass bei Spannungs-Wiederkehr nicht mit AUS begonnen wird , ist oft eher ein tolerierter Nebeneffekt solcher mechanischen Dinger.

Klar. So was elektronisch zu bauen, wäre auch sehr lehrreich. --> http://danyk.cz/zap-vyp_en.html

volvodani: Das: togglestate=!togglestate; dreht bei einer boolean Variable den Status um also toggelstate ist gleich nicht togglestate. Wenn togglestate high war wird er zu nicht(!) high also low und umgekehrt.

Man kann es z.B. wie aus dem Beispiel BlinwitouDelay anweden org:

 if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:     if (ledState == LOW)       ledState = HIGH;     else       ledState = LOW;

    // set the LED with the ledState of the variable:     digitalWrite(ledPin, ledState);




macht das hier:


if(currentMillis - previousMillis > interval) {     // save the last time you blinked the LED     previousMillis = currentMillis; 
    // if the LED is off turn it on and vice-versa:       ledState =!ledState;     // set the LED with the ledState of the variable:     digitalWrite(ledPin, ledState); ```

Der Invertiert einfach die Variable: Gruß Der Dani

ich weiß nicht wie ich sie anwenden soll bzw. was der Eingang und der Ausgang ist.

Das ist ja auch gar keine “Code” (den du so wie es da steht verwenden kannst).

digitalWrite(ledPin, ledState); Das ist die “Ausgabe”, mit der Besonderheit, dass ledPin und ledState undefinierte Namen sind. Ein “Eingang” fehlt komplett, und mit Stromstoßrelais hat das Ganze nichts zu tun (etwas vereinfacht gesehen)

Ausserdem ist es selten hilfreich, sich an uralte Threads anzuhängen.
“Fertige Programme” zu schreiben, sträuben sich die meisten hier etwas, weil das Problem erstmal ist, zu verstehen was du willst ( vermutlich auch du selbst :wink: )

Du meinst eventuell:
“Bei jedem Taster drücken den Ausgang umschalten”

Dazu musst du

  • wissen, wie Taster eingelesen werden (nicht ganz trivial)
  • erkennen wann der Taster “erneut” gedrückt wurde (nur dann soll ja was passieren)
  • den Ausgang umschalten (das kannst du eventuell im Schnipsel oben sehen)

Willkommen im Forum, übrigens.

Ja ich habe gedacht, mir kann jemand kurz helfen, da ich eigentlich nicht so viel aus die Steuerung eingehen möchte sondern auf meinen Schaltschrank mit dem ich ein "kleines" Projekt machen will.

Theoretisch möchte ich:

wenn Taster gedrückt wird Ausgang abfragen wenn Ausgang Low war, auf High schalten war Ausgang High, auf Low schalten.

so wie ein Stromstoßrelais

Vielleicht hat ja jemand eine Idee Notfalls mach ich anstatt eine SPS eine VPS

Und warum nimmst du kein Stromstoßrelais? Die haben sogar Schraubklemmen.

Ein Arduino ist eher für Leute die freiwillig rumfummeln wollen.

mokue: Ja ich habe gedacht, mir kann jemand kurz helfen, da ich eigentlich nicht so viel aus die Steuerung eingehen möchte sondern auf meinen Schaltschrank mit dem ich ein "kleines" Projekt machen will.

Theoretisch möchte ich:

wenn Taster gedrückt wird Ausgang abfragen wenn Ausgang Low war, auf High schalten war Ausgang High, auf Low schalten.

so wie ein Stromstoßrelais

Vielleicht hat ja jemand eine Idee Notfalls mach ich anstatt eine SPS eine VPS

Und was hindert dich daran, das zu programmieren? Beispiele findest du in diesem Thread ja genügend.

Da du ja schreibst, du hast den Code verstanden, sollte es doch funktionieren.

ALSO mein Code ist fertig, aber er funktioniert nicht. Ich nehm mal an es sind einfach zu viele Fehler drin und wahrscheinlich geht es auch nicht einen Ausgang abzufragen oder?

Naja ich probiere es weiterhin. Irgendwann hab ichs raus.

Falls jemand meine Fehler sehen will:

II II II \ / \ / \/

int RelaisPin = 2; int TasterPin = 3; void setup() { pinMode(RelaisPin, OUTPUT); pinMode(TasterPin, INPUT); }

void loop() { if (TasterPin == LOW & RelaisPin == LOW) { digitalWrite(RelaisPin, LOW); }

if (TasterPin == HIGH & RelaisPin == LOW) { digitalWrite(RelaisPin, HIGH); }

if (TasterPin == LOW & RelaisPin == HIGH) { digitalWrite(RelaisPin, HIGH); }

if (TasterPin == HIGH & RelaisPin == HIGH) { digitalWrite(RelaisPin, LOW); }

Der Tasterpin selbst sollte nicht LOW werden, du brauchst zumindest ein digitalRead() auf dem Pin. Als nächstes schaust du dir mal diese Seite an: http://www.arduino.cc/en/Reference/Boolean Die AND-Verknüpfung sieht nämlich so aus: && Ansonsten solltest du die entsprechenden Code-Tags nutzen.

Du weisst der Variabeln TasterPin den Wert 2 zu und fragst dann ober er LOW ist und das ist der nicht.
Achtung du brauchst Variabeln und Aliase für deine Aus/Eingänge.

Du musst die Übergänge auswerten und so wie dein Code aussieht hast du nix von dem obigen Code
Schnippslen ausprobiert oder versucht auszuprobieren.

Schwupps Dirtycode + 1min Arbeit

#define DeinEingang 2
#define DeinAusgang 3
 
boolean laststate=false;        // letzter Speicherwert aus zyklus davor
boolean actstate=false;        // actueller Status
boolean togglestate=false;    // dein zu toggelender Wert

void setup(){
  pinMode (DeinEingang, INPUT);
  pinMode (DeinAusgang, OUTPUT);

}

void loop(){
actstate=digitalRead(DeinEingang);              // Den Aktuellen Wert einlese
if (actstate==true&&laststate==false){           // Wenn der aktueller Zustand HIGH ist und beim letzten durchlauf Low ist ist ein Flankenwechsel
togglestate=!togglestate;                             // invertiern des statues
laststate=true;                                          // Der letzte Zustand des Pines ist high hier läuft er nicht mehr hin ausser man lässt den Taster los
}
if (actstate==false){                                  // Wenn der Taster losgelasen wurde ist auch der letzte Pinstatus LOW
laststate=false;
}
digitalWrite(DeinAusgang,togglestate);
}

Gruß
DerDani