4LED Binärzähler PIN-Array?

Hi Folks,

meine Freundin hat mir gestern den gewünschten Arduino UNO geschenkt, und heute musste ich natürlich direkt anfangen...

Mein Ziel ist es, einen Binärzähler zu bauen, der von 0000 bis 1111 zählt.

4 LEDs habe ich schon mit den PINs 2-6 verbunden.

Als erstes habe ich ein Lauflicht geschrieben, welches tatsächlich jede einzelne LED nacheinander ein und ausschaltet.
Dann habe ich einen Codeschnipsel gefunden der diese Lauflichtfunktion in eine loop-Schleife verpackt, ist sinnvoller.

Meine Frage: kann ich (in Ermangelung eines Schieberegisters) ein PIN-Array definieren , sodass ich nur ein byte an dieses Array schicke und demnach die LEDs leuchten?

Also in Hochsprache: "gebe 0110 auf meinem LED-Array aus"
und dann würden die LEDs 2 und 3 leuchten?

Dann könnte ich ja in einer Schleife hochzählen und in jedem Schritt den wert in byte umwandeln und einfach an das Array schicken.

In erwartungsvoller Vorfreude

nahtanoy

4 LEDs habe ich schon mit den PINs 2-6 verbunden.

Das sind 5 Leds oder PIN 2-5. Ich hoffe Du hast Vorwiderstände an die LED getan.

Meine Frage: kann ich (in Ermangelung eines Schieberegisters) ein PIN-Array definieren , sodass ich nur ein byte an dieses Array schicke und demnach die LEDs leuchten?

Ja ist möglich.

Also in Hochsprache: "gebe 0110 auf meinem LED-Array aus"
und dann würden die LEDs 2 und 3 leuchten?

Das müßten dann die LEDs 3 und 4 sein.
Grüße Uwe

dein aktueller wert ist in einer byte variable.

dann liest du das entsprechende bit mit bitread aus.

also

wenn bitread(zählvariable,bit) == 1 dann entsprechende led an; else led aus;
das ganze 4 mal für die entsprechenden bits und leds.

dann gäbe es noch die möglichkeit mit << >> zu shiften.

@uwefed:

Du hast recht, das war der Unterschied zwischen zählen und rechnen, ich habe beim schreiben nur Pin2 im Kopf gehabt und 4 addiert, tut mir leid.
Ja, ich habe Vorwiderstände benutzt.
Du hast mir eine sehr präzise Antwort gegeben, leider etwas zu präzise, vielleicht hättest Du mir mehr geholfen wenn Du einen Lösungsansatz mit aufgeführt hättest.
Wenn ich 4 LEDs habe, leuchten LED 2+3, die wären an Pin 3+4.

@PhunThom:

Dankeschön, deine Antwort hat mir schon viel weiter geholfen als LED-zählerei und eine Bestätigung der Möglichkeit.

Bis jetzt habe ich es folgendermassen gelöst, vielleicht habt Ihr ja noch Verbesserungsvorschläge:

void setup (){
  Serial.begin(9600);              //Serielle Ausgabe einleiten zum debuggen
   for (int loop = 2; loop < 6; loop++){
        pinMode (loop, OUTPUT);    // PINs 2-5 definieren
        digitalWrite (loop, LOW);  // PINs direkt ausschalten
   }
}
byte binwert;                      // definiert eine Variable als byte

void loop(){
  for (int zaehler=0; zaehler < 16;zaehler++){ //zählt von 0 bis 15 (also 16 Schritte)
    delay(500);                    // wartet eine halbe Sekunde, für die Optik
    binwert = byte(zaehler);       // schreibt die aktuelle Zahl als binärwert in binwert
    Serial.println(binwert,BIN);   // gibt den aktuellen binärwert Seriell aus (nur zum debuggen)
    for (int n=0; n <4; n++){      // zählt von 0 bis 3 (4 Schritte) um jedes einzelne bit des halbbytes abzufragen
      if (bitRead(binwert,n)==1){  // wenn das aktuelle bit eine eins ist
       digitalWrite(n+2,HIGH);    // setze den entsprechenden PIN auf 1
      }
      else{
       digitalWrite(n+2,LOW);     // ansonsten setze den PIN auf 0
      }  
   }
  }
 }

Meine Standardantwort auf alle Blinklicht Fragen: schau mal auf meine Seite www.blinkenlight.net. Da findest Du nicht nur die Antwort auf Deine Frage sondern bestimmt auch gleich noch ein paar weitere Ideen :wink:

nahtanoy:

void setup (){

Serial.begin(9600);              //Serielle Ausgabe einleiten zum debuggen
  for (int loop = 2; loop < 6; loop++){
       pinMode (loop, OUTPUT);    // PINs 2-5 definieren
       digitalWrite (loop, LOW);  // PINs direkt ausschalten
  }
}
byte binwert;                      // definiert eine Variable als byte

void loop(){
 for (int zaehler=0; zaehler < 16;zaehler++){ //zählt von 0 bis 15 (also 16 Schritte)
   delay(500);                    // wartet eine halbe Sekunde, für die Optik
   binwert = byte(zaehler);       // schreibt die aktuelle Zahl als binärwert in binwert
   Serial.println(binwert,BIN);   // gibt den aktuellen binärwert Seriell aus (nur zum debuggen)
   for (int n=0; n <4; n++){      // zählt von 0 bis 3 (4 Schritte) um jedes einzelne bit des halbbytes abzufragen
     if (bitRead(binwert,n)==1){  // wenn das aktuelle bit eine eins ist
      digitalWrite(n+2,HIGH);    // setze den entsprechenden PIN auf 1
     }
     else{
      digitalWrite(n+2,LOW);     // ansonsten setze den PIN auf 0
     }  
  }
 }
}

Also eine variable loop zu nennen ist problematisch, da du ja eine prozedur hast die loop heisst. auch wenn es gehen sollte, würde ich das nicht machen.

du kannst dir binwert sparen.

der code macht exakt das selbe (habs nicht compiliert)

void loop(){
  for (byte zaehler = 0; zaehler < 16; zaehler++) { //zählt von 0 bis 15 (also 16 Schritte)
    delay(500);                    // wartet eine halbe Sekunde, für die Optik
    Serial.println(zaehler,BIN);   // gibt den aktuellen binärwert Seriell aus (nur zum debuggen)
    for (byte n = 0; n <= 3; n++) digitalWrite(n + 2, bitRead(zaehler,n)); //bitread ist 0 oder 1 // low = 0 und high = alles > 0
  }
}