Go Down

Topic: Wie kann ich ein Stromstoßschalter erstellen? (Read 3481 times) previous topic - next topic

arokh12

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

pylon

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).

volvodani

#2
Jul 02, 2013, 02:47 pm Last Edit: Jul 02, 2013, 03:31 pm by volvodani Reason: 1
Code: [Select]


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  :)
Was machen Bits am liebsten?

=>Sie fahren Bus

maverick1509

wofür brauchst du das in deinem Code?

togglesate=!togglestate;

abgesehen vom Schreibfehler :-))

arokh12


Code: [Select]


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


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:
Code: [Select]
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:
Code: [Select]

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
Was machen Bits am liebsten?

=>Sie fahren Bus

Serenifly

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

michael_x

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.

volvodani

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
Was machen Bits am liebsten?

=>Sie fahren Bus

pylon

Quote
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.

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. 

Quote
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

michael_x

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.

mokue

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.






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

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:
Code: [Select]
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:
Code: [Select]

 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

michael_x

Quote
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 ;) )

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.

 


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
 

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy