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

Jam Digital di Arduino Menggunakan Mesin Finite State

Komponen dan persediaan

Arduino UNO
Anda dapat menggunakan setiap Arduino, yang kompatibel dengan LCD Shield. Saya telah menggunakan Arduino Mega.
× 1
Pelindung Keypad LCD
× 1

Aplikasi dan layanan online

Alat Diagram Status YAKINDU
Gratis untuk penggunaan non-komersial.
Eclipse C++ IDE untuk Arduino

Tentang proyek ini

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 makalah tentang "perpanjangan luas dari formalisme konvensional mesin negara dan diagram negara."

Dalam makalah ini ia menggunakan contoh jam tangan digital untuk penelitiannya. Saya telah menggunakannya sebagai inspirasi dan membangun kembali jam tangan dengan YAKINDU Statechart Tools (alat untuk membuat model grafis mesin negara dan menghasilkan kode C/C++ dengannya) dan menghidupkannya kembali di Arduino.

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 belum, lihatlah:jam 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 masukan, Anda memiliki hidup/mati , sebuah mode dan set tombol. Selain itu, Anda dapat menyalakan dan mematikan lampu.

Dengan mode tombol Anda dapat membedakan antara mode dan mengaktifkan/menonaktifkan fitur jam:

  • Menampilkan waktu (Jam)
  • Menampilkan tanggal (Tanggal)
  • Setel alarm (Alarm 1, Alarm 2)
  • Aktifkan/nonaktifkan lonceng (Atur Lonceng)
  • Gunakan stopwatch (Stop Watch)

Di dalam menu, Anda dapat menggunakan tombol hidup/mati tombol untuk mengkonfigurasi mode. set tombol 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 saat, dan lampu latar yang dapat dikontrol terintegrasi. Pada langkah pertama saya tidak menghubungkannya ke Arduino.

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 waktu yang disetel wilayah. 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 status, yang memenuhi perilaku yang ditentukan, beberapa kejadian input diperlukan, yang dapat digunakan dalam model:onoff , setel , modus , ringan , dan light_r. Dalam bagian definisi, peristiwa internal digunakan, yang meningkatkan nilai waktu setiap 100 md:

setiap 100 md/waktu +=1 

Berdasarkan langkah 100 mdtk, waktu saat ini akan dihitung dalam HH:MM:SS format:

display.first =(waktu / 36000) % 24;
display.second =(waktu / 600) % 60;
display.third =(waktu / 10) % 60;

Nilai akan ditransfer ke layar LCD dengan menggunakan operasi updateLCD setiap kali mesin negara akan dipanggil:

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

Eksekusi dasar mesin status sudah ditentukan di bagian Cara kerja Jam Digital . Di dalam alat ini saya telah menggunakan beberapa elemen pemodelan "khusus" seperti CompositeState , Sejarah , Sub-Diagram , ExitNodes, dll. Penjelasan rinci dapat ditemukan di Panduan Pengguna.

Pelindung 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 untuk membedakan 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 di LCD:

#include 
#include

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

pengaturan batal() {
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));
delay(200);
}

Ini adalah hasil pengukuran saya:

  • Tidak ada:1023
  • Pilih:640
  • Kiri:411
  • Turun:257
  • Naik:100
  • Kanan:0

Dengan ambang batas ini, tombol dapat dibaca:

#define NONE 0
#define SELECT 1
#define KIRI 2
#define BAWAH 3
#define UP 4
#define KANAN 5

static int readButton() {
int result =0;
result =analogRead(0);
if (result <50) {
return KANAN;
}
if (hasil <150) {
return UP;
}
if (hasil <300) {
return DOWN;
}
if (hasil <550) {
return LEFT;
}
if (hasil <850) {
return SELECT;
}
kembalikan NONE;
}

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 sudah 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, tunggu 80 ms (mendapatkan hasil yang lebih baik dengan 80 daripada 50), simpan hasilnya dan baca nilai baru. Jika oldResult bukan TIDAK ADA (tidak ditekan) dan hasil barunya adalah TIDAK ADA , 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();
delay(80);
oldState =buttonPressed;
if (oldState !=NONE &&readButton() ==NONE) {
switch (oldState) {
case SELECT:{
stateMachine->getSCI_Button()->raise_mode();
break;
}
case KIRI:{
stateMachine->getSCI_Button()->raise_set();
break;
}
kasus BAWAH:{
stateMachine->getSCI_Button()->raise_light();
break;
}
kasus UP:{
stateMachine->getSCI_Button() ->raise_light_r();
break;
}
case KANAN:{
stateMachine->getSCI_Button()->raise_onoff();
break;
}
default:{
break;
}
}
}
}

Menghubungkan Hal-Hal Bersama

Program utama menggunakan tiga bagian:

  • Mesin Negara
  • Pengatur Waktu
  • Penangan Tampilan (lcd.print(...)) biasa
DigitalWatch* stateMachine =new DigitalWatch();
CPPTimerInterface* timer_sct =new CPPTimerInterface();
DisplayHandler* displayHandler =new DisplayHandler();

Mesin negara menggunakan penangan tampilan dan mendapat pengatur waktu, yang akan diperbarui untuk mengontrol peristiwa waktunya. Setelah itu, mesin negara akan diinisialisasi dan dimasukkan.

pengaturan batal() {
stateMachine->setSCI_Display_OCB(displayHandler);
stateMachine->setTimer(timer_sct);
stateMachine->init();
stateMachine->enter();
}

Perulangan melakukan tiga hal:

  • Meningkatkan peristiwa masukan
  • Hitung waktu yang telah berlalu dan perbarui timer
  • Panggil mesin negara
waktu_saat ini lama =0;
waktu_siklus_terakhir =0;
void loop() {
raiseEvents();
last_cycle_time =current_time;
current_time =milis();
timer_sct->updateActiveTimer(stateMachine,
current_time - last_cycle_time);
stateMachine->runCycle();
}

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 -> Baru -> Contoh -> Contoh Statechart YAKINDU -> Berikutnya -> Arduino - Jam Digital (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 !


Proses manufaktur

  1. Mesin Keadaan Hingga
  2. Membuat Monitor Ambilight Menggunakan Arduino
  3. Arduino Digital Dice
  4. Mesin ULTRASONIC LEVITATION Menggunakan ARDUINO
  5. Voltmeter DIY Menggunakan Arduino dan Smartphone
  6. Pemantau Detak Jantung Menggunakan IoT
  7. WebServerBlink Menggunakan Arduino Uno WiFi
  8. Klon Arduino Tamagotchi - Hewan Peliharaan Digital
  9. Arduino Apple Watch
  10. Game Dino otomatis menggunakan arduino