26. September 2012
Als zweite und doch auch komplexere Aufgabe habe ich mir die Verbindung von zwei Schieberegister vorgenommen. Ein Lichtsensor misst die Helligkeit, deren Wert wiederum die Anzeige auf der LED-Reihe steuert. Kniffe gab es beim Ansteuern des zweiten Schieberegisters. Lösung siehe Code, mehr kann ich leider nicht dazu sagen.#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 LED_9 6 #define LED_10 7 #define TASTER_PLUS 2 #define TASTER_MINUS 3 #define BRIGHTNESS A0</code> int lastButtonState[] = {1,1}; long lastDebounceTime = 0; // Die letzte Zeit als der Taster gedrückt wurde long timeSinceWait = 0; long debounceDelay = 20; // Die Verzögerung des Tasters int counter = 0; boolean buttonPlusPressed = false; boolean buttonMinusPressed = false; boolean wait = false; boolean press = false; boolean lookForWait = false; void setup() { pinMode(TASTER_PLUS, INPUT); digitalWrite(TASTER_PLUS, HIGH); pinMode(TASTER_MINUS, INPUT); digitalWrite(TASTER_MINUS, HIGH); pinMode(LATCH_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(DATA_PIN, OUTPUT); pinMode(LED_9, OUTPUT); pinMode(LED_10, OUTPUT); Serial.begin(9600); } void loop() { if(digitalRead(TASTER_PLUS) == LOW && buttonPlusPressed == false) { buttonPlusPressed = true; lastDebounceTime = millis(); timeSinceWait = millis(); } if(digitalRead(TASTER_MINUS) == LOW && buttonMinusPressed == false) { buttonMinusPressed = true; lastDebounceTime = millis(); timeSinceWait = millis(); } if(millis()-lastDebounceTime > debounceDelay && buttonPlusPressed == true && wait == false || millis()-lastDebounceTime > debounceDelay && buttonMinusPressed == true && wait == false) { // AKtion Serial.println("HERE"); lookForWait = true; if(buttonMinusPressed && counter < 15 ){ counter++; } if(buttonPlusPressed && counter > 0){ counter--; } Serial.print("counter: "); Serial.println(counter); // lastDebounceTime = millis(); wait = true; if(press){ wait = false; } } counter = map(analogRead(BRIGHTNESS), 50, 400, 0,15); if(millis()-timeSinceWait > 1000 && lookForWait){ wait = false; press = true; } registerWrite(counter, HIGH); if(digitalRead(TASTER_PLUS) == HIGH && buttonPlusPressed) { buttonPlusPressed = false; wait = false; press = false; lookForWait = false; Serial.println("FALSE"); } if(digitalRead(TASTER_MINUS) == HIGH && buttonMinusPressed) { buttonMinusPressed = false; wait = false; press = false; lookForWait = false; } } void registerWrite(int _whichPin, int _whichState) { byte bitsToSend1 = 0; // Dieses Byte hat acht Bits also: 00000000 byte bitsToSend2 = 0; digitalWrite(LATCH_PIN, LOW); digitalWrite(LED_9, LOW); digitalWrite(LED_10, LOW); if(_whichPin =8) { bitWrite(bitsToSend1, _whichPin-8, _whichState); } Serial.println(_whichPin); Serial.print(bitsToSend1, BIN); Serial.print(" "); Serial.print(bitsToSend2, BIN); Serial.println(); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bitsToSend1); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bitsToSend2); //shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bitsToSend2); /* if(_whichPin < 8){ bitWrite(bitsToSend1, _whichPin, _whichState); // Hier wird das entsprechende Bit im Byte gesetzt (z.B. 00100000) shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bitsToSend1); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0); } if(_whichPin >= 8){ bitWrite(bitsToSend2, _whichPin, _whichState); // Hier wird das entsprechende Bit im Byte gesetzt (z.B. 00100000) shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, 0); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, bitsToSend2); } */ digitalWrite(LATCH_PIN, HIGH); }