İçindekiler:
- Gereçler
- 1. Adım: Dijital Saat Nasıl Çalışır?
- 2. Adım: Durum Makinesi
- Adım 3: LCD Tuş Takımı Kalkanı
- Adım 4: Durum Makinesinin Arayüz Oluşturulması
- Adım 5: İşleri Birlikte Kablolama
- Adım 6: Örneği Alın
Video: Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat: 6 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:18
Merhaba, size YAKINDU Statechart Tools ile bir dijital saatin nasıl oluşturulabileceğini ve LCD Keypad Shield kullanan bir Arduino üzerinde nasıl çalıştırılabileceğini göstereceğim.
Dijital saatin orijinal modeli David Harel'den alınmıştır. hakkında bir makale yayınladı.
"[…] durum makinelerinin ve durum diyagramlarının geleneksel formalizminin geniş uzantısı."
Bu yazıda, araştırması için dijital saat örneğini kullanmıştır. Bunu bir ilham kaynağı olarak kullandım ve saati YAKINDU Statechart Tools (durum makinelerinin grafik modellerini oluşturmak ve onunla C/C++ kodu oluşturmak için bir araç) ile yeniden oluşturdum ve bir Arduino'da hayata döndürdüm.
Gereçler
Donanım:
- Arduino Uno veya Mega
- LCD Tuş Takımı Kalkanı
Yazılım:
- YAKINDU Durum Çizelgesi Araçları
- Arduino için Eclipse C++ IDE
1. Adım: Dijital Saat Nasıl Çalışır?
Dijital saatin nasıl çalışması gerektiğini tanımlayarak başlayalım. Bunları hatırlıyor musunuz… diyelim… 90'larda herkesin sahip olduğu "ultra havalı" dijital saatleri? Entegre bir kronometre, farklı alarmlar ve her saat başı rahatsız edici bip sesi. Değilse, bir göz atın: 90'ların dijital saati.
Yani temelde farklı modlara sahip yapılandırılabilir bir saat. Esas olarak, geçerli saat görüntülenecektir, ancak başka özellikler de vardır. Girdi olarak, bir açma/kapama, bir mod ve bir ayar düğmeniz var. Ek olarak, ışığı açıp kapatabilirsiniz. Mod düğmesi ile modlar arasında ayrım yapabilir ve saat özelliklerini etkinleştirebilir/devre dışı bırakabilirsiniz:
- Saati göster (Saat)
- Tarihi göster (Tarih)
- Alarmı ayarlayın (Alarm 1, Alarm 2)
- Zil sesini etkinleştir/devre dışı bırak (Zil Ayarla)
- Kronometreyi kullanın (Durdur İzleme)
Menüler içinde, modu yapılandırmak için açma/kapama düğmesini kullanabilirsiniz. Ayar düğmesi, saati ayarlamanıza olanak tanır - örn. saat veya alarmlar için. Kronometre, ışık açma ve ışık kapatma düğmeleri kullanılarak kontrol edilebilir - başlatılabilir ve durdurulabilir. Entegre bir tur sayacı da kullanabilirsiniz
Ayrıca, tam saatte bir çalan bir zil sesi ve kontrol edilebilir bir arka ışık entegre edilmiştir. İlk adımda onları Arduino'ya bağlamadım.
2. Adım: Durum Makinesi
Bu örneğin açıklaması için çok detaya girmek istemiyorum. Çok karmaşık olduğu için değil, sadece biraz fazla büyük. Nasıl çalıştığına dair temel fikri açıklamaya çalışacağım. Yürütme, modele bakarak veya indirip simüle ederek kendi kendini açıklamalıdır. Durum makinesinin bazı bölümleri, ayarlanan zaman bölgesi gibi alt bölgelerde toplanır. Bununla durum makinesinin okunabilirliği sağlanmalıdır.
Model iki bölüme ayrılmıştır - grafik ve metinsel. Metinsel kısımda olaylar, değişkenler vb. tanımlanacaktır. Grafiksel kısımda - durum diyagramı - modelin mantıksal uygulaması belirtilir. Belirtilen davranışı karşılayan bir durum makinesi oluşturmak için modelde kullanılabilen bazı girdi olayları gereklidir: onoff, set, mode, light ve light_r. Tanım bölümünde, zaman değerini her 100 ms'de bir artıran dahili bir olay kullanılır:
her 100 ms / saatte bir += 1
100 ms'lik adımlara bağlı olarak mevcut saat SS:DD:SS formatında hesaplanacaktır:
display.first = (zaman / 36000) % 24;
display.saniye = (zaman / 600) % 60; display.üçüncü = (zaman / 10) % 60;
Durum makinesi her çağrıldığında, updateLCD işlemi kullanılarak değerler LCD ekrana bağlanacaktır:
display.updateLCD(ekran.ilk, görüntü.ikinci, görüntü.üçüncü, görüntü.metin)
Durum makinesinin temel yürütmesi, Dijital Saat Nasıl Çalışır bölümünde zaten tanımlanmıştır. Araç içinde CompositeState, History, Sub-Diagrams, ExitNodes, vb. gibi bazı "özel" modelleme öğeleri kullandım. Kullanıcı Kılavuzunda ayrıntılı bir açıklama bulunabilir.
Adım 3: LCD Tuş Takımı Kalkanı
LCD Tuş Takımı Kalkanı, görselleştirme için bir ekran ve giriş olarak bazı düğmeler gerektiren basit projeler için oldukça havalı - tipik, basit bir HMI (İnsan Makine Arayüzü). LCD Tuş Takımı Kalkanı beş kullanıcı düğmesi ve sıfırlama için bir tane daha içerir. Beş düğme hep birlikte Arduino'nun A0 pinine bağlanır. Her biri, düğmeler arasında ayrım yapılmasını sağlayan bir voltaj bölücüye bağlanmıştır.
Elbette üreticiye göre farklılık gösterebilecek belirli değerleri bulmak için analogRead(0)'ı kullanabilirsiniz. Bu basit proje, LCD'de mevcut değeri görüntüler:
#include "Arduino.h"
#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); geçersiz kurulum() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.write("Ölçülen Değer"); } geçersiz döngü() { lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(analogRead(0)); gecikme(200); }
Bunlar benim ölçülen sonuçlarım:
- Yok: 1023
- Seçin: 640
- Sol: 411
- Aşağı: 257
- Yukarı: 100
- Sağ: 0
Bu eşiklerle düğmeleri okumak mümkündür:
#define NONE 0#define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton() { int sonuç = 0; sonuç = analogRead(0); if (sonuç < 50) {dönüş SAĞ; } if (sonuç < 150) { dönüş YUKARI; } if (sonuç < 300) { AŞAĞI döndür; } if (sonuç < 550) { dönüş SOL; } if (sonuç < 850) { geri SEÇ; } HİÇBİRİ döndür; }
Adım 4: Durum Makinesinin Arayüz Oluşturulması
Durum makinesinin oluşturulan C++ kodu, durum makinesini kontrol etmek için uygulanması gereken arabirimler sağlar. İlk adım, olayları Keypad Shield tuşlarıyla bağlamaktır. Düğmelerin nasıl okunacağını zaten gösterdim, ancak bunları durum makinesine arayüzlemek için düğmelerin geri dönmesi gerekir - aksi takdirde olaylar birden çok kez ortaya çıkar ve bu da öngörülemeyen davranışlara neden olur. Yazılımdan çıkma kavramı yeni değil. Arduino belgelerine bir göz atabilirsiniz.
Uygulamamda, düşen bir kenar tespit ediyorum (düğmeyi bırakıyor). Butonun değerini okudum, 80 ms bekledim (50 yerine 80 ile daha iyi sonuç aldım), sonucu kaydedip yeni değeri okudum. oldResult YOK (basılmamış) değilse ve yeni sonuç YOK ise, biliyorum, düğmeye daha önce basıldı ve şimdi serbest bırakıldı. Ardından durum makinesinin uygun girdi olayını yükseltiyorum.
int oldState = NONE;statik void boostEvents() { int buttonPressed = readButton(); gecikme(80); oldState = buttonPressed; if (oldState != NONE && readButton() == NONE) { switch (oldState) { case SELECT: { stateMachine->getSCI_Button()->raise_mode(); kırmak; } durum SOL: { stateMachine->getSCI_Button()->raise_set(); kırmak; } durum AŞAĞI: { stateMachine->getSCI_Button()->raise_light(); kırmak; } durum YUKARI: { stateMachine->getSCI_Button()->raise_light_r(); kırmak; } durum SAĞ: { stateMachine->getSCI_Button()->raise_onoff(); kırmak; } varsayılan: { ara; } } } }
Adım 5: İşleri Birlikte Kablolama
Ana program üç bölüm kullanır:
- Devlet Makinesi
- Bir Zamanlayıcı
- Bir Ekran İşleyici (tipik lcd.print(…))
DigitalWatch* stateMachine = new DigitalWatch();CPPTimerInterface* timer_sct = new CPPTimerInterface(); DisplayHandler* displayHandler = new DisplayHandler();
Durum makinesi bir görüntü işleyici kullanır ve zamanlanmış olayları kontrol etmek için güncellenecek bir zamanlayıcıya sahiptir. Daha sonra durum makinesi başlatılır ve girilir.
geçersiz kurulum() { stateMachine->setSCI_Display_OCB(displayHandler); stateMachine->setTimer(timer_sct); stateMachine->init(); stateMachine->enter(); }Döngü üç şey yapar:
- Giriş olaylarını artır
- Geçen süreyi hesaplayın ve zamanlayıcıyı güncelleyin
- Durum makinesini arayın
long current_time = 0;long last_cycle_time = 0; geçersiz döngü() { yükseltmeEvents(); last_cycle_time = current_time; current_time = millis(); timer_sct->updateActiveTimer(stateMachine, current_time - last_cycle_time); stateMachine->runCycle(); }
Adım 6: Örneği Alın
Bu kadar. Muhtemelen uygulamanın her detayından bahsetmedim ama örneğe bir göz atabilir veya yorum bırakabilirsiniz.
Örneği çalışan bir IDE'ye ekleyin: Dosya -> Yeni -> Örnek -> YAKINDU Durum Çizelgesi Örnekleri -> Sonraki -> Arduino - Dijital Saat (C++)
> IDE'yi buradan indirebilirsiniz <<
30 günlük deneme ile başlayabilirsiniz. Daha sonra, ticari olmayan kullanım için ücretsiz olan bir lisans almalısınız!
Önerilen:
DS1302 Kullanan Arduino Dijital Saat: 4 Adım
DS1302 Kullanan Arduino Dijital Saat: GirişMerhaba arkadaşlar, umarım hepiniz harikasınızdır. Arduino kullanarak dijital saat nasıl yapılır hakkında kısa ve basit bir proje olacak.Bu projede Arduino ve shift register yardımıyla dijital saat yapacağız. Bu
MSP430'da Sonlu Durum Makinesi: 6 Adım
Bir MSP430'da Sonlu Durum Makinesi: Size doğrudan Texas Instruments Code Composer Studio'da YAKINDU Statechart Tools kullanarak bir MSP430G2 Launchpad'i Sonlu Durum Makineleri (FSM) ile nasıl programlayacağınızı göstereceğim. Bu öğretici altı adım içerir: YAKINDU Statechart Tools'u aşağıdaki gibi yüklemek
Arduino ve Led Nokta Vuruşlu Ekran Kullanan Dijital Saat: 6 Adım
Arduino ve Led Dot Matrix Display Kullanan Dijital Saat: Günümüzde, Yapımcılar, Geliştiriciler, projelerin prototiplerinin hızlı bir şekilde geliştirilmesi için Arduino'yu tercih ediyor. Arduino, kullanımı kolay donanım ve yazılıma dayalı açık kaynaklı bir elektronik platformdur. Arduino'nun çok iyi bir kullanıcı topluluğu var. Bu projede
Arduino Üzerindeki Durum Makinesi - Yaya Trafik Işığı: 6 Adım (Resimli)
Arduino'da Durum Makinesi - Bir Yaya Trafik Işığı: Merhaba!Arduino için C++'da bir sonlu durum makinesi ile YAKINDU Statechart Araçlarını kullanarak bir yaya trafik ışığının nasıl programlanacağını göstereceğim. Bu, durum makinelerinin gücünü gösterecek ve daha fazlası için bir plan olarak kullanılabilir
Acil Durum Güç Bankası - DIY Araç Kutusu Solar: Radyo+ Şarj Cihazı+ Acil Durum için Işık!: 4 Adım
Acil Durum Güç Bankası - Kendin Yap Araç Kutusu Solar: Radyo+ Şarj Cihazı+ Acil Durum için Işık!: Ekle 28 Mart 2015: Alet kutumu acil durumlar için yaptım ve şimdi şehrim çamura gömüldüğü için kullanıyorum. Tecrübe olarak telefon şarj etmek ve radyo dinlemek için hizmet ettiğimi söyleyebilirim. Eski bir alet çantası mı? eski bir bilgisayar hoparlörü? kullanılmayan 12 voltluk bir pil mi? Yapabilirsiniz