Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Membuat Timer Dapur Arduino yang Andal dengan Tampilan LCD

Komponen dan Perlengkapan

Arduino UNO1
LCD Standar Adafruit - 16x2 Putih pada Biru1
Tombol Tekan SparkFun 12mm4
Resistor 10k ohm4
Resistor 221 ohm (sekitar 220 ohm)2
Potensiometer Putar Tunggal - 100k ohm1
Buzzer1
Papan Rangkas (Breadboard)1
Kabel Jumper (Umum)1

Tentang Proyek Ini

Pada awalnya Tuhan menciptakan langit dan bumi. Dan manusia. Dan manusia menciptakan timer dapur digital, seperti ini.

Membuat Timer Dapur Arduino yang Andal dengan Tampilan LCD

Dan manusia berkata, Bagus tapi sedikit muram. Ayo buat yang lebih baik!

Dan Tuhan berfirman, Aku mendengar seruanmu, biarlah ada Arduino: dan terdapat Arduino di seluruh bumi, dan itu baik.

Dan manusia mengambil sebuah Arduino dan menciptakan timer dapur yang lebih baik, seperti ini.

Membuat Timer Dapur Arduino yang Andal dengan Tampilan LCD

Dan Tuhan melihat timer dapur baru dan berkata: Aku melihat timer dapur baru kamu dan itu terlihat buruk, tetapi terlalu banyak seru! Dan itu baik. :-)

Apa yang Dibutuhkan

Sekarang Anda tahu dari mana semua ini berasal, mari kita telusuri lebih dalam.

Semua komponen yang saya gunakan berasal dari Arduino Starter Kit, termasuk papan rangkas kecil yang Anda lihat di gambar dan video. Anda bebas menyesuaikan proyek ini menjadi proyek yang lebih besar, jika Anda menginginkannya.

Anda juga membutuhkan sumber daya: saat mencoba-coba, port USB PC dan kabel sudah cukup.

Apa yang Harus Dilakukan

Pertama: kumpulkan semua komponen yang dibutuhkan dari Starter Kit atau kotak komponen favorit Anda; jika Anda tidak memilikinya, jangan panik. Ada banyak sekali di Internet. Anda dapat menemukan daftar komponen di bawah ini.

Dan, tentu, Anda juga membutuhkan kodenya. Ini ada di kotaknya, di bawah ini lagi.

Cara Kerja

Dasarnya, seperti perangkat serupa lainnya yang dapat Anda beli untuk satu dolar di toko terdekat Anda. Namun ini adalah milik Anda. Dan ini akan menunjukkan kepada Anda bagaimana gadget kecil itu sebenarnya bekerja.

Kata kunci di sini adalah: mode saat ini. Timer itu sendiri hanya dapat berjalan dalam satu dari empat mode pada satu waktu:

Kode

Pertama, kita perlu menginclude library yang tepat:

#include <LiquidCrystal.h>
#include <TimeLib.h>

Jika Anda belum memilikinya, Anda perlu mengundah dan menginstal:

Selanjutnya, mari kita inisialisasi modul LCD yang bagus ini:

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

Anda bebas menukar pin sesuai keinginan Anda untuk mendapatkan tata letak kabel yang rapi: jangan mengikuti saya dalam hal ini, karena saya merencanakan kabel yang buruk! :D Misalnya, Anda dapat membalikkan empat pin terakhir dalam pernyataan di atas untuk menghindari kabel kuning yang bersilang yang Anda lihat dalam skematis di bawah (tentu saja, Anda harus menyesuaikan konstanta pin tombol sesuai, lihat di bawah). Bermain, bersenang-senang! Kehidupan dengan Arduino dimulai tepat setelah copy/paste itu!

51 baris kode berikut berisi deklarasi dan inisialisasi variabel statis. Silakan telusuri, namanya yang sangat jelas dan beberapa komentar yang tersebar akan memandu Anda memahami keseluruhan.

Fungsi setup() melakukan langkah awal biasa yang telah Anda lihat jutaan kali dalam setiap sketsa Arduino yang ada dan sejauh ini. Pernyataan yang layak disebutkan adalah yang pertama, yang akan mengatur posisi kursor tampilan LCD awal. Karena, ya: modul ini memerlukan Anda untuk menyiapkan posisi along baris dan kolom dan kemudian "mencetak" sesuatu, yang akan muncul mulai dari posisi tersebut.

Sekarang mari kita beralih ke fungsi loop().

Pertama-tama, mari kita temukan status tombol. Untuk mencapai ini, blok kode berikut digunakan untuk kehampir masing-masing dari mereka:

/*
* Start/Stop button management
*/
startStopButtonPressed = false;
startStopButtonState = digitalRead(startStopButtonPin);
if(startStopButtonState != startStopButtonPrevState)
{
startStopButtonPressed = startStopButtonState == HIGH;
startStopButtonPrevState = startStopButtonState;
}

