Array zum steuern.

Hallo,
ich habe mir ein Sketch aus dem Internet besorgt und habe da eine Frage zu.

Ich würde gerne wissen wie man auf die Zahlen im Array kommt um die einzelnen LEDS zu steuern ?

Ich habe 16 LEDs über einen Arduino uno + 2 Schieberegister soweit geht alles, nur wie gesagt ich verstehe nicht warum diese Zahlen jetzt ein Lauflicht erzeugen.
Hier mal die Arrays

int ledOn2[ ] ={ 1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,64,32,16,8,4,2,1};

int ledOn1[ ] ={ 0,0,0,0,0,0,0,0,1,2,4,8,16,32,64,128,64,32,16,8,4,2,1,0,0,0,0,0,0,0,0};

lieben Dank schonmal

In dem Array sind die Zahlen die Entspechung in dezimal des zu setzenden Bits.

Ps: ich habe keine Option gefunden wie ich hier im Forum den Code richtig formatiere, vielleicht kann mir das auch noch einer sagen.

Im Quick Reply Editor ganz oben links, genau über den Smilies, befindet sich der Code-BBCode-Button.

hi,

die zahlen sagen, welche LED leuchten soll, und zwar als binärzahl.

1 = 00000001
2 = 00000010
4 = 00000100
8 = 00001000
16 = 00010000
32 = 00100000
64 = 01000000
128 = 10000000

siehst Du die 1 laufen? das sagt dem schieberegister, welchen kannal es aufmachen soll.

gruß stefan

Ahh ok lieben Dank für die ganzen Infos, habe den Post mal angepasst.

Ok das mit der 1 habe ich verstanden, wenn ich also möchte das 3 LEDS dieses Lauflicht bilden muss ich das z.b so schreiben ? int test[]={7,56,448,3584.....u.s.w

hi,

nein, immer nur ein byte. also 0 bis 255.

7 wäre 00000111, also 1 + 2 +4
56 ist 00111000, 8 + 16 + 32

448 geht sich nicht aus, Du muß 2 bytes befüllen. wenn Du also willst, daß die LEDs 3, 7, 12, 14 leuchten:
byte 1 = 10001000
byte 2 = 01010000

man fängt immer bei 0 zu zählen an, Du hast also die LEDs 0 bis 15.
diese zwei bytes an die schieberegister schicken, und…voila.

gruß stefan

Wenn du ein int (16 bit) an zwei kaskadierte Schieberegister senden willst, musst du 2 mal shiftOut aufrufen. Das ist z.B in der shiftOut Referenz als Beispiel enthalten.

// 3/16 Bit Lauflicht:
unsigned int test[16] = {7, 14, 28, 56, 112, 224, 448, 896, 
             1792, 3584, 7168, 14336, 28672, 57344, 49153, 32771};

const byte dataPin=2;
const byte clockPin=3;


void shiftOut16(int data) {
  // shift out lowbyte
  shiftOut(dataPin, clockPin, LSBFIRST, data);  
  // shift out highbyte
  shiftOut(dataPin, clockPin, LSBFIRST, (data >> 8));
}

void setup() {
  pinMode (dataPin, OUTPUT);
  pinMode (clockPin, OUTPUT);
}

void loop() {
   for (byte i = 0; i < 16; i++) {
     shiftOut16(test[i]);
     delay(100);
  }
}

Bitmuster sind für Programmierer übrigens als Hex-, Oktal- oder Binär-Zahlen leichter lesbar.
https://www.arduino.cc/en/Reference/IntegerConstants

ok....jetzt bin ich verwirrt. also die erste Zahl in einem Array ist doch ein Byte oder ? Also wenn ich jetzt die ersten 3 LEDs anmachen möchte schreibe ich int test[] = {1,2,4} ?
oder so int test[] = {1+2+4, ....}

wenn ich diese 3 LEDs jetzt immer eine Position weiter schicken möchte was muss ich da machen ?

Sorry das ich das nicht auf die Reihe bekomme, habe hier den Taschenrechner von Win10, der hat ja eine Binäre Option wo ich mir das zusammen klicken kann, aber das war ja falsch.

int test[] ist ein Array aus mehreren 16 bit int Werten. Wenn in einem
Element davon eine 7 steht, sind die höheren 13 Bit eben 0.

Wenn du das Bitmuster für 16 Leds ablegen willst, brauchst du einintoder ein  unsigned int.
( Oder alternativ 2 byte ) und musst 2 mal shiftOut aufrufen.