/* Chronofunktion für die Kaffeemaschine: Die Bezugsdauer soll gemessen und auf zwei 7-Segment-Anzeigen dargestellt werden. 21.06.2011 by blu TODO: -> Interrupt vom rechten Taster auslösen lassen, um die Uhr zu stoppen -> Taster entprellen -> Relais und Pumpe ansteuern */ // Benutze den Timer-Interrupt: http://www.arduino.cc/playground/Main/MsTimer2 #include // Die Bounce-Bibliothek zum Entprellen verwenden, siehe http://www.arduino.cc/playground/Code/Bounce #include // Zum Debuggen auf 1 setzen und auf den "serial monitor" klicken: const int DEBUG = 1; // shift register: const int latchPin = 8; const int dataPin = 11; const int clockPin = 12; // Pushbuttons const int leftButton = 6; // Preinfusion bzw. Bezug starten const int rightButton = 5; // Bezug stoppen int leftButtonState = 0; // ist der linke Button akutell gedrückt? int leftButtonLastState = 0; // wie war der letzte Zustand vom linken Button? int rightButtonState = 0; // ist der rechte Button akutell gedrückt? // Bounce-Objekt für den leftButton instanziieren. Die Entprellzeit beträgt 50 ms Bounce bouncerLeft = Bounce(leftButton,50); Bounce bouncerRight = Bounce(rightButton,50); int seconds = 0; // "Uhrzeit" in Sekunden (wird durch Interrupt verändert) /* 7-Segment-Display: a-7 <-> Q0 b-6 <-> Q1 c-4 <-> Q2 d-2 <-> Q3 e-1 <-> Q4 f-9 <-> Q5 g-10 <-> Q6 dp-5 <-> Q7 nicht in Benutzung Darstellung der Einer-Ziffern: 0: f+e+d+c+b+a = 63 1: c+b = 0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 1^*2^2 + 1*2^1 +0*2^0 = 00000110b = 6 2: g+ e+d+ b+a = 91 3: g+ d+c+b+a = 79 4: g+f+ c+b = 102 5: g+f+ d+c+ a = 109 6: g+f+e+d+c+ a = 125 7: c+b+a = 7 8: g+f+e+d+c+b+a = 127 9: g+f+ d+c+b+a = 111 Array: Der Inhalt von z.B. numbers[1] enhält die Information, welche LED's eingeschaltet werden müssen, damit die 1 aufleuchtet. */ int numbers[10] = { 63, 6, 91, 79, 102, 109, 125, 7, 127, 111}; // Relais für: const int pump = 10; const int solenoid = 13; void setup() { if(DEBUG){ Serial.begin(9600); // serielle Schnittstelle für's Debuggen aktivieren } pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(leftButton, INPUT); pinMode(rightButton, INPUT); clearDisplays(); // 7-Segment-Anzeigen aus delay(100); alleAn(); // LED-Test delay(500); clearDisplays(); sayHello(); clearDisplays(); // 7-Segment-Anzeigen aus alleAn(); // LED-Test delay(1000); // Alle 1000 ms wird ein Interrupt ausgelöst MsTimer2::set(1000, zeitLaeuft); // Methode SekundeErhoehen aufrufen } void loop() { // bouncerLeft.update(); leftButtonState = bouncerLeft.read(); //leftButtonState = digitalRead(leftButton); if(DEBUG && leftButtonState && bouncerLeft.duration() > 100 == 1){ Serial.print("letzer und aktueller Zustand des linken Buttons: "); Serial.print(leftButtonLastState); Serial.print(" "); Serial.println(leftButtonState); Serial.println("------------------------------------------------"); } if(leftButtonState == 1 && bouncerLeft.duration() > 100 && leftButtonLastState == 0){ seconds = 0; startClock(); leftButtonLastState++; } else if (leftButtonState == 1 && bouncerLeft.duration() > 100 && leftButtonLastState == 1){ stopClock(); leftButtonLastState++; seconds = 0; startClock(); } bouncerRight.update(); if(bouncerRight.read() && bouncerRight.duration() > 100){ rightButtonState = 1; } else { rightButtonState = 0; } if(rightButtonState){ stopClock(); leftButtonLastState = 0; if(DEBUG){ Serial.println("Rechts wurde geklickt!"); Serial.print("Letzter Zustand des linken Buttons: "); Serial.println(leftButtonLastState); Serial.println("|||||||||||||||||STOP||||||||||||||||||||||||||"); } } showTime(); } // Die abgelaufende Zeit wird angezeigt void showTime(){ // if(DEBUG){ // Serial.print("Die Einerstelle ist: "); // Serial.println(int(seconds%10), DEC); // Serial.print("Die Zehnerstelle ist: "); // Serial.println(int(seconds/10), DEC); // Serial.println("-----------------------------------"); // } zahlAusgeben(int(seconds/10),int(seconds%10)); } // beide 7-Segment-Anzeigen dunkel schalten void clearDisplays(){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, 0); // Anzeige löschen shiftOut(dataPin, clockPin, LSBFIRST, 0); // gelöschte Anzeige nach rechts weiterreichen und linke Anzeige löschen digitalWrite(latchPin, HIGH); } // Funktionstest 7-Segment-Anzeigen void alleAn(){ zahlAusgeben(8,8); } // Ein paar lustige Kreise auf den Anzeigen drehen lassen: void sayHello(){ int pause = 100; for(int a = 0;a<3;a++){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST,1); digitalWrite(latchPin, HIGH); delay(pause); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST,0); digitalWrite(latchPin, HIGH); delay(pause); for(int i =1;i<4;i++){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST,int(0.01+pow(2,i))); shiftOut(dataPin, clockPin, MSBFIRST,0); digitalWrite(latchPin, HIGH); delay(pause); } for(int i =3;i<6;i++){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST,0); shiftOut(dataPin, clockPin, MSBFIRST,int(0.1+pow(2,i))); digitalWrite(latchPin, HIGH); delay(pause); } clearDisplays(); } } // gibt die 10er- und 1er-Stelle auf den Displays aus void zahlAusgeben(int zehner, int einer){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, numbers[einer]); // Einer-Ziffer übertragen, wird im nächsten Schritt nach rechts geschoben shiftOut(dataPin, clockPin, MSBFIRST, numbers[zehner]); // Zehner links ausgeben und die Einerziffer zum 2. '595er nach rechts verschieben digitalWrite(latchPin, HIGH); } // Die Stoppuhr wird gestartet: void startClock(){ MsTimer2::start(); // enable Interrupt if(DEBUG) Serial.println("Ich habe den Timer gestartet!"); } // Die Stoppuhr wird gestoppt: void stopClock(){ MsTimer2::stop(); // disable Interrupt if(DEBUG) Serial.println("Ich habe den Timer gestoppt!"); } // Beim Auslösen des Timer-Interrupts wird die Sekundenzahl erhöht: void zeitLaeuft(){ seconds++; if(DEBUG){ Serial.println("+++++++++++++++Uhrzeit:+++++++++++++++++"); Serial.println(seconds); } }