25. September 2012
Der Input soll intuitiv funktionieren. Wird der Input links gedrückt geht auch der Output nach Links. Steht der Output auf einer Seite am Ende, ist er nicht weiter erhöhbar. Beim anschliessen der letzten 2 LEDs gabs probleme, da die gleichen Wiederstände wie bei den anderen Inputs des LED-Streifen nicht funktioniert haben. Der Code ist nicht sehr flexibel, funktioniert aber 😉#define LATCH_PIN 8 //Pin zu ST_CP vom 74HC595 #define CLOCK_PIN 12 //Pin zu SH_CP vom 74HC595 #define DATA_PIN 11 //Pin zu DS vom 74HC595 #define LEFT 2 // Taster an digitalPin 2 #define RIGHT 4 // Taster an digitalPin 4 #define LIGHT7 7 #define LIGHT8 6 boolean delayerRight = false; boolean delayerLeft = false; int wert = 0; void setup() { Serial.begin(9600); pinMode(LATCH_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(DATA_PIN, OUTPUT); pinMode(LIGHT7, OUTPUT); pinMode(LIGHT8, OUTPUT); for ( int i = 0; i < 8; i++ ) { registerWrite(i,LOW); } } void loop() { pinMode(LEFT, INPUT); // TasterPin als Input nutzen pinMode(RIGHT, INPUT); // TasterPin als Input nutzen if ( wert >= 11 ) { wert = 10; } else if ( wert <= 0 ) { wert = 0; } if (digitalRead(RIGHT) == HIGH && delayerRight == false) { Serial.println("Right High"); /////////////////////////////// delayerRight = true; wert = wert++; } else if (digitalRead(RIGHT) == LOW && delayerRight == true) { delayerRight = false; } if (digitalRead(LEFT) == HIGH && delayerLeft == false) { Serial.println("Left High"); /////////////////////////////// delayerLeft = true; wert = wert - 1; } else if (digitalRead(LEFT) == LOW && delayerLeft == true) { delayerLeft = false; } Serial.println(wert); switch ( wert ) { case 0: break; case 1: registerWrite(0,HIGH); break; case 2: registerWrite(1,HIGH); break; case 3: registerWrite(2,HIGH); break; case 4: registerWrite(3,HIGH); break; case 5: registerWrite(4,HIGH); break; case 6: registerWrite(5,HIGH); break; case 7: registerWrite(6,HIGH); break; case 8: registerWrite(7,HIGH); digitalWrite(LIGHT7, false); break; case 9: digitalWrite(LIGHT7, true); registerWrite(7,LOW); digitalWrite(LIGHT8, false); break; case 10: digitalWrite(LIGHT8, true); digitalWrite(LIGHT7, false); break; default: break; } } void registerWrite(int _whichPin, int _whichState) { byte bitsToSend = 0; // Dieses Byte hat acht Bits also: 00000000 digitalWrite(LATCH_PIN, LOW); bitWrite(bitsToSend, _whichPin, _whichState); // Hier wird das entsprechende Bit im Byte gesetzt (z.B. 00100000) shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bitsToSend); digitalWrite(LATCH_PIN, HIGH); }VIDEO