Spielprojekt

Moin,

habe ein kleines Projekt vor und leider noch keine Ahnung von Arduinos. Ich hänge mal ein Bild von meinem Plan an, damit es etwas verständlicher wird.

![](http://<a target=)

">

Zunächst einmal sollen die 10 Led´s nacheinander ein und ausgehen (am besten faden). Also eine Art Lauflicht bilden. Zusätzlich soll das Stop Licht leuchten. (Das Tasterlicht soll während des ganzen Vorgangs an bleiben). Bei Betätigung des Tasters soll das Lauflicht beendet und nur Licht 1 dauerhaft leuchten, sowie das Stop Licht erlischen und das Start Licht aufleuchten. Bei erneuter Betätigung soll das Start Licht erlischen und die 10 Led´s sollen schnell nacheinander aufleuchten. Bei dann weiterer Betätigung des Tasters soll die Led welche zu diesem Zeitpunkt an ist für 5 Sekunden an bleiben und danach soll das ganze wieder automatisch in die Ausgangslage zurückkehren.

Ist dieses Vorhaben mit einem Arduino Nano möglich? (Nano wegen des geringen Bauraums der zur Verfügung steht.) Ich müsste jede Led einzeln ansteuern, oder?

Wenn ja, wie schwer ist die Programmierung des ganzen?

Danke schonmal im voraus!

Hallo,

vielen Dank für die schnelle Antwort!
Okay dann bestelle ich mir mal einen Arduino Nano.
Das Verkabeln sollte kein Problem sein, eher das Programmieren.
Ja die Einzelnen Schritte habe ich mir aufgeschrieben. Gibt es eine Möglichkeit schon mit dem Programmieren anzufangen und es vielleicht mal durch zu spielen, ohne den eigentlichen Ardurino?

(deleted)

fjl07:
Ja die Einzelnen Schritte habe ich mir aufgeschrieben.

Das ist schon mal sehr gut.

Anstatt Dich gleich in die Programmiererei zu stürzen, solltest Du IMO erst einmal verinnerlichen, was Programmieren bedeutet: Ein Problem in kleine, lösbare Teilprobleme aufzuteilen.

Nimm z. B. das Kaffekochen: Vom Wunsch einen Kaffee zu trinken bis zur vollen Tasse muss die Kaffeemaschine befüllt und nach dem Einschalten eine Weile gewartet werden. Was würdest Du z.B. einem Kind aufschreiben, das Kaffee kochen soll? Stelle Dir vor, dass das Kind nur lesen und einfache Sachen machen kann.

HTH

Gregor

Vielen Dank euch!
Werde mich heute Abend mal rein lesen.
Minimale Programmiererfahrung habe ich schon durch mein Maschinenbaustudium, also ich habe es schon mal gesehen und auch erste Schritte Programmiert. Aber das Projekt übersteigt da doch meine Kompetenz.
Arduino ist bestellt. Kommt diese Woche vielleicht noch an.

Felix

fjl07:
Minimale Programmiererfahrung habe ich schon durch mein Maschinenbaustudium ...

„Minimal“ heißt vermutlich „EVA-Prinzip“? Dann hast Du quasi null Erfahrung.

Apropos Maschinenbaustudium: Software-Entwicklung ist die einzige Ingenieursdisziplin, die sich nicht mit physikalischen Gesetzen herumschlagen muss :slight_smile:

Gruß

Gregor

Also ich bin ja schon ein kleiner Fan von Ws2812b.
Die Versionen auf einer kleinen Leiterplatte habe ich immer zuhause, ich glaube mal 200 aus China bestellt.
Die nehme ich teilweise auch wenn ich nur 1 oder 2 LEDs im Projekt brauche.
Hier kann ich es auch empfehlen, sie sind einfach dimmbar und auch einfach ansprechbar.

fjl07:
...
Okay dann bestelle ich mir mal --> einen <-- Arduino Nano.
...

Tipp: Bestell gleich Mehrere - spätestens, wenn Du Blut geleckt hast oder Dir ein Nano verstorben ist, wirst Du MEHR brauchen - und nicht wirklich warten wollen.
Allerdings sind mir bisher nur 1 Nano und 1 Uno verstorben (wobei Einer 'nur' nicht mehr per USB erreichbar ist, per ISP komme ich noch dran).

MfG

Hallo,
also ich habe mit dem programmieren angefangen, stecke aber gerade etwas fest. Ich hänge mal den Code an, damit es vielleicht etwas verständlicher wird.

int LEDstart=0;
int LEDstop=1;
int taster=2;
int LEDtaster=3;
int LEDeins=4;
int LEDzwei=5;
int LEDdrei=6;
int LEDvier=7;
int LEDfuenf=8;
int LEDsechs=9;
int LEDsieben=10;
int LEDacht=11;
int LEDneun=12;
int LEDzehn=13;



int merker=0;
int tasterstatus=0;
int helligkeit= 0; 
int fadeschritte= 5;

int pinArray[] = {0,0,0,4,5,6,7,8,9,10,11,12,13,0,0,0};
int pinCount = 16;
int activePin = 2;
int dx = 1;
int mintime = 150; // Durchlaufzeit



void setup()
{
    pinMode(LEDeins, OUTPUT);
    pinMode(LEDzwei, OUTPUT);
    pinMode(LEDdrei, OUTPUT);
    pinMode(LEDvier, OUTPUT);
    pinMode(LEDfuenf, OUTPUT);
    pinMode(LEDsechs, OUTPUT);
    pinMode(LEDsieben, OUTPUT);
    pinMode(LEDacht, OUTPUT);
    pinMode(LEDneun, OUTPUT);
    pinMode(LEDzehn, OUTPUT);
    pinMode(LEDstart, OUTPUT);
    pinMode(taster, INPUT);
    pinMode(LEDstop, OUTPUT);
    pinMode(LEDtaster, OUTPUT);
    
Serial.begin(9600);
  for (int i=0; i< pinCount; i++) {
    if (pinArray[i] != 0) {
      pinMode(pinArray[i], OUTPUT);
    }
  }
}

void loop()
{


  tasterstatus=digitalRead(taster);
  if ((tasterstatus == LOW)&&(merker==0))
  {   

       analogWrite(LEDtaster, helligkeit);          //Taster LED faden lassen
       helligkeit = helligkeit + fadeschritte;
       delay(10);
       if (helligkeit == 0 || helligkeit == 220)
       {
       fadeschritte = -fadeschritte;
       } 

       digitalWrite(LEDstop, HIGH);                 //ohne Funktion, da LEDstop dauerhaft an ist



       for (int i=0; i<pinCount; i++) {             //Lauflicht 
       digitalWriteNot0(pinArray[i], LOW);
        }
 
       if (activePin == (pinCount-1)) {
       activePin = (pinCount - 2);
       dx = -1;
       }
 
       if (activePin == 0) {
       activePin = 1;
       dx = 1;
       }
 
       activePin += dx;  


    digitalWriteNot0(pinArray[activePin], HIGH);
  
    digitalWriteNot0(pinArray[activePin-dx], HIGH);
  
    digitalWriteNot0(pinArray[activePin-2*dx], HIGH);

 
  
  Serial.print(" - ");
  Serial.println(activePin);
 
  delay(mintime);
  



 }
 if((tasterstatus == HIGH)&&(merker==0))
 {
        
       digitalWrite(LEDstop, LOW);        //ohne Funktion?
       digitalWrite(LEDstart, HIGH);      //LED ebenfalls dauerhaft an?
       digitalWrite(LEDeins, HIGH);
       digitalWrite(LEDtaster, HIGH);
       
       digitalWriteNot0(pinArray[activePin], LOW);
       digitalWriteNot0(pinArray[activePin-dx], LOW);
       digitalWriteNot0(pinArray[activePin-2*dx], LOW);
         
       merker=1;
       delay(50);
  }
  if ((tasterstatus == LOW)&&(merker==1))
  {   
    
      merker=2;
      
  } 
  if ((tasterstatus == HIGH)&&(merker==2))
  {
     digitalWrite(LEDeins, LOW);

         
       merker=3;
       delay(50);
  }
  if ((tasterstatus == LOW)&&(merker==3))
  {   
    for (int i=0; i<pinCount; i++) {      //Kann ich hier die Schleife erneut einsetzen? 
       digitalWriteNot0(pinArray[i], LOW);
        }
 
       if (activePin == (pinCount-1)) {
       activePin = (pinCount - 2);
       dx = -1;
       }
 
       if (activePin == 0) {
       activePin = 1;
       dx = 1;
       }
 
       activePin += dx;  
       
    digitalWriteNot0(pinArray[activePin], HIGH);

    
  delay(mintime+analogRead(0)/4);
      merker=4;
 }
 if ((tasterstatus == HIGH)&&(merker==4))
 {
      merker=5;
      delay(50);
 }
 if ((tasterstatus == LOW)&&(merker==5))
 {
      merker=0;
 }

    Serial.print("Merker= ");
    Serial.println(merker);
       
} //Loop ENDE


void digitalWriteNot0(int pin, boolean state) {
  if (pin > 0) {
    digitalWrite(pin, state);
  }
}

Beim anschalten läuft wie gewollt das Lauflicht durch, und die LEDtaster faded. Jedoch leuchten die Led´s von Start und Stop dauerhaft. Könnte das daran liegen, dass ich diese auf den Pins 0 und 1 liegen habe? also RX0 und TX1.

Nach Betätigung des Tasters geht wie gewollt die LEDeins an und das Lauflicht hört auf zu laufen, jedoch nach erneuter Betätigung des Tasters fängt dieses nicht wieder an zu laufen, sonders es geht nur eine zufällige Led an. Könnte das daran liegen, das die for-Schleife im Hintergrund weiter läuft und bei der erneuten Betätigung der Befehl digitalWriteNot0(pinArray[activePin], HIGH); ausgeführt wird?

MfG Felix

also RX0 und TX1.

Ja!
Sind ja dauerhaft von der Seriellen belegt.

Verwende doch die analogen Pins.

fjl07:
Könnte das daran liegen, dass ich diese auf den Pins 0 und 1 liegen habe? also RX0 und TX1.

Ja, 0 und 1 bitte nicht verwenden, auch nicht in pinArray.

A0 entspricht Pin 14.

int LEDeins=4;
int LEDzwei=5;
int LEDdrei=6;
int LEDvier=7;

Und bitte bitte Arrays lernen bzw verwenden.
Uwe

fjl07:
also ich habe mit dem programmieren angefangen ...

Du bist scheinbar ein richtig wirklich echter Anfänger. Gewöhne Dir vom Start weg an, Code so zu „formatieren“, dass er leicht ins Hirn flutscht. Einheitliche Einrückungen, Leerzeilen nur wo nötig ...

Was das Schreiben Deines Programms angeht: Mach Dich zuerst mit nur einer LED vertraut. Wenn Du die ein-/ausschalten und dimmen kannst, nimmst Du weitere LEDs dazu. Nebenher machst Du Dich schlau, wie das mit dem Programmieren und Variablenverwenden ist ...

Wenn Du ein rweA bist hast Du viel vor :slight_smile:

Gruß

Gregor

Moin,

das mit den analogen Pins hat geklappt. Die restlichen Anmerkungen werde ich versuchen um zu setzen. Vielleicht doch etwas zu viel für einen Anfänger.

Felix

fjl07:
Ich hänge mal ein Bild von meinem Plan an, damit es etwas verständlicher wird.

Moin, dafür gibt es schon mal einen Sympathiepunkt :slight_smile:

fjl07:
Zunächst einmal sollen die 10 Led´s nacheinander ein und ausgehen (am besten faden).
...
Ist dieses Vorhaben mit einem Arduino Nano möglich?

Der Nano hat nur sechs Hardware-PWM-Ausgänge, weshalb das Faden in Software realisiert werden muß. Dazu empfehle ich die über die Bibliotheksverwaltung der IDE zu installierenden MobaTools, die auch hinsichtlich der Tastenentprellung zu dieser Aufgabenstellung passen.

Da ich Dein Spiel nicht verstehe, Dir aber den Spaß am selber Programmieren natürlich auch nicht nehmen möchte, habe ich nur mal das Lauflicht mit dem Ein- und Ausblenden der LEDs realisiert. Wenn Du magst, kannst Du das als Grundlage verwenden. Eine Schrittkette habe ich im Ansatz eingebaut (getestet mit UNO, dem großen Bruder vom Nano):

#define MAX8BUTTONS
#include <MobaTools.h>

const uint32_t BLENDZEIT = 200;
const byte taster = 2;
const byte LEDstart = 5;
const byte LEDstop = 6;
const byte LEDtaster = 7;
const byte pinArray[] = {8, 9, 10, 11, 12, 13, A0, A1, A2, A3};
const byte pinCount = sizeof(pinArray);
uint32_t jetzt;
enum {LAUF, AUSSCHALTEN, AUS};
byte schritt = LAUF;

button_t getHW( void ) {    // User-Callback-Funktion für Tasterstatus
  return (button_t) !digitalRead(taster);
}

MoToButtons Taster( getHW, 20, 500 );
MoToSoftLed meineLeds[pinCount];

void setup() {
  //Serial.begin(115200);
  //while(!Serial);
  //Serial.println("Anfang");
  pinMode(taster, INPUT_PULLUP);
  pinMode(LEDstart, OUTPUT);
  pinMode(LEDstop, OUTPUT);
  pinMode(LEDtaster, OUTPUT);

  for (byte led = 0; led < pinCount; led++) {
    meineLeds[led].attach(pinArray[led]);
    meineLeds[led].riseTime( BLENDZEIT );    // Aufblendzeit in ms
  }
}

void loop() {
  Taster.processButtons();
  jetzt = millis();
  switch (schritt) {
    case LAUF: lauflicht();
      if (Taster.pressed(0)) {
        schritt = AUSSCHALTEN;
      }
      break;
    case AUSSCHALTEN:
      for (byte led = 0; led < pinCount; led++) {
        meineLeds[led].off();
      }
      schritt = AUS;
      break;
    case AUS:
      if (Taster.pressed(0)) {
        schritt = LAUF;
      }
      break;
    default:
      schritt = LAUF;
  }
}
void lauflicht() {
  static uint32_t vorhin = jetzt;
  static byte led = 0;
  static bool ein = true;

  if (jetzt - vorhin >= BLENDZEIT) {
    if (ein) {
      meineLeds[led].on();
    } else {
      meineLeds[led].off();
      led = (1 + led) % pinCount;
    }
    vorhin = jetzt;
    ein = !ein;
  }
}

fjl07:
Moin,

das mit den analogen Pins hat geklappt. Die restlichen Anmerkungen werde ich versuchen um zu setzen. Vielleicht doch etwas zu viel für einen Anfänger.

Felix

gut.
Wenn Du Fragen hast, wir sind hier.
Grüße Uwe

Moin,

danke für die Hilfe! Ich habe einen alten Spielautomaten ausgeschlachtet und bin gerade dabei ihn zu einer Bar umzubauen. Da ich aber den Spielautomaten Gedanken gerne beibehalten würde hatte ich diese Programmierung vor. Der Spielautomat besitzt noch einen Taster, welcher beleuchtet ist, ein Start- und ein Stoplicht, sowie eine beleuchtete Zahlenreihe von 1-10. (Lichter werden natürlich durch Led´s ersetzt)
Mein Gedanke war es, dass nach dem Anschalten des Automaten ein Lauflicht die Zahlenreihe hoch und runter läuft. Ebenfalls soll die Tasterbeleuchtung pulsieren und der Stop Schalter leuchten.

  1. Nach erster Betätigung des Tasters soll dann das Lauflicht beendet werden, die Led von Nummer eins leuchten, der Taster in einen Dauerleuchtzustand gehen, das Stop Licht erlischen und dafür das Start Licht angehen.

  2. Nach erneuter Betätigung soll dann das Lauflicht wieder angehen (aber deutlich schneller durchlaufen)

  3. Jetzt soll bei erneuter Betätigung die Led, welche zu diesem Zeitpunkt an ist aufleuchten, das Startlicht soll erlischen und das Stop licht angehen.

Nach 5 Sekunden soll das ganze dann automatisch wieder in den Ausgangszustand zurückkehren.

also eine Art Mini- Spiel. Ist es jetzt verständlicher geworden ?

Felix

Schritt 0 soll zum Spielen animieren, also "Hallo spiel mit mir!" ausdrücken. Ist verständlicher.

fjl07:
(Lichter werden natürlich durch Led´s ersetzt)

Glühbirnen sind Vintage, mit Treiber ginge das auch.

fjl07:
... ein Lauflicht die Zahlenreihe hoch und runter läuft.

Ja, besser als nur in eine Richtung.

fjl07:
... die Led, welche zu diesem Zeitpunkt an ist aufleuchten, ...

Wenn es an ist, soll es leuchten?

agmue:
Wenn es an ist, soll es leuchten?

Schlecht formuliert. Die Led, welche bei Betätigung des Tasters gerade aufleuchtet, soll dann für 5 Sekunden dauerleuchten, bevor das Spiel wieder in die Ausgangslage zurückgeht.

agmue:
Schritt 0 soll zum Spielen animieren, also "Hallo spiel mit mir!" ausdrücken. Ist verständlicher.

Ja genau

agmue:
Glühbirnen sind Vintage, mit Treiber ginge das auch.

Bin mit dem Programmieren des Spiels schon überfordert, alles was es noch komlexer macht versuche ich zu vermeiden :smiley:

agmue:
Ja, besser als nur in eine Richtung.

Denke ich auch, einmal hoch und dann wieder runter

Dann rate ich Dir zu WS2812 oder ähliche. Das sind SMD 5x5mm LED mit integrierten Controller. Die gibt es als Streifen mit verschiedener Anzahl von LED pro Meter.
Der Vorteil ist daß Du alle LED mit einem Ausgang ansteuern kannst.
Bibliotheken: FastSPI FastLED oder FastSPI_LED oder Neopixel.

Grüße Uwe