arduino nano led cube mit taster

Hallo
Ich habe einen arduino nano und mit diesem und 64 blauen LEDs einen 4x4x4 Würfel gebastelt (nach YouTube howto).

Mein Problem ist nun ich würde gerne durch einen tastendruck auf einen Taster etwas im Programm auslösen z.b. das das blinken sich ändert.

Leider habe ich keine pins/ports mehr frei, außer A6 und A7 .
Ich habe schon diverse Ansätze aus dem Internet probiert aber komme zu keinem brauchbaren Ergebnisse.

Kann mir dabei vielleicht jemand helfen der sich mehr auskennt als ich?

Meine Ideen wären auch nicht ein high/low signal auf die TX oder RX (was davon auch immer für den Empfang zuständig ist) Schnittstelle zu geben und damit den Programm aublauf zu ändern.

(Als debug hatte ich noch den Versuch gemacht den Programm Ablauf via serial Eingabe zu ändern. Aber irgendwie hatte ich sogar da probleme. Das wenn ein ausgewählter programmabschnitt lief . dann nicht überprüft wurde ob währenddessen nochmal die taste gedrückt wurde)

Ich schätze mal hier sind viele Leute die bestimmt noch bessere ideen haben als ich.

Vielen dank schon mal im voraus.

flexcon:
Leider habe ich keine pins/ports mehr frei, außer A6 und A7 . ...

Das ist doch schon was. Hilfreich wäre jedenfalls, wenn Du noch den momentan funktionierenden Sketch und evtl. Schaltplan posten könntest.

Gruß

Gregor

Na zwei freie Analogeingänge sind doch super, da kannst du sogar mehr als zwei Taster oder Schalter anklemmen.
Zum Beispiel an einem Eingang zwei Taster für Bildänderung rauf/runter und am anderen Eingang ein Poti mit dem die Geschwindigkeit verändert wird. Oder oder oder...

Aber, um Vorschläge machen zu können, wie dies Software mäßig aussieht, muss man die Software erst mal kennen.

Den Schaltplan braucht man dafür nicht, du hast ja schon geschrieben das A6 und 7 noch frei sind. Außer jemand möchte sich auch einen Würfel bauen :wink:

Gruß

MiReu

(Als debug hatte ich noch den Versuch gemacht den Programm Ablauf via serial Eingabe zu ändern. Aber irgendwie hatte ich sogar da probleme. Das wenn ein ausgewählter programmabschnitt lief . dann nicht überprüft wurde ob währenddessen nochmal die taste gedrückt wurde)

Ich befürchte dieses Problem wirst Du ohne radikale Programumgestaltung nicht lösen.
Wenn Du die Zeiten millels delay() machst ist der Sketch einfach mit dem beschäftigt und Tasten oder die serielle Schnittstelle werden nicht gelesen.

Grüße Uwe

Wow ich bin überrascht so viele hilfreiche und zuversichtliche Antworten.
Danke.

Das ist der fertige würfel momentan.

gebaut habe ich den nach dieser Anleitung 1zu1

mein sketch sieht momentan so aus

Anhang Sketch.txt

ich dachte mir das wenn man auf die Taste drückt das das abarbeiten der unterprogramme dann anhält und solange ein unterprogramm geloopt wird bis man ieder die taste drückt oder das teil resettet wird

unterprogramme:

{

turnEverythingOff();
flickerOn();
turnEverythingOn();
delay(time);
zusatz();
turnOnAndOffAllByLayerUpAndDownNotTimed();
layerstompUpAndDown();
spiralInAndOut();
turnOnAndOffAllByColumnSideways();
delay(time);
aroundEdgeDown();
turnEverythingOff();
randomflicker();
randomRain();
diagonalRectangle();
goThroughAllLedsOneAtATime();
propeller();
spiralInAndOut();
flickerOff();
turnEverythingOff();
delay(2000);
}

oder vielleicht hat jemand noch eine bessere idee.


Hier hatte ich dann noch versuche gemacht die mich aber auch nicht weiter brachten

Anhang versuche.txt


vielen dank für die mithilfe.

sketch.txt (15.8 KB)

versuche.txt (1.75 KB)

Wie Uwe schon vermutet hat, verwendet das Programm das blockierende delay(). Ich sehe zwei Lösungsansätze:

  • Du schreibst das Programm um, in dem Du auf blockierende Programmierung verzichtest. Dann kannst Du auch Taster abfragen.
  • Du verwendest Schalter, die immer dann abgefragt werden, wenn das Programm mal Zeit dafür hat.

Du verwendest Schalter, die immer dann abgefragt werden, wenn das Programm mal Zeit dafür hat.

ah z.b. das man zwischen den unterprogrammen jedesmal den schalter abfragt und ggf dann das letzte programm loopt.

Du schreibst das Programm um, in dem Du auf blockierende Programmierung verzichtest. Dann kannst Du auch Taster abfragen.

das ist auch eine grute idee

leider habe ich bei beiden keinen richtigen ansatz wie ich die prüfung schreiben kann bzw das sketch so um schreibe das keine delay() mehr drin sind

Mehr IOs erhälst Du mittels MCP23017 und der Bibliothek von Adafruit.

Zu 2. Du ersetzt delay(zeit) durch verzoegerung(zeit) und fragst innerhalb von dieser Funktion den Schalterzustand ab und veränderst Variablen entsprechend.

Zu 1. Suche im Forum nach "agmue anleitung", da findest Du entsprechende Anleitungen.

zu 1: Millis()

zum Löten: es gibt auch sowas:

zB bei Breakout Board für Arduino Nano | Terminal Adapter | eBay

Also das mit dem MCP23017, fällt warscheinlich erstmal aus.
ich habe leider nur den arduino nano hier und keine weiteren elemente.

ja dann werde ich mir das mal alles anschauen und probieren was zusammen zu basteln.
mal sehen wie ich das mache. leider kenne ich mich mit programmiersprachen noch nicht so richtig aus. und mit arduino habe ich jetzt erst angefangen,.

danke trotzdem.

flexcon:
ja dann werde ich mir das mal alles anschauen und probieren was zusammen zu basteln.
mal sehen wie ich das mache. leider kenne ich mich mit programmiersprachen noch nicht so richtig aus. und mit arduino habe ich jetzt erst angefangen,.

Ich habe die bisherigen Antworten nicht gelesen. Womöglich ist mein Vorschlag also „von gestern“:

Wenn Du zwei analoge Pins frei hast, kannst Du zum Beispiel prima mit LDRs spielen. Das sind Widerstände, die je nach Lichteinfall den Wert ändern. Also zum Beispiel: Je mehr Licht LDR x sieht, desto heller wird die vordere/rechte/obere Ecke des Würfels (oder die Mitte, oder der Würfel wird irgendwo dunkler).
Schon mit LDRs lässt sich sehr gut spielen. Dito mit einem simplen Poti.

Man kann auch mit geringem Aufwand einen Haufen Spaß haben :slight_smile:

Gruß

Gregor

PS: Wenn Du ein Arduino-Anfänger bist, dann lies hier gelegentlich mit. Ich finde dieses Forum irre lehr- und hilfreich.

Hi leute;
also ich habe eine für mich akzeptable Lösung gefunden.

Ich habe einen 3 Poligen Schlater genommen und schalte mit diesem wechselnd Masse oder +5v auf den Pin A6.
Im Anhang eine kleine zeichnung.

Damit erreiche ich beim "analogRead(schalter)" immer einen absoluten Werten von,
0 für GND (Masse)
und
1023 für +5v

und damit frage ich dann einfach nach jedem unterprogramm den Schalterzustand ab.
Dieser sagt dann ob das eine unterprogramm wiederholt werden soll oder das nächste abgespielt wird.

Ich denke damit kann ich leben.

Dennoch bedanke ich mich bei euch allen für eure Hilfreichen Tipps.

Beispiel Sketch

int layer[4] = {A3, A2, A1, A0}; //initializing and declaring led layers
int column[16] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 1, A5, A4}; //initializing and declaring led rows
int time = 250;
int schalter = A6;
int schalterzustand;

void loop()
{
  turnEverythingOff();
  flickerOn();
  while (schalterzustand = analogRead(schalter) == 1023)
  {
    flickerOn();
    Serial.println("Schalter Loop");
  }
//-------------------------------------------------
  turnEverythingOn();
  while (schalterzustand = analogRead(schalter) == 1023)
  {
    turnEverythingOn();
    Serial.println("Schalter Loop");
  }
  delay(time);
//-------------------------------------------------
  turnOnAndOffAllByLayerUpAndDownNotTimed();
  while (schalterzustand = analogRead(schalter) == 1023)
  {
    turnOnAndOffAllByLayerUpAndDownNotTimed();
    Serial.println("Schalter Loop");
  }
//-------------------------------------------------
  layerstompUpAndDown();
  while (schalterzustand = analogRead(schalter) == 1023)
  {
    layerstompUpAndDown();
    Serial.println("Schalter Loop");
  }
//--------------------------------------------------

A6 schaltung.jpg

flexcon:

  • A6 schaltung.jpg

Mach' die „- 5 V“ da weg, bevor's jemand sieht :slight_smile:

Gruß

Gregor

Ich würde aber trozdem einen Spannungsteiler mit 2 gleichen Widerständen (10kOhm) an den analogen Eingang schalten damit dieser einen definierten Pegel hat wenn der Schalter in Mittelstellung ist. Dies weil ich annehme daß das nicht ein 3-poliger Schalter ist sondern ein Schalter mit 3 Positionen.

Grüße Uwe

Der Schalter nennt sich "1x um" oder auch ON/ON oder einpoliger Wechsler. Nur weil dieser drei Anschlüsse hat heißt er nicht [...]3 Poligen Schlater[...]!

Und, warum schließt dur -5V und Masse (GND) kurz? Wo kommen die -5V eigentlich her?

Nagut, ich nehme, wie Gregor, an, dass dies nur ein "Tippfehler" war bzw. ist.

Aber, nichts desto Trotz ist die Schaltung schlecht. So hast du im Umschaltmoment einen offenen Eingang. Mein Vorschlag, mach nen 10k Pulldown an den Eingang A6 und lasse den von dir mit [...]-5v GND[...] beschrifteten Eingang vom Schalter offen. So liegt A6 IMMER an Plus oder über den Widerstand an Masse, aber niemals offen.

Gruß

MiReu

Ja stimmt war ein schreib fehler.
der schalter hat nur zwei positionen/stellungen.
und legt beim schalten entweder +5v oder GND an den Pin A6.
wenn ich nichts an den pin anlege dann bekomme ich auch keine absoluten werte von 0 und 1023 . sondern die schwanken dann die ganze zeit zwischen 200-800.
also auch wenn der schalter mal so ungünstig stehen sollte das werder +5v nocht GND anliegen. dann läuft das programm einfach nur normal durch.

Ich würde dennoch zur Sicherheit einen Pulldownwiderstand verwenden und nicht auf 1023 testen sondern >900.

Grüße Uwe

OK dann werde ich das so machen.

Vielen dank