Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino-Küchentimer

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
Adafruit Standard LCD - 16x2 Weiß auf Blau
× 1
SparkFun Drucktastenschalter 12 mm
× 4
Widerstand 10k Ohm
× 4
Widerstand 221 Ohm
Na ja, 220 Ohm...
× 2
Single Turn Potentiometer - 100k Ohm
× 1
Summer
× 1
Breadboard (generisch)
× 1
Jumper (generisch)
× 1

Über dieses Projekt

Am Anfang schuf Gott Himmel und Erde. Und Menschen. Und Menschen haben digitale Küchentimer wie diesen geschaffen.

Und die Menschen sagten:Cool, aber ein bisschen trostlos. Machen wir einen besseren!

Und Gott sagte, ich habe deinen Ruf gehört, es soll Arduinos geben:und es gab überall auf der Erde Arduinos, und das war gut.

Und die Menschen haben einen Arduino genommen und einen besseren Küchentimer entwickelt, wie diesen.

Und Gott sah den neuen Küchenwecker und sagte:Ich habe deinen neuen Küchenwecker gesehen und er sieht schrecklich aus , aber es scheint zu viel Spaß zu sein ! Und das ist gut . :-)

Was Sie haben müssen

Jetzt, da Sie wissen, woher das alles kommt, gehen wir tiefer darauf ein.

Alle von mir verwendeten Komponenten stammen aus dem Arduino Starter Kit , einschließlich des kleinen Steckbretts, das Sie auf den Bildern und im Video sehen. Fühlen Sie sich frei, das Projekt in ein größeres unterzubringen , wenn Sie möchten.

Du brauchst auch eine Stromquelle:Beim Herumspielen reichen der USB-Anschluss und das Kabel des PCs.

Was Sie tun müssen

Erstens:Bitte nehmen Sie alle benötigten Komponenten aus dem Starter Kit oder Ihrem bevorzugten Komponentenbehälter zusammen; Wenn Sie keine haben, geraten Sie nicht in Panik. Es gibt viel im Internet. Die Komponentenliste finden Sie unten.

Und, na ja, Sie brauchen auch den Code. Es ist wieder unten in seiner Kiste.

So funktioniert's

Grundsätzlich können Sie wie jedes andere ähnliche Gerät in jedem Geschäft in Ihrer Nähe für wenig Geld kaufen. Aber dieses ist Ihre . Und das wird Ihnen zeigen, wie diese kleinen Geräte funktionieren tatsächlich.

Das Schlüsselwort hier ist:aktueller Modus . Der Timer selbst kann nur in einem von vier Modi gleichzeitig laufen:

  • IDLE - der Timer wartet auf Ihre Eingabe und zeigt die aktuell eingestellte Zeit an; Dies ist auch der anfängliche Modus nach dem Einschalten oder Zurücksetzen.
  • SETUP - Sie können diesen Modus durch langes Drücken von S4 aufrufen (im Code wird dies auch "Reset-Taste" genannt); hier können Sie mit S3 ("Start-Stopp-Taste") auswählen, welcher Wert geändert werden soll, um die verstrichene Zeit später herunterzuzählen; schließlich können Sie mit S2 ("Abwärts-Taste") bzw. S1 ("Aufwärts-Taste") den gewählten Wert (Stunden, Minuten oder Sekunden) verringern oder erhöhen.
  • RUNNING - Sie können diesen Modus durch Drücken von S3 aufrufen, während Sie beim Verlassen sowohl S3 als auch S4 benötigen (was Sie in den IDLE-Modus führt).
  • KLINGELN - Wenn die gewünschte Zeit verstrichen ist, wird dieser Modus automatisch aktiviert; Sie können es verlassen (d. h. den kleinen Jungen aufhören zu klingeln), indem Sie einen beliebigen Schalter drücken.

Der Code

Zuerst müssen wir einschließen die richtigen Bibliotheken:

#include 
#include

Wenn Sie sie noch nicht haben, müssen Sie sie herunterladen und installieren:

  • Paulus Stoffregens Zeit Bibliothek (bitte die ZIP-Datei herunterladen über die grüne Schaltfläche "Klonen oder Herunterladen")
  • Arduino LiquidCrystal-Bibliothek

Lassen Sie uns als Nächstes initialisieren das schöne LCD-Modul:

LiquidCrystal LCD(12, 11, 5, 4, 3, 2); 

Bitte zögern Sie nicht, die Pins nach Belieben zu verwürfeln, um ein schönes Verdrahtungslayout zu erhalten:Folgen Sie mir nicht, denn ich habe einen schrecklichen Verdrahtungsplan gemacht! :D Zum Beispiel können Sie die letzten vier Pins in der obigen Anweisung umkehren, um zu vermeiden, dass sich die gelben Drähte kreuzen, die Sie im folgenden Schema sehen können (natürlich müssen Sie die Pin-Konstanten der Taste entsprechend anpassen, siehe unten). Spielen, Spaß haben! Das Leben mit Arduinos beginnt direkt nach diesem Kopieren/Einfügen!

Die nächsten 51 Codezeilen enthalten die Deklaration und Initialisierung der statischen Variablen. Sie können sie gerne durchsuchen, ihre kristallklaren Namen und einige verstreute Kommentare werden Ihnen helfen, das Ganze zu verstehen.

Die setup ()-Funktion führt die üblichen vorbereitenden Schritte aus, die Sie in jeder Arduino-Skizze da draußen und bisher unzählige Male gesehen haben. Die einzige bemerkenswerte Anweisung ist die erste, die die Position des anfänglichen LCD-Anzeigecursors festlegt. Denn, ja:Dieses Modul erfordert, dass Sie eine Position entlang seiner Zeilen und Spalten einrichten und dann etwas "drucken", das ab dieser Position erscheint.

Kommen wir nun zur Funktion loop().

Lassen Sie uns zunächst die Schalterzustände entdecken. Um dies zu erreichen, wird der folgende Codeblock für fast . verwendet jeder von ihnen:

/*
* Schaltflächenverwaltung starten/stoppen
*/
startStopButtonPressed =false;
startStopButtonState =digitalRead(startStopButtonPin);
if(startStopButtonState !=startStopButtonPrevState)
{
startStopButtonPressed =startStopButtonState ==HIGH;
startStopButtonPrevState =startStopButtonState;
}

Ein digitalRead wird gegen den zugehörigen Pin ausgegeben und das Ergebnis mit einem zuvor gelesenen Wert verglichen:Wenn sich etwas geändert hat, wird der neue Wert für zukünftige Referenzen gespeichert und die bool statische Variable "xxxButtonPressed" wird auf true gesetzt, wenn die Schaltfläche gedrückt wird.

Wenn Sie sich den Schaltplan unten ansehen, werden Sie feststellen, dass jeder Eingangspin durch einen 10k-Widerstand auf LOW gezwungen wird, es sei denn, der entsprechende Schalter wird gedrückt und der Pin selbst ist direkt mit +5V verbunden. Ein ziemlich klassisches Szenario, äh?

Zuvor sagte ich "fast jeder von ihnen", weil es eine Taste gibt, die anders funktioniert als die anderen:S4. Sein Codeblock ist in der Lage, das oben erwähnte lange Drücken zu erkennen, um in den SETUP-Modus zu gelangen.

Als nächstes kommt der Modusverwaltungsblockwechsel:Jeder Fall betrachtet die Schaltflächenstatus-Trigger ("xxxButtonPressed") und leitet den Fluss in den richtigen neuen Status um oder führt die richtige Aktion aus.

case MODE_IDLE:
if(resetButtonPressed)
{
Reset();
}
if(resetButtonLongPressed)
{
currentMode =MODE_SETUP;
}
if(startStopButtonPressed)
{
currentMode =currentMode ==MODE_IDLE ? MODE_RUNNING :MODE_IDLE;
if(currentMode ==MODE_RUNNING)
{
// STARTING TIMER!
startTime =now();
}
}
Pause;

Der vorherige Codeausschnitt zeigt, wie der IDLE-Modus verwaltet wird, und ist ziemlich selbsterklärend. Ein weiteres Beispiel zeigt, wie jeder Tastendruck während des Klingelns das Klingeln stoppt:

case MODE_RINGING:
if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed)
{
currentMode =MODE_IDLE;
}
break;

Sieht einfach aus, nicht wahr? :-) Ist es.

Der nächste Block - "Zeitmanagement" - führt die eigentliche Zeitdifferenzberechnung durch, löst den RINGING-Modus aus und klingelt das Summen, wenn es Zeit dafür ist.

Der letzte Block - "LCD-Verwaltung" - verwaltet die LCD-Anzeige für jeden Modus, indem er die richtigen Zeichenfolgen an ihren richtigen Stellen ausdruckt.

Das war's.

Einpacken und los geht's!

Jetzt, da dieser kleine Welpe keine Geheimnisse mehr für Sie hat, lassen Sie uns ihn in Aktion sehen. Danke fürs Zuschauen und viel Spaß!


Code

  • ArduinoSketch
ArduinoSketchArduino
/************************************************ **** * Arduino Kitchen Timer v1.0 - 27.01.2016 * Von Angelo Fiorillo (Rom, IT) * Dieses Werk wird unter der GNU General vertrieben * Public License Version 3 oder höher (GPL3+) * Bitte geben Sie diesen Credit an Beachten Sie, ob Sie * einen Teil dieser Skizze wiederverwenden möchten. Respektiere meine Arbeit * wie ich es mit deiner tun werde. * Zögern Sie nicht, mich zu kontaktieren:[email protected] * ************************************* **********/#include #include // FIX 2018-08-12 Dies behebt «'jetzt' wurde nicht in diesem Bereich deklariert» errorLiquidCrystal lcd( 12, 11, 5, 4, 3, 2);const int BuzzerPin =10;const int resetButtonPin =6;const int startStopButtonPin =7;const int downButtonPin =8;const int upButtonPin =9;int setupHours =0; // Wie viele Stunden werden heruntergezählt, wenn gestartetint setupMinutes =0; // Wie viele Minuten werden heruntergezählt, wenn gestartetint setupSeconds =0; // Wie viele Sekunden werden heruntergezählt, wenn starttime_t setupTime =0;int currentHours =0;int currentMinutes =0;int currentSeconds =0;time_t currentTime =0;time_t startTime =0;time_t elapsedTime =0;int resetButtonState =LOW;long resetButtonLongPressCounter =0;int startStopButtonState =LOW;int upButtonState =LOW;int downButtonState =LOW;int resetButtonPrevState =LOW;int startStopButtonPrevState =LOW;int upButtonPrevState =LOW;int downButtonPrevState =LOW;bool resetButtonPressed =false;Pressbool =resetButton; startStopButtonPressed =false;bool upButtonPressed =false;bool downButtonPressed =false;const int MODE_IDLE =0;const int MODE_SETUP =1;const int MODE_RUNNING =2;const int MODE_RINGING =3;int currentMode =MODE_IDLE; // 0=Leerlauf 1=Setup 2=Läuft 3=Klingeln // Einschalten --> Leerlauf // Reset --> Leerlauf // Start/Stop --> Zähler starten oder stoppen // Auf / Ab --> NOP // Reset (lang drücken) --> Setup aufrufen // Start/Stop --> Datenauswahl // Up --> aktuellen Datenwert erhöhen // Down --> aktuellen Datenwert verringern // Reset --> Setup verlassen (Leerlauf)int dataSelection =0; // Aktuell ausgewählte Daten zur Bearbeitung (Setup-Modus, ändert sich mit Start/Stop) // 0=Stunden (00-99) 1=Minuten (00-59) 2=Sekunden (00-59)void setup() { // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen:lcd.begin(16, 2); pinMode (resetButtonPin, INPUT); pinMode (startStopButtonPin, INPUT); pinMode (upButtonPin, INPUT); pinMode (downButtonPin, INPUT); pinMode (SummerPin, AUSGANG); Serial.begin (9600);}void loop () { // Geben Sie Ihren Hauptcode hier ein, um ihn wiederholt auszuführen:startStopButtonPressed =false; upButtonPressed =false; downButtonPressed =false; /* * Tastenverwaltung zurücksetzen */ resetButtonPressed =false; resetButtonLongPressed =false; resetButtonState =digitalRead(resetButtonPin); if(resetButtonState!=resetButtonPrevState) { resetButtonPressed =resetButtonState ==HIGH; resetButtonPrevState =resetButtonState; aufrechtzuerhalten. Sonst // Langes Drücken Management... { if(resetButtonState ==HIGH) { resetButtonLongPressCounter++; if(resetButtonLongPressCounter ==100) { resetButtonPressed =false; resetButtonLongPressed =true; resetButtonLongPressCounter =0; } } else { resetButtonLongPressCounter =0; resetButtonPressed =false; resetButtonLongPressed =false; } } /* * Schaltflächenverwaltung starten/stoppen */ startStopButtonPressed =false; startStopButtonState =digitalRead(startStopButtonPin); if(startStopButtonState !=startStopButtonPrevState) { startStopButtonPressed =startStopButtonState ==HIGH; startStopButtonPrevState =startStopButtonState; } /* * Verwaltung der Abwärtstaste */ downButtonPressed =false; downButtonState =digitalRead (downButtonPin); if(downButtonState !=downButtonPrevState) { downButtonPressed =downButtonState ==HIGH; downButtonPrevState =downButtonState; } /* * Up-Tastenverwaltung */ upButtonPressed =false; upButtonState =digitalRead(upButtonPin); if(upButtonState!=upButtonPrevState) { upButtonPressed =upButtonState ==HIGH; upButtonPrevState =upButtonState; } /* * Modusverwaltung */ switch(currentMode) { case MODE_IDLE:if(resetButtonPressed) { Reset(); } if (resetButtonLongPressed) { currentMode =MODE_SETUP; } if(startStopButtonPressed) { currentMode =currentMode ==MODE_IDLE ? MODE_RUNNING :MODE_IDLE; if(currentMode ==MODE_RUNNING) { // TIMER STARTEN! startTime =jetzt(); } } brechen; case MODE_SETUP:if(resetButtonPressed) { // Setup-Modus verlassen setupTime =setupSeconds + (60 * setupMinutes) + (3600 * setupHours); currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds; Datenauswahl =0; currentMode =MODE_IDLE; } if(startStopButtonPressed) { // Nächste Daten auswählen, um dataSelection++ anzupassen; if(dataSelection ==3) { dataSelection =0; } } if (downButtonPressed) { switch (dataSelection) { case 0:// Stunden setupHours--; if (setupHours ==-1) { setupHours =99; } brechen; Fall 1:// Minuten setupMinutes--; if(setupMinutes ==-1) { setupMinutes =59; } brechen; Fall 2:// Sekunden setupSeconds--; if (setupSeconds ==-1) { setupSeconds =59; } brechen; } } if(upButtonPressed) { switch(dataSelection) { case 0:// Stunden setupHours++; if (setupHours ==100) { setupHours =0; } brechen; Fall 1:// Minuten setupMinutes++; if(setupMinutes ==60) { setupMinutes =0; } brechen; Fall 2:// Sekunden setupSeconds++; if (setupSeconds ==60) { setupSeconds =0; } brechen; } } brechen; case MODE_RUNNING:if(startStopButtonPressed) { currentMode =MODE_IDLE; } if (resetButtonPressed) { Reset(); currentMode =MODE_IDLE; } brechen; case MODE_RINGING:if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) { currentMode =MODE_IDLE; } brechen; } /* * Zeitmanagement */ switch(currentMode) { case MODE_IDLE:case MODE_SETUP:// NOP break; case MODE_RUNNING:currentTime =setupTime - (now() - startTime); if(currentTime <=0) { currentMode =MODE_RINGING; } brechen; case MODE_RINGING:analogWrite(buzzerPin, 20); Verzögerung (20); analogWrite (SummerPin, 0); Verzögerung (40); brechen; } /* * LCD-Verwaltung */ //lcd.clear(); lcd.setCursor(0, 0); switch(currentMode) { case MODE_IDLE:lcd.print("Timer bereit"); lcd.setCursor(0, 1); lcd.print (aktuelle Stunden); lcd.print(" "); lcd.print (aktuelle Minuten); lcd.print(" "); lcd.print (aktuelle Sekunden); lcd.print(" "); brechen; case MODE_SETUP:lcd.print("Setup-Modus:"); switch(dataSelection) { Fall 0:lcd.print("HRS"); brechen; Fall 1:lcd.print("MINS"); brechen; Fall 2:lcd.print("SECS"); brechen; } lcd.setCursor(0, 1); lcd.print (setupHours); lcd.print(" "); lcd.print (setupMinutes); lcd.print(" "); lcd.print (setupSeconds); lcd.print(" "); brechen; case MODE_RUNNING:lcd.print("Countdown..."); lcd.setCursor(0, 1); if(hour(currentTime) <10) lcd.print("0"); lcd.print (Stunde (aktuelle Zeit)); lcd.print(":"); if(minute(currentTime) <10) lcd.print("0"); lcd.print (Minute (aktuelle Zeit)); lcd.print(":"); if(second(currentTime) <10) lcd.print("0"); lcd.print (zweite (aktuelle Zeit)); brechen; case MODE_RINGING:lcd.print(" RING-RING! "); lcd.setCursor(0, 1); lcd.print(" "); brechen; } delay(10);}void Reset(){ currentMode =MODE_IDLE; currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds;}

Schaltpläne

Sie können jedes Universal-Steckbrett verwenden, einschließlich des Starter-Kits, das kleiner ist als das hier abgebildete (der Summer kann unter den gelben Drähten platziert werden, siehe Video und Fotos).

Herstellungsprozess

  1. Pflanzenalarm bei Durstalarm
  2. DIY Einfaches 20-kHz-Arduino-Oszilloskop auf Nokia 5110 LCD
  3. Smart Blinds
  4. italienische Wordclock
  5. Arduino-Countdown-Timer
  6. Sigfox-kWh-Zähler
  7. Bluetooth-Temperaturüberwachung
  8. Gestengesteuerte Sperre
  9. Ein isolierter Analogeingang für Arduino
  10. Messen Sie Ihre Reaktionszeit