Mündəricat:

Sonlu vəziyyət maşını istifadə edərək Arduino -da rəqəmsal saat: 6 addım
Sonlu vəziyyət maşını istifadə edərək Arduino -da rəqəmsal saat: 6 addım

Video: Sonlu vəziyyət maşını istifadə edərək Arduino -da rəqəmsal saat: 6 addım

Video: Sonlu vəziyyət maşını istifadə edərək Arduino -da rəqəmsal saat: 6 addım
Video: “Rent a car”dan götürdüyü maşını heroin çəkərək istifadə etdi 2024, Noyabr
Anonim
Sonlu vəziyyət maşını istifadə edərək Arduino -da rəqəmsal saat
Sonlu vəziyyət maşını istifadə edərək Arduino -da rəqəmsal saat

Salam, sizə YAKINDU Statechart Tools ilə rəqəmsal bir saatın necə yaradılacağını və LCD Keypad Shield istifadə edən bir Arduino ilə işləyəcəyini göstərəcəyəm.

Rəqəmsal saatın orijinal modeli David Hareldən götürülmüşdür. Haqqında bir məqalə nəşr etdi

"[…] Dövlət maşınlarının və vəziyyət diaqramlarının ənənəvi formalizminin geniş yayılması."

Bu yazıda araşdırması üçün rəqəmsal saat nümunəsindən istifadə etdi. Bir ilham olaraq istifadə etdim və saatı YAKINDU Statechart Tools (dövlət maşınlarının qrafik modellərini yaratmaq və onunla C/C ++ kodu yaratmaq üçün bir vasitə) ilə yenidən qurdum və Arduino -da həyata qaytardım.

Təchizat

Avadanlıq:

  • Arduino Uno və ya Mega
  • LCD Klaviatura Qalxanı

Proqram təminatı:

  • YAKINDU Statechart Alətləri
  • Arduino üçün Eclipse C ++ IDE

Addım 1: Rəqəmsal Saat necə işləyir

Image
Image

Rəqəmsal saatın necə işləməli olduğunu təyin edərək başlayaq. Bunları xatırlayırsınızmı… deyək ki … hər kəsin 90 -cı illərdə "ultra sərin" rəqəmsal saatları? İnteqrasiya edilmiş bir saniyəölçən, fərqli həyəcan siqnalları və hər saatda sinir bozucu siqnalı. Əgər yoxsa, bir baxın: 90 -cı illərin rəqəmsal saatı.

Beləliklə, əsasən fərqli rejimi olan konfiqurasiya edilə bilən bir saatdır. Əsasən, cari vaxt göstəriləcək, lakin digər xüsusiyyətlər var. Giriş olaraq, bir açma/söndürmə, bir rejim və bir düymə var. Əlavə olaraq işığı yandırıb söndürə bilərsiniz. Rejim düyməsi ilə rejimi ayırd edə və saat xüsusiyyətlərini aktivləşdirə/söndürə bilərsiniz:

  • Saatı göstərin (Saat)
  • Tarixi göstərin (Tarix)
  • Siqnal qurun (Siqnal 1, Siqnal 2)
  • Zəngi aktiv edin/deaktiv edin (Zəng Qur)
  • Saniyəölçəndən istifadə edin (Stop Watch)

Menyularda rejimi konfiqurasiya etmək üçün açma/söndürmə düyməsindən istifadə edə bilərsiniz. Ayar düyməsi vaxtı təyin etməyə imkan verir - məs. saat və ya həyəcan siqnalları üçün. İşıq yandırmaq və söndürmək düyməsindən istifadə edərək saniyəölçən idarə oluna bilər - işə salına və dayandırıla bilər. İnteqrasiya edilmiş bir sayğacdan da istifadə edə bilərsiniz

Bundan əlavə, hər tam saatda zəng vuran və idarə edilə bilən arxa işığın inteqrasiyası var. İlk addımda onları Arduinoya bağlamadım.

Addım 2: Dövlət Maşını

LCD Klaviatura Qalxanı
LCD Klaviatura Qalxanı

Bu nümunənin izahı üçün çox detallı getmək istəmirəm. Çox mürəkkəb olduğu üçün deyil, bir az çox böyükdür. Bunun necə işlədiyinə dair əsas fikri izah etməyə çalışacağam. Modelə baxmaq və ya yükləmək və simulyasiya etməklə icra özünü izah etməlidir. Dövlət maşınının bəzi hissələri müəyyən vaxt bölgəsi kimi alt bölgələrdə toplanır. Bununla dövlət maşınının oxunması təmin edilməlidir.

Model iki hissəyə bölünür - qrafik və mətn. Mətn hissəsində hadisələr, dəyişənlər və s. Qrafik hissədə - vəziyyət diaqramı - modelin məntiqi icrası göstərilmişdir. Göstərilən davranışı yerinə yetirən bir dövlət maşını yaratmaq üçün modeldə istifadə edilə bilən bəzi giriş hadisələri tələb olunur: açma, qurma, rejim, işıq və işıq_r. Tərif bölməsində, hər 100 ms -də vaxt dəyərini artıran bir daxili hadisə istifadə olunur:

hər 100 ms / dəfə += 1

100 ms addımlara əsaslanaraq cari vaxt HH: MM: SS formatında hesablanacaq:

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

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

Dəyərlər, hər dəfə dövlət maşını çağırıldıqda, updateLCD əməliyyatını istifadə edərək LCD ekrana bağlanacaq:

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

Dövlət maşınının əsas icrası artıq Rəqəmsal Saatın Necə Çalışdığı bölməsində müəyyən edilmişdir. Alətin içərisində CompositeState, History, Sub-Diagrams, ExitNodes və s. Kimi "xüsusi" modelləşdirmə elementlərindən istifadə etdim. Ətraflı təsviri İstifadəçi Bələdçisində tapa bilərsiniz.

Addım 3: LCD Klaviatura Qalxanı

LCD Keypad Shield, vizual olaraq bir ekran və giriş olaraq bəzi düymələr tələb edən sadə layihələr üçün olduqca sərindir - tipik, sadə bir HMI (İnsan Maşın İnterfeysi). LCD Keypad Shield beş istifadəçi düyməsini və sıfırlama üçün başqa bir düyməni ehtiva edir. Beş düymə birlikdə Arduino A0 pininə bağlıdır. Hər biri düymələri fərqləndirməyə imkan verən bir gərginlik bölücüsünə bağlıdır.

Əlbəttə ki, istehsalçı tərəfindən fərqli ola biləcək xüsusi dəyərləri tapmaq üçün analogRead (0) istifadə edə bilərsiniz. Bu sadə layihə LCD -də cari dəyəri göstərir:

#"Arduino.h" daxil edin

#"LiquidCrystal.h" daxil edin LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("Ölçülmüş dəyər"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); gecikmə (200); }

Ölçdüyüm nəticələr bunlardır:

  • Yox: 1023
  • Seçin: 640
  • Sol: 411
  • Aşağı: 257
  • Yuxarı: 100
  • Sağda: 0

Bu eşiklərlə düymələri oxumaq mümkündür:

#define NONE 0 #define SEÇ 1 nəticə = analogRead (0); əgər (nəticə <50) {sağa dön; } if (nəticə <150) {UP qaytar; } if (nəticə <300) {geri AŞAĞI; } if (nəticə <550) {LEFT qaytar; } if (nəticə <850) {SELECT qaytar; } NONE qaytar; }

Addım 4: Dövlət Maşını ilə əlaqə qurun

Dövlət Maşını ilə əlaqə qurmaq
Dövlət Maşını ilə əlaqə qurmaq

Vəziyyət maşınının yaradılan C ++ kodu, dövlət maşınını idarə etmək üçün tətbiq olunmalı olan interfeyslər təmin edir. İlk addım, hadisələri Keypad Shield düymələri ilə bağlamaqdır. Düymələrin necə oxunacağını artıq göstərmişəm, ancaq onları dövlət maşını ilə əlaqələndirmək üçün düymələrin açılması tələb olunur - əks halda hadisələr dəfələrlə qaldırılaraq gözlənilməz davranışla nəticələnər. Proqram təminatçılığının ləğvi anlayışı yeni deyil. Arduino sənədlərinə baxa bilərsiniz.

Həyata keçirərkən, düşən bir kənar aşkar edirəm (düyməni buraxaraq). Düymənin dəyərini oxudum, 80 ms gözləyin (50 əvəzinə 80 ilə daha yaxşı nəticələr əldə etdim), nəticəni qeyd edin və yeni dəyəri oxuyun. OldResult NONE (sıxılmamış) olmasaydı və yeni nəticə NONE olarsa, bilirəm ki, düymə əvvəllər basıldı və indi buraxıldı. Sonra, dövlət maşınının giriş hadisəsini qaldırıram.

int oldState = NONE; statik void liftEvents () {int buttonPressed = readButton (); gecikmə (80); oldState = düyməsinə basıldı; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> lift_mode (); fasilə; } SOL QALDI: {stateMachine-> getSCI_Button ()-> lift_set (); fasilə; } hal AŞAĞI: {stateMachine-> getSCI_Button ()-> lift_light (); fasilə; } YUKARI: {stateMachine-> getSCI_Button ()-> lift_light_r (); fasilə; } hal HAQQI: {stateMachine-> getSCI_Button ()-> lift_onoff (); fasilə; } default: {break; }}}}

Addım 5: Şeyi Birlikdə Kablolama

Əsas proqram üç hissədən ibarətdir:

  • Dövlət Maşını
  • Taymer
  • Ekran İşləyicisi (tipik lcd.print (…))

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

Dövlət maşını bir ekran işləyicisindən istifadə edir və vaxtlı hadisələri idarə etmək üçün yenilənəcək bir taymer aldı. Daha sonra dövlət maşını işə salınır və daxil olur.

boş quraşdırma () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> daxil edin (); }Döngü üç şeyi edir:

  • Giriş hadisələrini artırın
  • Keçən vaxtı hesablayın və taymeri yeniləyin
  • Dövlət maşınına zəng edin

uzun cari_vaxt = 0; uzun son_sikl_müddəti = 0; void loop () {boostEvents (); last_cycle_time = cari_ zaman; cari_vaxt = milis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Addım 6: Nümunə alın

Bu belədir. Yəqin ki, tətbiqin hər bir detalından bəhs etməmişəm, amma nümunəyə baxa və ya şərh yaza bilərsiniz.

Nümunəni işləyən bir IDE -yə əlavə edin: Fayl -> Yeni -> Nümunə -> YAKINDU Statechart Nümunələri -> Sonrakı -> Arduino -Rəqəmsal Saat (C ++)

> IDE -ni buradan yükləyə bilərsiniz <<

30 günlük sınaq ilə başlaya bilərsiniz. Daha sonra, qeyri-kommersiya məqsədləri üçün pulsuz olan bir lisenziya almalısınız!

Tövsiyə: