İçindekiler:

Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat: 6 Adım
Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat: 6 Adım

Video: Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat: 6 Adım

Video: Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat: 6 Adım
Video: SINIFLARA GÖRE AKILLI BİLEKLİKLER 2024, Kasım
Anonim
Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat
Sonlu Durum Makinesi Kullanan Arduino Üzerindeki Dijital Saat

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?

Image
Image

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

LCD Tuş Takımı Kalkanı
LCD Tuş Takımı Kalkanı

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 Arayüz Oluşturulması
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: