Drehcodierschalter auslesen

moin Community,

ich hab ein einfachen hexadezimal-drehcodierschalter. Den wollte ich auslesen und für jede zahl bzw. Buchstabe ein anderes delay haben (reicht aber auch erst mal die Zahlen und Buchstaben des Schalters am seriellen Monitor anzuzeigen) hab zuerst an ein Switch-Case oder If-Befehl gedacht. Bin noch ziemlicher Anfänger. Hat einer nh Idee wie ich das realisiere? Danke schon mal :slight_smile:

Link zum Schalter/Datenblatt ?

Wenn du dein Vorhaben verständlich erklären kannst, gibt es sicher auch Hilfe.
Und was willst du mit den Delays machen ?

Hi,

die Dinger haben doch meistens einen Pin (C) der je nach Stellung mit den anderen 4 Pins verbunden wird.
Also bei "0" mit keinem, bei "1" mit dem 1. Pin, bei "2" mit dem 2. Pin, bei "3" mit Pin 1 und 2 verbunden ist.

1 = 0001
2 = 0010
3 = 0011
4 = 0100 ...

Du musst also die 4 Datenpins des Schalters mit 4 Pins des Arduino auslesen.
Da der Arduino PullUps hat, den gemeinsamen Pin (C) auf GND, dann hast Du bei "0" an einem Pin eine logische "1" an Pin 1 oder 2 oder 3 oder 4 je nach Schalterstellung. Es gibt auch Schalter mit umgekehrter Logik.

Gruß André

ElEspanol:
Link zum Schalter/Datenblatt ?

tut mir leid hier : http://www.farnell.com/datasheets/10659.pdf?_ga=2.260001289.2088236960.1539000381-108444382.1521701453

HotSystems:
Wenn du dein Vorhaben verständlich erklären kannst, gibt es sicher auch Hilfe.
Und was willst du mit den Delays machen ?

also ich habe eine LED die ich dann zwischen 1 2 3 4 5 6s... umschalten will.

OK...das ist kein hexadezimal-kodierter Schalter, sonder ein BCD binärkodierter Schalter.

Wie du das machst, hat Spagetticode schon geschrieben.

SpaghettiCode:
Hi,

Du musst also die 4 Datenpins des Schalters mit 4 Pins des Arduino auslesen.
Da der Arduino PullUps hat, den gemeinsamen Pin (C) auf GND, dann hast Du bei “0” an einem Pin eine logische “1” an Pin 1 oder 2 oder 3 oder 4 je nach Schalterstellung.

Gruß André

also ich denke mal ich lese die Pins mit digitalRead aus. wie bekomme ich die ausgelesenen werte dann ins delay?

laberkop:
also ich denke mal ich lese die Pins mit digitalRead aus. wie bekomme ich die ausgelesenen werte dann ins delay?

Das geht über die von dir im Anfangspost zitierten Wege.

Du solltest es (für Anfänger sicher einfacher) mit "if-else" probieren. und ja, zuvor digital auslesen.

Und auf der ersten Seite des PDF sind die Tabellen drauf, welche Pins bei welcher Stellung geschlossen sind.

Hallo,

wie HotSystems schon geschrieben hat versuchst Du das am besten erst mal mit if ...else...

Die 4 Eingänge würde ich erst mal einlesen und auf bool Werte schreiben.

Die Tabelle nach der du vorgehen must um dann die 4 bool loisch verunden,kannst Du dem Datenblatt entnehmen. Inerhalb der if klammer kannst Du dann machen was Du willst und z.B. eine Variable mit einem Wert versorgen.

der Schnipsel unten ist nicht komplett !!!

IDE / Hilfe / Referenz da findest Du alles.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

  // ist nicht komplett !!!
  bool w1 = !digitalRead(pin3); // invertiert lesen damit positive Logik usw. für w2,w3,w4

  if (w1 && !w2 && !w3 && !w4) {
    wert = 1;
  }
  else (w1 && w2 && !w3 && !w4) {
    wert = 2;
  }
}

Mein Ansatz sähe eher so aus, anstatt der ganzen if Gräber und Logigverknüpfungen (ungeprüft):

byte x;
uint32_t delayzeit[] = {5, 25, 88, 46, 4, 99, 36, 14};
byte Datenpins[]={2,3,4,5};  

void setup() {
  
for (byte index=0;index<4;index++){
    pinMode(Datenpins[index], INPUT_PULLUP);  
  }
}

void loop() {
  for (byte index=0;index<4;index++){
    bitWrite(x, index, !digitalRead(Datenpins[index]));   // x kann somit 0-7 annehmen
  }
delay(delayzeit[x]);   // delay ist schlechte Lösung, hier zur demo

// stuff to to

}

Danke für die vielen antworten werd ich morgen direkt mal ausprobieren :slight_smile: