6 Schalter ohne "if else" abfragen?

Hallo und guten Abend,

ich möchte gerne 6 Kippschalterpositionen (keine Taster!) digital abfragen, die 3 analoge PWM-Ausgänge steuern, an denen über MOSFETs IRL3803 drei Glühlampen hängen.

Konkret sollen von 3 Kippschaltern jeweils 2 Schaltzustände abgefragt werden: EIN - AUS - EIN. Für jede der EIN-Positionen soll die dem jeweiligen Schalter zugeordnete Glühlampe einmal mit analogWrite(pin, 60) gedimmt leuchten und einmal mit analogWrite(pin, 255) mit voller Helligkeit leuchten. Wenn keine EIN-Position gewählt ist, soll die jeweilige Glühlampe nicht leuchten.

Mit einer verschachtelten "if else" Abfrage im loop-Bereich bekomme ich das einigermaßen hin, aber gibt es eine Möglichkeit, diese Abfragen auch außerhalb von loop einzurichten? Ich frage deshalb, weil im Code nicht nur die Schalter abgefragt werden, sondern auch noch 8 Potentiometer, die andere Glühlampen über MOSFETs stufenlos dimmen können, sowie die Abfrageroutinen von 6 Encodern mit Ausgabe an digitalen Ausgängen.

Vielleicht gibt es ja einen eleganteren und schlankeren Weg, die 6 Schalterpositionen abzufragen. Entprellen ist ja bei Schaltern eher zu vernachlässigen, oder? Meine Kenntnisse übersteigt das jedenfalls, zumal auch der restliche Code nur mit Eurer Hilfe erstellt werden konnte (und perfekt funktioniert!).

Ich habe schon viel gesucht, aber nur einen Code mit einer Abfrage für 64 Taster gefunden, was ich leider nicht auf nur 6 Inputs reduzieren konnte, da sehr komplex.

Ich bedanke mich im Voraus für Eure Kommentare.

Viele Grüße

Chris

wo ist das problem mit if oder select? zeitlich imho unerheblich. falls das analogWrite zu langsam ist, musst du eben mit variablen (boolean) das write zusätzlich blocken.

Wenn es nur um die Übersichtlichkeit geht, lagere den Code der jeweils zusammengehört in eine Funktion aus

und die dann noch in eine weitere datei ;)

ich bekomme das ganz ohen else hin. wo ist das Problem?

int lampe1 = 3;
int schalter1halb = 4; position  schater 30% 
int schalter1voll = 5; position  schater 100% 
int helligkeit1 =0; Helligkeit Lampe 1


setup()
{
verschiedene pin mode und pullup widerstände aktivieren..
}

loop()
{
helligkeit1 = 0;
if (digitalRead(schalter1halb)==0) helligkeit1 = 60;
if (digitalRead(schalter1voll)==0) helligkeit1 = 255;
analogWrite(lampe1,helligkeit1);

...
}

Wenn Du arrays verwendest kannst Du das alles sogar in eine For-Schleife für alle 3 Lampen hineinschreiben.

Grüße Uwe

Entprellen ist ja bei Schaltern eher zu vernachlässigen, oder?

Nein, ist es nicht. Ein mechanischer Schalter prellt idR genauso wie ein mechanischer Taster. Lässt sich bei Schaltern aber relativ gut filtern.

Einfach alle 20ms alle Taster abfragen. (ggf. Zeitspanne auch auf ein paar 100ms erhöhren).

Ich denke, dass dem Threadstarter durchaus bewusst ist, dass mechanische Kontakte prellen und es ihm um den konkreten Anwendungsfall ging. Und dabei ist das Prellen egal und hat keinen Einfluss auf die Funktion, wie beim normalen Lichtschalter im Haus. Allenfalls wenn er anfangen will, die Anzahl der Schaltvorgänge auszuzählen wird das Prellen zum Problem.

Hallo,

vielen Dank für Eure Empfehlungen und Anmerkungen!
Ich werde das alles austesten. Ja, das Prellen ist hier eigentlich egal, da die Schalter ja dauerhaft in ihrer Position verbleiben sollen und kein Zählen der Schaltvorgänge gebraucht wird.

Euch allen ein schönes WE!

Chris

int Schalter;

Schalter = PORTB; //nicht fuer den DUE

…die 3 analoge PWM-Ausgänge steuern…

Es gibt keine analogen Ausgänge. Ein PWM Signal ist ein digitales Signal → PulsWeitenModulation

Gruß