10. November 2011
Diese Übung beinhaltete sich mit dem Dot-Matrix-Bauelement vertraut zu machen, das 5x7 LEDs enthält. Die LEDs mussten in Spalten und Kolonnen an die PINs des Arduinos angeschlossen werden. Je nachdem ob eine Spalte oder Reihe HIGH oder LOW geschaltet ist leutet die LED am Kreuzpunkt auf. Sind alle Outputs auf LOW gesetzt leuchtet keine der LEDs, um nun einzelne LEDs aufleuchten zu lassen, habe ich eine eigene Funktion geschrieben die eine LED aktiviert und die restlichen LEDs auslöscht. So konnte ich dann im Loop einzeln LEDs der Reihe nach aufleuchten lassen.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.#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--; }