Sadržaj:

Digitalni sat na Arduinu pomoću stroja s konačnim stanjem: 6 koraka
Digitalni sat na Arduinu pomoću stroja s konačnim stanjem: 6 koraka

Video: Digitalni sat na Arduinu pomoću stroja s konačnim stanjem: 6 koraka

Video: Digitalni sat na Arduinu pomoću stroja s konačnim stanjem: 6 koraka
Video: Arduino LCD sat - pregled projekta 2024, Studeni
Anonim
Digitalni sat na Arduinu pomoću stroja s konačnim stanjem
Digitalni sat na Arduinu pomoću stroja s konačnim stanjem

Pozdrav, pokazat ću vam kako se digitalni sat može stvoriti pomoću YAKINDU Statechart Tools i pokrenuti na Arduinu koji koristi štitnik LCD tipkovnice.

Izvorni model digitalnog sata preuzet je od Davida Harela. Objavio je rad o

"[…] Široko proširenje konvencionalnog formalizma državnih strojeva i dijagrama stanja."

U ovom se radu za svoje istraživanje poslužio primjerom digitalnog sata. Koristio sam ga kao inspiraciju i obnovio sat pomoću YAKINDU Statechart Tools (alat za stvaranje grafičkih modela državnih strojeva i generiranje C/C ++ koda s njim) i vratio ga u život na Arduinu.

Pribor

Hardver:

  • Arduino Uno ili Mega
  • Štit za LCD tipkovnicu

Softver:

  • YAKINDU Alati za grafikone stanja
  • Eclipse C ++ IDE za Arduino

Korak 1: Kako digitalni sat radi

Image
Image

Počnimo definiranjem načina na koji bi digitalni sat trebao funkcionirati. Sjećate li se ovih … recimo … "super cool" digitalnih satova koje su svi imali 90 -ih? Integrirana štoperica, različiti alarmi i dosadni zvučni signali svakih sat vremena. Ako niste, pogledajte: digitalni sat 90 -ih.

Dakle, u osnovi je to sat koji se može konfigurirati s različitim načinima rada. Uglavnom će se prikazivati trenutno vrijeme, ali postoje i neke druge značajke. Kao ulaz, imate uključeno/isključeno, način rada i gumb za postavljanje. Osim toga, možete uključiti i isključiti svjetlo. Gumbom za način rada možete razlikovati načine rada i aktivirati/onemogućiti značajke sata:

  • Prikaz vremena (sat)
  • Prikaz datuma (Datum)
  • Postavite alarm (Alarm 1, Alarm 2)
  • Omogući/onemogući zvono (Postavi zvono)
  • Koristite štopericu (štoperica)

Unutar izbornika možete koristiti gumb za uključivanje/isključivanje za konfiguriranje načina rada. Gumb za postavljanje omogućuje vam postavljanje vremena - npr. za sat ili alarme. Štopericom se može upravljati - pokrenuti i zaustaviti - pomoću gumba za uključivanje i isključivanje svjetla. Također možete koristiti integrirani brojač krugova

Nadalje, tu je zvono koje zvoni svakih sat vremena i integrirano pozadinsko osvjetljenje koje se može kontrolirati. U prvom koraku nisam ih povezao s Arduinom.

Korak 2: Državni stroj

Štitnik LCD tipkovnice
Štitnik LCD tipkovnice

Ne želim ići u detalje s objašnjenjem ovog primjera. Nije zato što je previše složeno, samo je malo preveliko. Pokušat ću objasniti osnovnu ideju kako to funkcionira. Izvođenje bi trebalo biti samorazumljivo, ako pogledate model ili ga preuzmete i simulirate. Neki dijelovi državnog stroja zbrajaju se u podregijama, poput zadanog vremenskog područja. Time bi se trebala osigurati čitljivost državnog stroja.

Model je podijeljen na dva dijela - grafički i tekstualni. U tekstualnom dijelu bit će definirani događaji, varijable itd. U grafičkom dijelu - dijagramu stanja - navedena je logička izvedba modela. Za stvaranje stroja stanja koji ispunjava navedeno ponašanje potrebni su neki ulazni događaji koji se mogu koristiti u modelu: onoff, set, mode, light i light_r. Unutar odjeljka definicije koristi se interni događaj koji svakih 100 ms povećava vrijednost vremena:

svakih 100 ms / vrijeme += 1

Na temelju koraka od 100 ms, trenutno vrijeme će se izračunati u HH: MM: SS formatu:

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

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

Vrijednosti će se spojiti na LCD zaslon pomoću operacije updateLCD svaki put kada se pozove državni stroj:

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

