Daftar Isi:

Jam Digital di Arduino Menggunakan Mesin Finite State: 6 Langkah
Jam Digital di Arduino Menggunakan Mesin Finite State: 6 Langkah

Video: Jam Digital di Arduino Menggunakan Mesin Finite State: 6 Langkah

Video: Jam Digital di Arduino Menggunakan Mesin Finite State: 6 Langkah
Video: #4 Teori Bahasa & Otomata - Finite State Automata 2024, November
Anonim
Jam Digital di Arduino Menggunakan Mesin Finite State
Jam Digital di Arduino Menggunakan Mesin Finite State

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

Image
Image

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

Perisai Tombol LCD
Perisai Tombol LCD

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

Menghubungkan Mesin Negara
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: