10. November 2011
![](../../../../files/2011/11/ds_matrix_dark.jpg)
int leds[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; int leds_rows[] = { 2, 3, 4, 5, 6, 7, 8 }; int leds_cols[] = { 9, 10, 11, 12, 13 }; int i=9; int d=1; int k=2; int d2=1; void setup() { // ROWS for(int l=0; l pinMode(leds_rows[l], OUTPUT); digitalWrite(leds_rows[l],LOW); } // COLS for(int l=0; l pinMode(leds_cols[l], OUTPUT); digitalWrite(leds_cols[l],LOW); } } void loop() { setActive(i, HIGH, 9, 5); delay(50); setActive(k, LOW, 2, 6); delay(50); if (i==13) d=0; if (i==9) d=1; d==1 ? i++ : i--; if (k==8) d2=0; if (k==2) d2=1; d2==1 ? k++ : k--; } void setActive(int pin, int state, int start, int num) { for(int i=0; i if (pin!=i+start) { digitalWrite(i+start,state); } else { digitalWrite(i+start,state==LOW?HIGH:LOW); } } }
Bit Shifting
Um mit einfachen Mitteln möglichst viele LEDs ansteuern zu können haben wir uns in einer weiteren Übung das Bit-Shifting zu Nutze gemacht. 1 Byte besteht aus 8 Bit, die jeweils einen boolschen Zustand haben können. In Arduino ist die Schreibweise für ein Byte jeweils mit einem 'B' vorneangestellt (B00000000) gefolgt von den 8 Bit als Stellen. Mit bitWrite() lassen sich nun einzelen Bits unseres Byte umschreiben und so eine Zahl zwischen 0-255 generieren. Mit ShiftOut kann das Byte auch direkt verwendet werden, um mit seinen 8 Stellen jeweils 8 LEDs gleichzeitig zu steuern.![](../../../../files/2011/11/ds_shift_assembling.jpg)
#define LATCH_PIN 8 #define CLOCK_PIN 12 #define DATA_PIN 11 #define SOUND_PIN 2 #define SOUND_PIN2 4 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 // int melody[] = { NOTE_GS4, NOTE_CS5, NOTE_E5, NOTE_GS4, NOTE_CS5, NOTE_E5, NOTE_GS4, NOTE_CS5, NOTE_E5, NOTE_GS4, NOTE_CS5, NOTE_E5, NOTE_A4, NOTE_CS5, NOTE_E5, NOTE_A4, NOTE_CS5, NOTE_E5, NOTE_A4, NOTE_D5, NOTE_FS5, NOTE_A4, NOTE_D5, NOTE_FS5, NOTE_GS4, NOTE_AS4, NOTE_FS5, NOTE_GS4, NOTE_CS4, NOTE_E5, NOTE_GS4, NOTE_CS4, NOTE_DS5, NOTE_FS4, NOTE_A4, NOTE_DS5 }; // note durations: 4 = quarter note, 8 = eighth note, etc.: int noteDurations[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; int i=0; int i2=7; int d=1; int d2=0; int d3=0; int k=1; void setup() { pinMode(LATCH_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(DATA_PIN, OUTPUT); pinMode(SOUND_PIN, OUTPUT); pinMode(SOUND_PIN2, OUTPUT); } void loop() { byte myByte = B00000000; digitalWrite(LATCH_PIN,LOW); bitWrite(myByte,i,1); bitWrite(myByte,i2,1); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, myByte); digitalWrite(LATCH_PIN,HIGH); // old code for making tunes //tone(SOUND_PIN,(i+1)*20*k,50); //delay(50); //tone(SOUND_PIN2,(i2+1)*10*k,50); //delay(50); //tone(SOUND_PIN2,(i2+1)*150); for (int thisNote = 0; thisNote < sizeof(melody); thisNote++) { // to calculate the note duration, take one second // divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. int noteDuration = 1000/noteDurations[thisNote]; tone(SOUND_PIN, melody[thisNote],noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1; delay(pauseBetweenNotes); // stop the tone playing: noTone(7); } if (i==7) d=0; if (i==0) d=1; d==1 ? i++ : i--; if (i2==7) d2=0; if (i2==0) d2=1; d2==1 ? i2++ : i2--; if (k==7) d3=0; if (k==0) d3=1; d3==1 ? k++ : k--; }