Osnovna izvedba državnog stroja već je definirana u odjeljku Kako digitalni sat radi. Unutar alata koristio sam neke "posebne" elemente modeliranja kao što su CompositeState, History, Pod-dijagrami, ExitNodes itd. Detaljan opis možete pronaći u Korisničkom priručniku.

Korak 3: Štitnik LCD tipkovnice

Štitnik LCD tipkovnice prilično je cool za jednostavne projekte, koji zahtijevaju zaslon za vizualizaciju i neke gumbe kao ulaz - tipičan, jednostavan HMI (sučelje čovjeka i stroja). Štitnik LCD tipkovnice sadrži pet korisničkih gumba i još jedan za resetiranje. Pet tipki zajedno spojeno je na A0 pin Arduina. Svaki od njih spojen je na razdjelnik napona, što omogućuje razlikovanje tipki.

Pomoću analogRead (0) možete pronaći određene vrijednosti, koje se, naravno, mogu razlikovati od proizvođača. Ovaj jednostavan projekt prikazuje trenutnu vrijednost na LCD -u:

#uključuje "Arduino.h"

#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("Mjerena vrijednost"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogno čitanje (0)); kašnjenje (200); }

Ovo su moji izmjereni rezultati:

  • Ništa: 1023
  • Odaberite: 640
  • Lijevo: 411
  • Dolje: 257
  • Gore: 100
  • Desno: 0

S ovim pragovima moguće je pročitati gumbe:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; rezultat = analogRead (0); if (rezultat <50) {return RIGHT; } if (rezultat <150) {return UP; } if (rezultat <300) {return DOLJE; } if (rezultat <550) {return LIJEVO; } if (rezultat <850) {return SELECT; } return NONE; }

Korak 4: Povezivanje državnog stroja

Povezivanje Državnog stroja
Povezivanje Državnog stroja

Generirani C ++ kod državnog stroja pruža sučelja koja se moraju implementirati za upravljanje državnim strojem. Prvi korak je povezivanje događaja u događaju s tipkama štitnika tipkovnice. Već sam pokazao kako čitati gumbe, ali za njihovo povezivanje s državnim strojem potrebno je odricanje gumba - u protivnom bi se događaji podigli više puta, što rezultira nepredvidivim ponašanjem. Koncept uklanjanja softvera nije nov. Možete pogledati Arduino dokumentaciju.

U svojoj implementaciji otkrivam pad (otpuštanje gumba). Pročitao sam vrijednost gumba, pričekao 80 ms (dobili bolje rezultate s 80 umjesto 50), spremio rezultat i pročitao novu vrijednost. Ako oldResult nije bio NONE (nije pritisnut), a novi rezultat je NONE, znam da je gumb ranije bio pritisnut i sada je otpušten. Zatim podižem odgovarajući ulazni događaj stanja stroja.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); kašnjenje (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); pauza; } slučaj LIJEVO: {stateMachine-> getSCI_Button ()-> raise_set (); pauza; } slučaj DOLJE: {stateMachine-> getSCI_Button ()-> raise_light (); pauza; } slučaj UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); pauza; } slučaj DESNO: {stateMachine-> getSCI_Button ()-> raise_onoff (); pauza; } zadano: {break; }}}}

Korak 5: Ožičite stvari zajedno

Glavni program koristi tri dijela:

  • Državni stroj
  • Tajmer
  • Rukovatelj zaslona (tipičan lcd.tisak (…))

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

Državni stroj koristi rukovatelj zaslona i dobio je mjerač vremena, koji će se ažurirati radi kontrole vremenskih događaja. Nakon toga se stroj za stanje inicijalizira i unosi.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Petlja čini tri stvari:

  • Povisite ulazne događaje
  • Izračunajte proteklo vrijeme i ažurirajte mjerač vremena
  • Nazovite državni stroj

long current_time = 0; long last_cycle_time = 0; long last_cycle_time = 0; void loop () {raiseEvents (); last_cycle_time = current_time; current_time = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Korak 6: Uzmite primjer

To je to. Vjerojatno nisam spomenuo svaki detalj implementacije, ali možete pogledati primjer ili ostaviti komentar.

Dodajte primjer aktivnom IDE -u pomoću: Datoteka -> Novo -> Primjer -> Primjeri grafikona stanja YAKINDU -> Dalje -> Arduino -Digitalni sat (C ++)

> IDE možete preuzeti ovdje <<

Možete započeti s probnim periodom od 30 dana. Nakon toga morate dobiti licencu koja je besplatna za nekomercijalnu uporabu!

Preporučeni: