Brauche Hilfe für Spiel

Hallo,

Ich habe schon ein paar Dinge mit Arduino gemacht, bin aber neu damit und ich bräuchte eure Hilfe. Mein Sohn wünscht sich zu Weihnachten einen „Tresor“. Er ist 5 und ich möchte eher keine Zahlen verwenden, also kein Codeschloss im Sinne 5 mal Knopf 1 drücken und 2 mal Knopf 2 drücken oder ähnliches um ein Magnetschloss zu öffnen. Dazu gibt es genügend Anleitungen und damit hätte ich auch programmiertechnisch kein Problem.

Ich möchte Kippschalter verwenden, da diese rumliegen und mein Sohn mag solche Schalter. Diese sind On/off/on. Ich könnte nun eine einfache Reihenschaltung machen, und daraus aus den jeweils 2 On Positionen meiner 4 Schalter eine Kombination machen. 2 hoch 4 sind aber nur 16 Möglichkeiten und das ist mir dann doch zu wenig. Mehr Schalter will ich nicht verwenden. 3 hoch 4 wären dann schon einige mehr. Dazu würde ich gerne „off“ also gar kein Signal mit dazu nehmen. Die 4 Schalter sollen also ein Relais mit Magnetschloss bemühen, wenn z.b. 1 auf oben on, 2 auf unten on, 3 auf off und 4 wieder auf oben on steht.

Mit Arduino habe ich nun das Problem, dass ein eingeschaltet bleibender Schalter ( verbleibt auf on) ja kein Signal ausgibt, sondern nur dann, wenn er wieder ausgeschaltet wird. Gibts da grundsätzlich eine geeignete Programmierung um mein Vorhaben zu realisieren? Ich habe bisschen was mit den analogen Inputs gefunden, aber da habe ich ja nur 6 inputs. Gerne würde ich die digital ins benutzen, da ich mit den analogen noch nichts bisher gemacht habe.

Ich würde mich sehr über eure Hilfe freuen. Ein fertiger Code inkl. Schaltbild wäre traumhaft! Bin berufstätig und habe nicht so viel Zeit leider. Trotzdem möchte ich meinem Sohn einen langen Wunsch erfüllen.

Herzliche Grüße,

Chinacracker

Chinacracker:
... Er ist 5 und ich möchte eher keine Zahlen verwenden ...

Möglicherweise verstehe ich Dich falshc. Du hast 4 Schalter, die jeweils 3 Zustände annehmen können. Du benötigst für die vier Schalter doch nur vier Analogeingänge. Wenn Du jeweils eine der AN-Positionen mit einem Widerstand versiehst, kannst Du mit einem Schalter problemlos drei klar unterscheidbare Zustände an den Analogeingängen erzeugen: AN--AUS--„Dazwischen“.

HTH

Gregor

Hallo Gregorrs,

danke für deine schnelle Antwort. Du hast schon richtig verstanden. Wie gesagt, mit analog in tue ich mich noch schwerer. Hättest du mir dazu eine kleine Schaltskizze bzw. wie müsste ich das programmieren. Gibts da ev. ein ähnliches Beispiel?

Tausend Dank!

Hallo,
ein Schalter hat 3 Zustände. Als Kontakt eine Wurzel, und zwei Kontake an.
Also 4 Schalter mit zusammen 8 Kontakten on.
Das sind 8x8 Möglichkeiten.

Auf die Wurzel legst Du 5v.
Die 8 on-Kontakte auf D0 bist D7.
Die Eingänge fragst Du auf High/Low ab.

Ein Port sollte so "aussehen" wenn alle LOW

00000000

oder wenn geschaltet ist…

00011011

Oder habe ich da einen Denkfehler?

Gruß und Spaß
Andreas

SkobyMobil:
...
Oder habe ich da einen Denkfehler?
...

Wenn ich verstehen würde, was Du meinst, könnte ich Dir eine ordentliche Antwort geben :slight_smile:

Für den Chinakracher:

Das sind allerdings mehr als nur 1 Widerstand je Schalter. Zur Erklärung: Links befindet sich ein Widerstand, der die Leitung „hochzieht“, wenn der Schalter in der mittleren Position ist (wie gekritzelt, analogRead() ergibt 1023). Wenn der Schalter nach links geschaltet wird, wird der Analogeingang mit GND verbunden (analogRead() ergibt 0). In der rechten Position ist er mit einem Spannungsteiler verbunden (das ist die „Dazwischen-Position“). Für die Widerstände nimmst Du einfach 3 gleiche Werte (z. B. 10 kOhm), dann kommst Du ungefähr auf 1023--0--512).

Gruß

Gregor

SkobyMobil:
Oder habe ich da einen Denkfehler?

Ich denke, ja, da ich nichts von PullUp oder PullDown lese.

Meine Variante: alle acht Eingänge mittels INPUT_PULLUP auf HIGH legen und die Wurzel an GND. Aktiv ist dann LOW, alle in Mittelstellung 11111111.

@gregorss: Mit INPUT_PULLUP kannst Du den linken Widerstand sparen, dürfte die Meßwerte nur geringfügig stören. Da nutzt man ja eh einen Wertebereich.

Hallo,
na, er hat doch vier Schalter.
Diese Schalter haben 4 Eingänge, die Wurzel.
Diese Schalter haben 8 Ausgänge.
Wenn ich 8 Ausgänge habe, dann kann ich 64 Zustände erstellen.
8 Ausgänge auf 8 digitale Eingänge.

Für Schalter A, B, C und D

0-1-0 A
0-1-0 B
0-1-0 C
0-1-0 D

jetzt hast Du an acht digitalen Eingängen LOW

0-1-1 A
0-1-0 B
0-1-0 C
0-1-0 D

jetzt hast Du an sieben digitalen Eingängen LOW, und an einem HIGH
alles klar?
So meinte ich das, vier Wiederstände reichen.
Gruß und Spaß
Andreas

agmue:
@gregorss: Mit INPUT_PULLUP kannst Du den linken Widerstand sparen, dürfte die Meßwerte nur geringfügig stören. Da nutzt man ja eh einen Wertebereich.

Uh, ja. Nachts um 2 Uhr bin ich normalerweise nicht mehr in der Lage, intellektuelle Höchstleistungen zu vollbringen.

Statt der zwei Widerstände könnte Chinakracher auch einen Trimmer benutzen.

Gruß

Gregor

PS: Offensichtlich kann ich auch mittags ziemlich dämlich sein. Statt des Spannungsteilers am rechten Kontakt genügt 1 Widerstand gegen GND. Der Spannungsteiler wird durch den genannten Widerstand und den Pull-up-Widerstand gebildet.

PPS: Ein Beispiel für eine Anwendung eines Analog-Eingangs befindet sich hier.

SkobyMobil:
Auf die Wurzel legst Du 5v.

SkobyMobil:
Für Schalter A, B, C und D in Mittelstellung off

0-1-0 A
0-1-0 B
0-1-0 C
0-1-0 D

jetzt hast Du an acht digitalen Eingängen LOW

Nö, die Eingänge hängen in der Luft und betätigen sich als Elektronenfänger. Daher benötigst Du für jeden Arduino-Eingang einen PullDown-Widerstand. Acht Eingänge, acht Widerstände.

Oder Wurzel an GND und die internen PullUps nutzen, macht den geringsten externen Aufwand.

gregorss:
Statt der zwei Widerstände könnte Chinakracher auch einen Trimmer benutzen.

Zwei 4,7kOhm (das zehnfache der internen PullUps) sollten genügen. Den Vorteil des Trimmers sehe ich nicht, außer er fällt zufällig auf die Platine :wink:

Hallo,
hast Recht, Acht Eingänge, acht Widerstände.
Gruß und Spaß
Andreas

SkobyMobil:
Wenn ich 8 Ausgänge habe, dann kann ich 64 Zustände erstellen.

In diesem Falle nicht korrekt.
Wenn alle 8 Eingänge unabhäng wären, ja.
Aber so haben wir kein binäres System, in dem zwei Werte existieren, sonder ein "terziäres" System, in dem 4 Schalter je 3 Werte annehmen können, 3^4=81 Möglichkeiten.

Beschalten könnte man das so:

gregorss:
Der Spannungsteiler wird durch den genannten Widerstand und den Pull-up-Widerstand gebildet.

Wobei mir gerade Zweifel kommen, ob der interne PullUp den Kondensator vom analogen Eingang auch schnell genug auflädt :-[

Wenn ich irgendwo eine 50kOhm rumfliegen habe ...

Hallo ihr lieben,

toll, dass meine Aufgabe wohl auch für Denksport sorgt und ein bisschen Anregung findet. Ich habe einige gleiche Widerstände rumfahren. Ich bin von dem ganzen nun aber ein bisschen durcheinander. Was ist denn nun die richtige Lösung. Ich habe ein Breadbort...könnte mir das jemand da ein bisschen einzeichnen? Wie ich das dann programmieren muss habe ich noch keinen Durchblick. Ich weiß eure Hilfe sehr zu schätzen.

Herzliche Grüße!

Chinacracker:
... Was ist denn nun die richtige Lösung. ...

Ich habe das mal schnell ausprobiert. Um ein klares „Dazwischen“ zu erzeugen, brauchst Du zwei Widerstände je Schalter, die Du so anschließt, wie ich oben gekritzelt habe (die beiden kleinen, für den Spannungsteiler). Die Widerstände müssen nicht unbedingt gleich groß sein, ich habe zwei 4,7 kOhm-Widerstände benutzt.

Wenn der interne Pullup-Widerstand am Analog-Pin aktiviert ist, kannst Du Dir den externen (links der große) Widerstand sparen.

Der Sketch, mit dem ich das auf die Schnelle probiert habe, sieht so aus:

const byte switchPin=A0;

void setup()
{
  Serial.begin(9600);
  pinMode(switchPin, INPUT_PULLUP);
}

void loop()
{
  delay(1000);
  Serial.println(analogRead(switchPin));
}

Die ausgegebenen Werte waren 1022, 550 und 0.

Gruß

Gregor

Hallo Gregor,

schön! Ich danke dir schon mal vielmals. Könntest du das noch ein bisschen weiter ausführen wie ich das auslese und als if Aufbau realisiere. Kann ein Beispiel sein, dass ich dann als Schema für weitere Schalter erweitere. Wie gesagt, sind analoge Eingänge und die Befehle dazu Neuland. Wenn ich ein Beispiel habe, dass ich mit diesem Schema dann selbst schreiben kann, wäre ich super happy. Wenn jemand Lust hat mir einen Fritzing Schaltplan zu basteln gebe ich einige Biere aus! Vielleicht gibt es ja noch andere Väter die das mal nachbauen wollen.

Herzliche Grüße und echt vielen vielen Dank! Er wird sich freuen!

Chinacracker:
... Könntest du das noch ...

Eigentlich sind das Zeichnen eines Schaltplans und das Kennenlernen der erforderlichen Anweisungen Deine Aufgabe. Du kannst hier dann jederzeit mit Kritzeleien oder Programmen antanzen und fragen, ob das so okay ist :slight_smile:

Aber ich komme Dir einen Pin entgegen. Die anderen drei sind dann analog. Für's Kritzeln brauche ich allerdings ein bisschen Zeit ...

Gruß

Gregor

PS: Der Plan:

Danke schon mal. Ich versuche mich daran.

Hallo Gregor,
was Du zeichnest, ist ein Umschalter. Der verwendete Schalter ist aber ein On/Off/On-Schalter.

  • Schalter links: Mitte verbunden mit linkem Pin
  • Schalter mittig: nichts verbunden
  • Schalter rechts: Mitte verbunden mit rechtem Pin

Mir gefällt die Variante von Gunther aus #10 (analoge Auswertung) am besten, so man denn analoge Eingänge verwenden möchte.

Hallo,

die Schaltung von Gregor funktioniert und ich kann 3 unterschiedliche Wetrte auslesen. 1023, 0, und 562. Ich habe einen Versuchscode mit LED geschrieben. Es ist mir klar, dass ich später lieber eine Range und nicht einen genauen Wert angeben sollte, wie man das programmiert muss ich aber erst noch checken. Daher erst mal Schritt für Schritt mit einem fixen Wert und einer LED. Aber ich bekomme einen Fehler, den ich nach nach vielem googeln nicht lösen konnte. Bin immAusland auf Montage und das inet ist mies. Ach je.

20171119_002718_resized.jpg

Chinacracker:
Es ist mir klar, dass ich später lieber eine Range und nicht einen genauen Wert angeben sollte, ...

if(wert > 800){
  // Stellung 1
} else if(wert < 100){
  // Stellung 2
} else {
  // Stellung 3
}

Chinacracker:
Aber ich bekomme einen Fehler, ...

Willst Du ihn verraten?