Isi kandungan:

Jam Digital di Arduino Menggunakan Mesin Keadaan Terhingga: 6 Langkah
Jam Digital di Arduino Menggunakan Mesin Keadaan Terhingga: 6 Langkah

Video: Jam Digital di Arduino Menggunakan Mesin Keadaan Terhingga: 6 Langkah

Video: Jam Digital di Arduino Menggunakan Mesin Keadaan Terhingga: 6 Langkah
Video: Arduino - Jam digital 7 Segment [Proteus Simulation] 2024, November
Anonim
Jam Digital di Arduino Menggunakan Mesin Keadaan Terhingga
Jam Digital di Arduino Menggunakan Mesin Keadaan Terhingga

Hai, saya akan menunjukkan kepada anda bagaimana jam tangan digital boleh dibuat dengan YAKINDU Statechart Tools dan dijalankan di Arduino, yang menggunakan LCD Keypad Shield.

Model asal jam digital diambil dari David Harel. Dia telah menerbitkan sebuah makalah mengenai

"[…] Penyebaran luas formalisme konvensional mesin negara dan gambarajah negeri."

Dalam makalah ini, dia menggunakan contoh jam tangan digital untuk penyelidikannya. Saya telah menggunakannya sebagai inspirasi dan membina semula jam tangan dengan YAKINDU Statechart Tools (alat untuk membuat model grafik mesin negara dan menghasilkan kod C / C ++ dengannya) dan menghidupkannya semula di Arduino.

Bekalan

Perkakasan:

  • Arduino Uno atau Mega
  • Perisai Pad Kekunci LCD

Perisian:

  • Alat Carta Negeri YAKINDU
  • Eclipse C ++ IDE untuk Arduino

Langkah 1: Bagaimana Jam Tangan Digital Berfungsi

Image
Image

Mari mulakan dengan menentukan bagaimana jam tangan digital berfungsi. Adakah anda ingat ini … katakanlah … jam tangan digital "sangat sejuk" yang dimiliki semua orang pada tahun 90-an? Jam randik bersepadu, penggera berbeza dan bunyi bip yang menjengkelkan setiap jam penuh. Sekiranya tidak, lihatlah: jam tangan digital tahun 90-an.

Jadi pada dasarnya ia adalah jam tangan yang boleh dikonfigurasi dengan mod yang berbeza. Terutama, masa semasa akan dipaparkan, tetapi ada beberapa ciri lain. Sebagai input, anda mempunyai hidup / mati, mod dan butang set. Selain itu, anda boleh menghidupkan dan mematikan lampu. Dengan butang mod anda dapat membezakan antara mod dan mengaktifkan / mematikan ciri jam:

  • Paparkan masa (Jam)
  • Paparkan tarikh (Tarikh)
  • Tetapkan penggera (Penggera 1, Penggera 2)
  • Aktifkan / nyahaktifkan lonceng (Set Berpadu)
  • Gunakan jam randik (Stop Watch)

Di dalam menu, anda boleh menggunakan butang hidup / mati untuk mengkonfigurasi mod. Butang set membolehkan anda menetapkan waktu - mis. untuk jam atau penggera. Jam randik dapat dikawal - dimulakan dan dihentikan - dengan menggunakan butang lampu hidup dan mati. Anda juga boleh menggunakan kaunter pusingan bersepadu

Selain itu, terdapat bunyi berpadu, yang berbunyi setiap jam penuh, dan lampu latar terkawal disatukan. Pada langkah pertama, saya tidak memasukkannya ke Arduino.

Langkah 2: Mesin Negeri

Perisai Pad Kekunci LCD
Perisai Pad Kekunci LCD

Saya tidak mahu membincangkan lebih terperinci mengenai contoh ini. Bukan kerana terlalu rumit, ia terlalu besar. Saya akan cuba menerangkan idea asas bagaimana ia berfungsi. Pelaksanaannya harus jelas, dengan melihat model atau memuat turun dan mensimulasikannya. Beberapa bahagian mesin negara dijumlahkan di sub wilayah, seperti wilayah waktu yang ditetapkan. Dengan ini, kesediaan mesin negeri dapat dipastikan.

Model ini dibahagikan kepada dua bahagian - grafik dan teks. Di bahagian teks peristiwa, pemboleh ubah, dll akan ditentukan. Pada bahagian grafik - gambarajah keadaan - pelaksanaan logik model ditentukan. Untuk membuat mesin keadaan, yang memenuhi tingkah laku yang ditentukan, diperlukan beberapa peristiwa input, yang dapat digunakan dalam model: onoff, set, mode, light, dan light_r. Dalam bahagian definisi digunakan peristiwa dalaman, yang menambah nilai waktu setiap 100 ms:

setiap 100 ms / masa + = 1

Berdasarkan langkah 100 ms waktu semasa akan dikira dalam format HH: MM: SS:

display.first = (masa / 36000)% 24;

display.second = (masa / 600)% 60; display.third = (masa / 10)% 60;

Nilai akan disambungkan ke paparan LCD dengan menggunakan pembaruan operasi LCD setiap kali mesin keadaan dipanggil:

display.updateLCD (display.first, display.second, display.third, display.text)

Pelaksanaan asas mesin keadaan sudah ditentukan dalam bahagian Bagaimana Digital Watch berfungsi. Di dalam alat ini saya telah menggunakan beberapa elemen pemodelan "khas" seperti CompositeState, History, Sub-Diagram, ExitNodes, dll. Penerangan terperinci boleh didapati di Panduan Pengguna.

Langkah 3: Perisai Pad Kekunci LCD

Perisai Keypad LCD cukup keren untuk projek sederhana, yang memerlukan skrin untuk visualisasi dan beberapa butang sebagai input - HMI khas (Antaramuka Mesin Manusia). LCD Keypad Shield mengandungi lima butang pengguna dan satu lagi untuk reset. Lima butang semuanya disambungkan ke pin A0 Arduino. Masing-masing disambungkan ke pembahagi voltan, yang membolehkan membezakan antara butang.

Anda boleh menggunakan analogRead (0) untuk mencari nilai tertentu, yang tentu saja berbeza dengan pengeluar. Projek mudah ini memaparkan nilai semasa pada LCD:

#sertakan "Arduino.h"

#masuk "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); persediaan tidak sah () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("Nilai Diukur"); } gelung void () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); kelewatan (200); }

Ini adalah hasil pengukuran saya:

  • Tiada: 1023
  • Pilih: 640
  • Kiri: 411
  • Turun: 257
  • Naik: 100
  • Betul: 0

Dengan ambang ini boleh membaca butang:

#define TIADA 0 # tentukan SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define KANAN 5 statik int readButton () {int result = 0; hasil = analogRead (0); jika (hasil <50) {kembali KANAN; } jika (hasil <150) {kembali ke atas; } jika (hasil <300) {kembali KE BAWAH; } jika (hasil <550) {kembali KIRI; } jika (hasil <850) {kembali PILIH; } kembali TIADA; }

Langkah 4: Memadankan Mesin Negara

Memintas Mesin Negara
Memintas Mesin Negara

Kod C ++ yang dihasilkan mesin keadaan menyediakan antara muka, yang mesti dilaksanakan untuk mengawal mesin keadaan. Langkah pertama adalah menghubungkan acara dengan kunci Keypad Shield. Saya sudah menunjukkan cara membaca butang, tetapi untuk menghubungkannya ke mesin negara, butang yang diperlukan - jika tidak, acara akan dibangkitkan berkali-kali, yang mengakibatkan tingkah laku yang tidak dapat diramalkan. Konsep penyahtinjaan perisian bukanlah perkara baru. Anda boleh melihat dokumentasi Arduino.

Dalam pelaksanaan saya, saya mengesan kejatuhan (melepaskan butang). Saya membaca nilai butang, tunggu 80 ms (mendapat hasil yang lebih baik dengan 80 bukannya 50), simpan hasilnya dan baca nilai baru. Sekiranya oldResult tidak TIADA (tidak ditekan) dan hasil baru adalah TIADA, saya tahu, bahawa butang telah ditekan sebelumnya dan sekarang telah dilepaskan. Kemudian, saya menaikkan peristiwa input yang sesuai dari mesin keadaan.

int oldState = TIADA; kenaikan kekosongan statik Peristiwa () {int butang Ditekan = readButton (); kelewatan (80); oldState = butang Ditekan; if (oldState! = NONE && readButton () == TIADA) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button () -> raise_mode (); rehat; } kes KIRI: {stateMachine-> getSCI_Button () -> raise_set (); rehat; } kes KE BAWAH: {stateMachine-> getSCI_Button () -> raise_light (); rehat; } kes UP: {stateMachine-> getSCI_Button () -> raise_light_r (); rehat; } kes KANAN: {stateMachine-> getSCI_Button () -> raise_onoff (); rehat; } lalai: {rehat; }}}}

Langkah 5: Menggabungkan Perkara Bersama

Program utama menggunakan tiga bahagian:

  • Mesin Negeri
  • Pemasa
  • Penangan Paparan (cetakan lcd khas (…))

DigitalWatch * stateMachine = DigitalWatch baru (); CPPTimerInterface * timer_sct = CPPTimerInterface baru (); DisplayHandler * displayHandler = baru DisplayHandler ();

Mesin negara menggunakan pengendali paparan dan mendapat pemasa, yang akan dikemas kini untuk mengawal peristiwa masa. Selepas itu, mesin keadaan diinisialisasi dan dimasukkan.

batal persediaan () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> masukkan (); }Gelung melakukan tiga perkara:

  • Naikkan acara input
  • Hitung masa yang berlalu dan kemas kini pemasa
  • Panggil mesin negeri

long_time current = 0; last_cycle_time = 0 yang panjang; gelung kekosongan () {raiseEvents (); last_cycle_time = current_time; current_time = milis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Langkah 6: Dapatkan Contohnya

Itu sahaja. Mungkin, saya tidak menyebutkan setiap perincian pelaksanaannya, tetapi anda boleh melihat contohnya atau memberikan komen.

Tambahkan contoh ke IDE yang sedang berjalan dengan: Fail -> Baru -> Contoh -> Contoh Carta Negeri YAKINDU -> Seterusnya -> Arduino - Jam Digital (C ++)

> Anda boleh memuat turun IDE di sini <<

Anda boleh memulakan dengan percubaan 30 hari. Selepas itu, anda mesti mendapat lesen, yang percuma untuk penggunaan bukan komersial!

Disyorkan: