Daftar Isi:
- Perlengkapan
- Langkah 1: Cara Kerja Jam Digital
- Langkah 2: Mesin Negara
- Langkah 3: Perisai Tombol LCD
- Langkah 4: Menghubungkan Mesin Negara
- Langkah 5: Menghubungkan Hal-Hal Bersama
- Langkah 6: Dapatkan Contoh
Video: Jam Digital di Arduino Menggunakan Mesin Finite State: 6 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:55
Hai, saya akan menunjukkan kepada Anda bagaimana jam tangan digital dapat dibuat dengan YAKINDU Statechart Tools dan dijalankan di Arduino, yang menggunakan LCD Keypad Shield.
Model asli jam tangan digital ini diambil dari David Harel. Dia telah menerbitkan sebuah makalah tentang
"[…] perluasan luas dari formalisme konvensional mesin negara dan diagram negara."
Dalam tulisan ini, ia menggunakan contoh jam tangan digital untuk penelitiannya. Saya telah menggunakannya sebagai inspirasi dan membangun kembali arloji dengan YAKINDU Statechart Tools (alat untuk membuat model grafis mesin negara dan menghasilkan kode C/C++ dengannya) dan menghidupkannya kembali di Arduino.
Perlengkapan
Perangkat keras:
- Arduino Uno atau Mega
- Perisai Tombol LCD
Perangkat lunak:
- Alat Bagan Negara YAKINDU
- Eclipse C++ IDE untuk Arduino
Langkah 1: Cara Kerja Jam Digital
Mari kita mulai dengan mendefinisikan bagaimana jam tangan digital seharusnya bekerja. Apakah Anda ingat ini … katakanlah … jam tangan digital "sangat keren" yang dimiliki semua orang di tahun 90-an? Stopwatch terintegrasi, alarm berbeda, dan bunyi bip yang mengganggu setiap jam penuh. Jika tidak, lihatlah: jam tangan digital 90-an.
Jadi pada dasarnya ini adalah jam tangan yang dapat dikonfigurasi dengan mode berbeda. Terutama, waktu saat ini akan ditampilkan, tetapi ada beberapa fitur lainnya. Sebagai input, Anda memiliki tombol on/off, mode, dan set. Selain itu, Anda dapat menyalakan dan mematikan lampu. Dengan tombol mode, Anda dapat membedakan antara mode dan mengaktifkan/menonaktifkan fitur jam:
- Menampilkan waktu (Jam)
- Menampilkan tanggal (Tanggal)
- Atur alarm (Alarm 1, Alarm 2)
- Aktifkan/nonaktifkan lonceng (Atur Lonceng)
- Gunakan stopwatch (Stop Watch)
Di dalam menu, Anda dapat menggunakan tombol on/off untuk mengonfigurasi mode. Tombol set memungkinkan Anda untuk mengatur waktu - mis. untuk jam atau alarm. Stopwatch dapat dikontrol - mulai dan berhenti - dengan menggunakan tombol lampu hidup dan mati. Anda juga dapat menggunakan penghitung putaran terintegrasi
Selain itu, ada lonceng, yang berbunyi setiap jam penuh, dan lampu latar yang dapat dikontrol terintegrasi. Pada langkah pertama, saya tidak menghubungkannya ke Arduino.
Langkah 2: Mesin Negara
Saya tidak ingin membahas terlalu detail untuk penjelasan contoh ini. Bukan karena terlalu rumit, hanya saja agak terlalu besar. Saya akan mencoba menjelaskan ide dasar cara kerjanya. Eksekusi harus menjelaskan sendiri, dengan melihat model atau mengunduh dan mensimulasikannya. Beberapa bagian dari mesin negara dijumlahkan di sub wilayah, seperti wilayah waktu yang ditetapkan. Dengan ini, keterbacaan mesin negara harus dipastikan.
Model ini dibagi menjadi dua bagian - grafis dan tekstual. Di bagian tekstual peristiwa, variabel, dll akan didefinisikan. Di bagian grafis - diagram keadaan - eksekusi logis dari model ditentukan. Untuk membuat mesin keadaan, yang memenuhi perilaku yang ditentukan, beberapa peristiwa input diperlukan, yang dapat digunakan dalam model: onoff, set, mode, light, dan light_r. Dalam bagian definisi, peristiwa internal digunakan, yang menambah nilai waktu setiap 100 mdtk:
setiap 100 ms / waktu += 1
Berdasarkan langkah 100 ms, waktu saat ini akan dihitung dalam format HH:MM:SS:
tampilan.pertama = (waktu / 36000) % 24;
tampilan.detik = (waktu / 600) % 60; tampilan.ketiga = (waktu / 10) % 60;
Nilai akan ditransfer ke layar LCD dengan menggunakan operasi updateLCD setiap kali state machine akan dipanggil:
display.updateLCD(tampilan.pertama, tampilan.kedua, tampilan.ketiga, tampilan.teks)
Eksekusi dasar mesin negara sudah ditentukan di bagian Bagaimana Jam Tangan Digital bekerja. Di dalam alat ini saya telah menggunakan beberapa elemen pemodelan "khusus" seperti CompositeState, History, Sub-Diagrams, ExitNodes, dll. Penjelasan rinci dapat ditemukan di Panduan Pengguna.
Langkah 3: Perisai Tombol LCD
LCD Keypad Shield cukup keren untuk proyek sederhana, yang memerlukan layar untuk visualisasi dan beberapa tombol sebagai input - HMI (Human Machine Interface) yang sederhana dan khas. LCD Keypad Shield berisi lima tombol pengguna dan satu lagi untuk reset. Lima tombol semuanya terhubung ke pin A0 Arduino. Masing-masing terhubung ke pembagi tegangan, yang memungkinkan pembedaan antara tombol.
Anda dapat menggunakan analogRead(0) untuk menemukan nilai spesifik, yang tentu saja dapat berbeda menurut produsennya. Proyek sederhana ini menampilkan nilai saat ini pada LCD:
#sertakan "Arduino.h"
#termasuk "LiquidCrystal.h" LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.write("Nilai Terukur"); } void loop() { lcd.setCursor(0, 1); lcd.print(""); lcd.setCursor(0, 1); lcd.print(analogRead(0)); penundaan (200); }
Ini adalah hasil pengukuran saya:
- Tidak ada: 1023
- Pilih: 640
- Kiri: 411
- Bawah: 257
- Naik: 100
- Kanan: 0
Dengan ambang batas ini, Anda dapat membaca tombol:
#define NONE 0#define SELECT 1 #define KIRI 2 #define BAWAH 3 #define UP 4 #define KANAN 5 static int readButton() { int result = 0; hasil = analogRead(0); if (hasil < 50) { kembali KANAN; } if (hasil < 150) { kembali NAIK; } if (hasil < 300) { kembali TURUN; } if (hasil < 550) { kembali ke KIRI; } if (hasil < 850) { kembali SELECT; } mengembalikan NONE; }
Langkah 4: Menghubungkan Mesin Negara
Kode C++ yang dihasilkan dari mesin negara menyediakan antarmuka, yang harus diimplementasikan untuk mengontrol mesin negara. Langkah pertama adalah menghubungkan acara in dengan tombol dari Keypad Shield. Saya telah menunjukkan cara membaca tombol, tetapi untuk menghubungkannya ke mesin negara, diperlukan debouncing tombol - jika tidak, acara akan dimunculkan beberapa kali, yang menghasilkan perilaku yang tidak dapat diprediksi. Konsep debouncing perangkat lunak bukanlah hal baru. Anda dapat melihat dokumentasi Arduino.
Dalam implementasi saya, saya mendeteksi tepi yang jatuh (melepaskan tombol). Saya membaca nilai tombol, menunggu 80 ms (mendapatkan hasil yang lebih baik dengan 80 daripada 50), menyimpan hasilnya dan membaca nilai baru. Jika hasil lama bukan NONE (tidak ditekan) dan hasil baru NONE, saya tahu, bahwa tombol telah ditekan sebelumnya dan sekarang telah dilepaskan. Kemudian, saya menaikkan acara input yang sesuai dari mesin negara.
int oldState = NONE;static void raiseEvents() { int buttonPressed = readButton(); penundaan (80); oldState = tombolDitekan; if (oldState != NONE && readButton() == NONE) { switch (oldState) { case SELECT: { stateMachine->getSCI_Button()->raise_mode(); merusak; } kasus KIRI: { stateMachine->getSCI_Button()->raise_set(); merusak; } kasus BAWAH: { stateMachine->getSCI_Button()->raise_light(); merusak; } kasus UP: { stateMachine->getSCI_Button()->raise_light_r(); merusak; } kasus KANAN: { stateMachine->getSCI_Button()->raise_onoff(); merusak; } default: { istirahat; } } } }
Langkah 5: Menghubungkan Hal-Hal Bersama
Program utama menggunakan tiga bagian:
- Mesin Negara
- Sebuah Timer
- Handler Tampilan (lcd.print(…))
DigitalWatch* stateMachine = new DigitalWatch();CPPTimerInterface* timer_sct = CPPTimerInterface baru(); DisplayHandler* displayHandler = DisplayHandler baru();
Mesin negara menggunakan penangan tampilan dan mendapat pengatur waktu, yang akan diperbarui untuk mengontrol peristiwa waktunya. Setelah itu, mesin negara diinisialisasi dan dimasukkan.
void setup() { stateMachine->setSCI_Display_OCB(displayHandler); stateMachine->setTimer(timer_sct); stateMachine->init(); stateMachine->enter(); }Loop melakukan tiga hal:
- Tingkatkan acara masukan
- Hitung waktu yang telah berlalu dan perbarui penghitung waktu
- Panggil mesin negara
lama_waktu_saat_panjang = 0;waktu_siklus_lama_lama = 0; void loop() { kenaikanAcara(); last_cycle_time = waktu_saat ini; saat_waktu = milis(); timer_sct->updateActiveTimer(stateMachine, current_time - last_cycle_time); stateMachine->runCycle(); }
Langkah 6: Dapatkan Contoh
Itu dia. Mungkin, saya belum menyebutkan setiap detail implementasi, tetapi Anda dapat melihat contoh atau memberikan komentar.
Tambahkan contoh ke IDE yang sedang berjalan dengan: File -> New -> Example -> YAKINDU Statechart Example -> Next -> Arduino - Digital Watch (C++)
> Anda dapat mengunduh IDE di sini <<
Anda dapat memulai dengan uji coba 30 hari. Setelah itu, Anda harus mendapatkan lisensi, yang gratis untuk penggunaan non-komersial!
Direkomendasikan:
Cara Membuat Jam Analog & Jam Digital Dengan Led Strip Menggunakan Arduino: 3 Langkah
Cara Membuat Jam Analog & Jam Digital Dengan Led Strip Menggunakan Arduino : Hari ini kita akan membuat Jam Analog & Jam digital dengan modul Led Strip dan MAX7219 Dot dengan Arduino. Ini akan mengoreksi waktu dengan zona waktu lokal. Jam Analog bisa menggunakan strip LED yang lebih panjang, sehingga bisa digantung di dinding menjadi karya seni
Jam Jaringan ESP8266 Tanpa RTC - Nodemcu NTP Jam Tidak Ada RTC - PROYEK JAM INTERNET: 4 Langkah
Jam Jaringan ESP8266 Tanpa RTC | Nodemcu NTP Jam Tidak Ada RTC | INTERNET CLOCK PROJECT : Pada project ini akan dibuat project clock tanpa RTC, akan memakan waktu dari internet menggunakan wifi dan akan ditampilkan pada layar st7735
HX1-DM - Mesin Drum DIY Bertenaga Arduino DUE (dibuat Dengan Mesin Mati MK2): 4 Langkah
HX1-DM - Mesin Drum DIY Bertenaga Arduino DUE yang Didaur Ulang (dibuat Dengan Mesin Mati MK2): Spesifikasi. Kontroler Midi / mesin drum hibrida: Bertenaga Arduino DUE! 16 Bantalan penginderaan kecepatan dengan latensi sangat rendah 1>ms 8 kenop yang dapat ditetapkan pengguna untuk perintah Midi #CC apa pun 16ch Sequencer bawaan (tidak perlu komputer!!) Fungsi masuk/keluar/melalui MIDI
Membuat Jam Dengan M5stick C Menggunakan Arduino IDE - Jam Waktu Nyata RTC Dengan M5stack M5stick-C: 4 Langkah
Membuat Jam Dengan M5stick C Menggunakan Arduino IDE | Jam Waktu Nyata RTC Dengan M5stack M5stick-C: Hai teman-teman dalam instruksi ini kita akan belajar cara membuat jam dengan papan pengembangan m5stick-C dari m5stack menggunakan Arduino IDE. Jadi m5stick akan menampilkan tanggal, waktu & minggu dalam sebulan di layar
Jam Digital 12 Jam Menggunakan Arduino: 3 Langkah
Jam Digital 12 Jam Menggunakan Arduino: Ini adalah proyek berbasis papan tempat memotong roti yang menggunakan Atmel Atmega 2560 (Arduino Mega) dan Layar LCD 16x2 untuk membuat jam digital 12 jam tanpa perlu periferal tambahan. Kami juga dapat mengatur dan memodifikasi waktu dengan bantuan dua tombol tekan. Seluruh