Sebuah digitalRead diterbitkan terhadap pin terkait dan hasilnya dibandingkan dengan nilai yang sebelumnya dibaca: jika ada yang berubah, nilai baru disimpan untuk referensi di masa depan dan variabel statis bool "xxxButtonPressed" diatur ke true jika tombol ditekan.

Melihat diagram rangkaian di bawah, Anda akan memperhatikan bahwa setiap pin input dipaksa ke LOW oleh resistor 10k kecuali jika tombol yang sesuai ditekan dan pin itu sendiri langsung terhubung ke +5V. Skenario yang cukup klasik, eh?

Sebelumnya, saya berkata "kehampir masing-masing dari mereka" karena ada satu tombol yang bertindak secara berbeda dari yang lain: S4. Blok kodonya mampu mendeteksi tekanan lama yang disebutkan di atas untuk memasuki mode SETUP.

Selanjutnya datang blok manajemen mode switch: setiap case memeriksa status pemicu tombol ("xxxButtonPressed") dan mengarahkan aliran ke status baru yang tepat, atau melakukan tindakan yang tepat.

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();
}
}
break;

Cuplikan kode sebelumnya menunjukkan bagaimana mode IDLE dikelola, dan ini cukup self-explanatory. Contoh lain menunjukkan bagaimana tekanan tombol apa pun saat berbunyi akan menghentikannya:

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

Terlihat mudah, bukan? :-) Memang mudah.

Blok berikut - "Time management" - melakukan perhitungan selisih waktu yang sebenarnya, memicu mode RINGING dan sebenarnya berbunyi buzzer saat saatnya untuk melakukannya.

Blok terakhir - "LCD management" - mengelola tampilan LCD untuk setiap mode dengan mencetak string yang tepat di lokasi yang tepat.

Itu saja.

Kesimpulan dan Tindakan!

Sekarang anjing kecil ini tidak lagi memiliki rahasia untuk Anda, mari kita lihatnya dalam aksi. Terima kasih telah menonton, dan bersenang-senang!


Kode

ArduinoSketchArduino
/************************************************** * Arduino Kitchen Timer v1.0 - 2016/01/27 * By Angelo Fiorillo (Rome, IT) * This work is distributed under the GNU General * Public License version 3 or later (GPL3+) * Please include this credit note if you want to * re-use any part of this sketch. Respect my work * as I'll do with yours. * Feel free to contact me: afiorillo@gmail.com * ************************************************/ #include <LiquidCrystal.h> #include <TimeLib.h> // FIX 2018-08-12 This fixes «‘now’ was not declared in this scope» error LiquidCrystal 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; // How many hours will count down when started int setupMinutes = 0; // How many minutes will count down when started int setupSeconds = 0; // How many seconds will count down when started time_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; bool resetButtonLongPressed = false; bool 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=idle 1=setup 2=running 3=ringing // Power up --> idle // Reset --> idle // Start/Stop --> start or stop counter // Up / Down --> NOP // Reset (long press) --> enter setup // Start/Stop --> data select // Up --> increase current data value // Down --> decrease current data value // Reset --> exit setup (idle) int dataSelection = 0; // Currently selected data for edit (setup mode, changes with Start/Stop) // 0=hours (00-99) 1=minutes (00-59) 2=seconds (00-59) void setup() { // put your setup code here, to run once: lcd.begin(16, 2); pinMode(resetButtonPin, INPUT); pinMode(startStopButtonPin, INPUT); pinMode(upButtonPin, INPUT); pinMode(downButtonPin, INPUT); pinMode(buzzerPin, OUTPUT); Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: startStopButtonPressed = false; upButtonPressed = false; downButtonPressed = false; /* * Reset button management */ resetButtonPressed = false; resetButtonLongPressed = false; resetButtonState = digitalRead(resetButtonPin); if(resetButtonState != resetButtonPrevState) { resetButtonPressed = resetButtonState == HIGH; resetButtonPrevState = resetButtonState; } else // Long press management... { if(resetButtonState == HIGH) { resetButtonLongPressCounter++; if(resetButtonLongPressCounter == 100) { resetButtonPressed = false; resetButtonLongPressed = true; resetButtonLongPressCounter = 0; } } else { resetButtonLongPressCounter = 0; resetButtonPressed = false; resetButtonLongPressed = false; } } /* * Start/Stop button management */ startStopButtonPressed = false; startStopButtonState = digitalRead(startStopButtonPin); if(startStopButtonState != startStopButtonPrevState) { startStopButtonPressed = startStopButtonState == HIGH; startStopButtonPrevState = startStopButtonState; } /* * Down button management */ downButtonPressed = false; downButtonState = digitalRead(downButtonPin); if(downButtonState != downButtonPrevState) { downButtonPressed = downButtonState == HIGH; downButtonPrevState = downButtonState; } /* * Up button management */ upButtonPressed = false; upButtonState = digitalRead(upButtonPin); if(upButtonState != upButtonPrevState) { upButtonPressed = upButtonState == HIGH; upButtonPrevState = upButtonState; } /* * Mode management */ 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) { // STARTING TIMER! startTime = now(); } } break; case MODE_SETUP: if(resetButtonPressed) { // Exit setup mode setupTime = setupSeconds + (60 * setupMinutes) + (3600 * setupHours); currentHours = setupHours; currentMinutes = setupMinutes; currentSeconds = setupSeconds; dataSelection = 0; currentMode = MODE_IDLE; } if(startStopButtonPressed) { // Select next data to adjust dataSelection++; if(dataSelection == 3) { dataSelection = 0; } } if(downButtonPressed) { switch(dataSelection) { case 0: // hours setupHours--; if(setupHours == -1) { setupHours = 99; } break; case 1: // minutes setupMinutes--; if(setupMinutes == -1) { setupMinutes = 59; } break; case 2: // seconds setupSeconds--; if(setupSeconds == -1) { setupSeconds = 59; } break; } } if(upButtonPressed) { switch(dataSelection) { case 0: // hours setupHours++; if(setupHours == 100) { setupHours = 0; } break; case 1: // minutes setupMinutes++; if(setupMinutes == 60) { setupMinutes = 0; } break; case 2: // seconds setupSeconds++; if(setupSeconds == 60) { setupSeconds = 0; } break; } } break; case MODE_RUNNING: if(startStopButtonPressed) { currentMode = MODE_IDLE; } if(resetButtonPressed) { Reset(); currentMode = MODE_IDLE; } break; case MODE_RINGING: if(resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) { currentMode = MODE_IDLE; } break; } /* * Time management */ switch(currentMode) { case MODE_IDLE: case MODE_SETUP: // NOP break; case MODE_RUNNING: currentTime = setupTime - (now() - startTime); if(currentTime <= 0) { currentMode = MODE_RINGING; } break; case MODE_RINGING: analogWrite(buzzerPin, 20); delay(20); analogWrite(buzzerPin, 0); delay(40); break; } /* * LCD management */ //lcd.clear(); lcd.setCursor(0, 0); switch(currentMode) { case MODE_IDLE: lcd.print("Timer ready "); lcd.setCursor(0, 1); lcd.print(currentHours); lcd.print(" "); lcd.print(currentMinutes); lcd.print(" "); lcd.print(currentSeconds); lcd.print(" "); break; case MODE_SETUP: lcd.print("Setup mode: "); switch(dataSelection) { case 0: lcd.print("HRS "); break; case 1: lcd.print("MINS"); break; case 2: lcd.print("SECS"); break; } lcd.setCursor(0, 1); lcd.print(setupHours); lcd.print(" "); lcd.print(setupMinutes); lcd.print(" "); lcd.print(setupSeconds); lcd.print(" "); break; case MODE_RUNNING: lcd.print("Counting down..."); lcd.setCursor(0, 1); if(hour(currentTime) < 10) lcd.print("0"); lcd.print(hour(currentTime)); lcd.print(":"); if(minute(currentTime) < 10) lcd.print("0"); lcd.print(minute(currentTime)); lcd.print(":"); if(second(currentTime) < 10) lcd.print("0"); lcd.print(second(currentTime)); break; case MODE_RINGING: lcd.print(" RING-RING! "); lcd.setCursor(0, 1); lcd.print(" "); break; } delay(10); } void Reset() { currentMode = MODE_IDLE; currentHours = setupHours; currentMinutes = setupMinutes; currentSeconds = setupSeconds; } 

Proses manufaktur

  1. Alarm Tanaman Cerdas Thirst Alert – Sensor DIY untuk Hidrasi Tanaman Optimal
  2. Membuat Osiloskop Arduino 20 kHz pada Layar LCD Nokia 5110 – Panduan DIY Mudah
  3. Smart Blinds: Kontrol Cahaya Otomatis dengan Arduino & Energi Surya
  4. Bangun Jam Kata Italia dengan Arduino Nano, NeoPixel, LCD, dan RTC
  5. Membuat Timer Hitung Mundur Arduino yang Andalan dengan Layar 7-Segmen SparkFun
  6. Membuat Meter kWh Sigfox Terpercaya dengan Arduino MKR Fox 1200
  7. Pemantau Suhu dengan Bluetooth menggunakan Arduino Nano
  8. Kunci Gestur Sentuh Bebas: Akses Aman dengan APDS-9960 dan Arduino
  9. Bangun Rangkaian Input Analog Terisolasi untuk Arduino
  10. Tes Waktu Reaksi Presisi Menggunakan Arduino UNO