Shot-Timer für Espressomaschine

Hallo zusammen,

bei einer Espressomaschine möchte ich die Kaffeebezugsdauer (in Sekunden) mit zwei 7-Segment-Anzeigen darstellen:

Mit dem linken Button soll der Timer gestartet (und ein Relais geschaltet) werden, bei nochmaligem Drücken soll der Timer neu gestartet (und ein anderes Relais geschaltet) werden. Beim Drücken des rechten Buttons soll der Timer gestoppt werden und die abelaufene Zeit noch für 10' angezeigt werdern (außerdem noch beide Relais geschaltet werden).

Nun habe ich (als mehr oder weniger Anfänger) ein paar Fragen, vielleicht habt ihr Tipps:

  1. Ist der Aufbau so überhaupt sinnvoll? Ich habe das tolle ShiftOut-Tutorial als Grundlage benutzt.
  2. Ist es sinnvoll, den Timer über einen Interrupt zu starten / zu stoppen? Dann könnte ich die Uhr ganz einfach runterlaufen lassen (delay(1000) zählt 1 s weiter) und bräuchte mir keine Gedanken um das Timing zu machen (ich möchte eigentlich keinen separaten Baustein a la DS1307 dafür verwenden).
  3. Mit dem Debouncen der Taster kenne ich mich nicht aus: Ich habe eine Bounce-Bibliothek und ein Debounce-Tutorial gefunden. Was empfehlt ihr (ggf. im Kontext Interrupts)?
  4. Gibt es das gesamte Problem vielleicht schon als fertigen Code gelöst und ich habe es übersehen?
  5. last but noch least: Wozu dient der Kondensator am Clock-PIN?

Fragen über Fragen ...

Vielen Dank vorab für Eure Hilfe,
tolles Forum!

ps zu Timern habe ich noch folgendes gefunden:
http://www.arduino.cc/playground/Code/SimpleTimer
http://www.arduino.cc/playground/Code/Time

pps Ich habe begonnen ein kleines Skript zu schreiben, vielleicht für manchen eine kleine Hilfe (für die meisten ws. kalter Kaffee):
http://popovic.info/html/arduino/arduinoUno_1.html

  1. Der kondensator verlangsamt die flanken der clock pulse. Ich habe den bei meinen 595 spielereien nie in betracht gezogen und auch nicht "vermisst". Ich wuesste auch nicht, was da flickern sollte (wie im artikel beschrieben). Es sei denn, man schickt dem chip falsche daten, egal ob bewusst oder unbewusst. Es koennte natuerlicht sein, dass aus irgendwelchen gruenden (z.b. stoerkapazitaeten, miese schaltung, defekte chips) die daten nicht schnell genug valide sind (die clock also relativ zu ihnen etwas zu frueh auf HIGH geht), was man durch einen kondensator wieder hinpfuschen kann. Befuerworten kann ich sowas aber nicht. Ich hatte das problem jedenfalls nie.

  2. Einige deiner links funktionieren nicht.

  3. Da es hier nur um sekunden geht (fuer den micro sind das ewigkeiten) wuerde ich mir persoenlich nicht die muehe machen, mit timern/irq zu arbeiten. Mit der millis() funktion kann man gut abfragen, ob es "zeit" fuer den naechsten tick ist. Es sei denn, du willst das unbedingt.

  4. Die de-bounce bibliothek scheint sinnvoll zu sein. Ein einfacher RC filter funktioniert auch. Absolut notwendig ist das nur, wenn du den schalter als trigger fuer einen interrupt verwendest. Alles andere kann man per software auswerten/timen.

Hallo madworm,

vielen Dank für deine Antwort.

ad1): den Kondensator habe ich entfernt.
ad2): danke, ist korrigiert (war es von anderen Foren gewohnt anders Links einzufügen)
ad3): vielleicht nutze ich die MsTimer2 - Bibliothek und
ad4): um das debouncen kümmere ich mich anschließend.

Danke + lg
fresapo

edit:
den Anschluss der 7-Segment-Anzeigen habe ich nun passender zum Datenblatt gewählt und den Kondensator weggelassen:

/*
 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 Ziffern:
 0 = a+b+c+d+e+f = 63
 1 = b+c = 0*2^0 + 1*2^1 + 1^*2^2 + 0*2^3 + 0*2^4 + 0*2^5 + 0*2^6 + 0*2^7 = 01100000b = 6
 2 = a+b+d+e+g = 91
 3 = a+b+c+d+g = 79
 4 = b+c+f+g = 102
 5 = a+c+d+f+g = 109
 6 = a+c+d+e+f+g = 125
 7 = a+b+c = 7
 8 = a+b+c+d+e+f+g = 127 
 9 = a+b+c+d+f+g = 111
 */

lg fresapo

Was mir gerade noch an deiner 2. skizze auffaellt, pin #13 der chips (enable, "active low") muss auf GND. Sonst haben die ausgaenge Q0-Q7 einen nicht wohl definierten zustand. Das kann sich z.b. dadurch aeussern, dass es manchmal nicht funktioniert und durch "handauflegen" dann ploetzlich doch.

Wenn du auf diesen pin einen der PWM ausgaenge legst, laesst sich sehr leicht eine (globale) helligkeitsregulation realisieren.

Hi,
danke dir (auch für den PWM-Tipp) , hab's in der Grafik korrigiert.
Morgen werde ich die Schaltung aufbauen und den Quelltext hier einstellen.
lg fresapo

Hallo zusammen,

die Schaltung ist aufgebaut und funktioniert (große Anzeige nicht angeschlossen):

Für das Hochzählen der Sekunden verwende ich einen Interrupt / die Bibliothek: Arduino Playground - MsTimer2

Noch nicht auf dem Bild sind zwei Buttons links/rechts. Die Logik des linken Buttons, zu ihm gehören die Variablen alter und aktueller Zustand, ist in dieser Tabelle dargestellt:


leftButtonLastState | leftButtonState | ToDo

0 | 0 | zeigeUhrzeit
0 | 1 | starteUhr und Variable leftButtonLastState erhöhen

1 | 0 | zeigeUhrzeit
1 | 1 | starteUhr und Variable leftButtonLastState erhöhen

2 | 0 | zeigeUhrzeit
2 | 1 | zeigeUhrzeit

Wenn man den rechten Button drückt, soll ein Interrupt ausgelöst werden, der die Uhr anhält und die Variable leftButtonLastState auf 0 zurück setzt, das werde ich hinkriegen. Außerdem muss ich die Taster noch entprellen, da hab' ich Bammel vor.

Den Quelltext gibt es unter http://popovic.info/html/arduino/kaffee_timer/kaffee_timer_v2.pde

Ich hoffe das ganze ist nicht zu unverständlich und freue micht (als relativer Anfänger) über Tipps, auch wenn es nur Kleinigkeiten sind!

lg fresapo

Hallo zusammen,

die Bounce-Bibliothek zum Entprellen habe ich nun benutzt um den linken (im Bild oben ;-)) und rechten Taster zu entprellen. Für die reale Anwendung muss man noch ein wenig mit der debounce-Zeit und der "duration" (wie lange wurde gedrückt) spielen.

Der aktuelle Quelltext: http://popovic.info/html/arduino/kaffee_timer/kaffee_timer_v3.pde. Die Uhr wird beim Drücken der Stop-Taste noch nicht auf 00 zurückgesetzt, vielleicht schaffe ich das heute Abend.

lg fresapo
ps den rechten Taster Frage ich doch nicht via Interrupt ab, das schien mir (bei Benutzung der bounce-library) einfacher.