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, Novembar
Anonim
Digitalni sat na Arduinu pomoću stroja konačnih stanja
Digitalni sat na Arduinu pomoću stroja konačnih stanja

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

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

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

U ovom radu je za svoje istraživanje koristio primjer digitalnog sata. Koristio sam ga kao inspiraciju i obnovio sat pomoću YAKINDU Statechart Tools (alat za kreiranje grafičkih modela državnih mašina i generisanje C/C ++ koda s njim) i vratio ga u život na Arduinu.

Supplies

Hardver:

  • Arduino Uno ili Mega
  • Štitnik LCD tastature

Softver:

  • YAKINDU Alati dijagrama 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 na 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 dugme za uključivanje/isključivanje, način rada i dugme za postavljanje. Osim toga, možete uključiti i isključiti svjetlo. Pomoću gumba za način rada možete razlikovati načine rada i aktivirati/onemogućiti funkcije 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 tipku za uključivanje/isključivanje za konfiguriranje načina rada. Dugme za postavljanje vam omogućava da postavite vrijeme - npr. za sat ili alarme. Štopericom se može upravljati - startovati i zaustavljati - pomoću dugmeta za uključivanje i isključivanje svetla. Možete koristiti i integrirani brojač krugova

Nadalje, tu je i 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žavna mašina

Štitnik LCD tastature
Štitnik LCD tastature

Ne želim ići previše u detalje za objašnjenje ovog primjera. Nije zato što je previše kompleksno, 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žavne mašine sumirani su u podregijama, poput zadanog vremenskog regiona. 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 - navedeno je logičko izvođenje modela. Da biste stvorili stroj 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 osnovu 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)

Osnovno izvođenje državne mašine već je definirano u odjeljku Kako digitalni sat radi. Unutar alata koristio sam neke "posebne" modele kao što su CompositeState, History, Sub-Diagrams, ExitNodes, itd. Detaljan opis možete pronaći u Korisničkom vodiču.

Korak 3: Štitnik LCD tastature

Štit LCD tastature je prilično cool za jednostavne projekte, koji zahtijevaju ekran za vizualizaciju i neke tipke kao ulaz - tipičan, jednostavan HMI (Human Machine Interface). Štitnik LCD tipkovnice sadrži pet korisničkih gumba i još jedno za resetiranje. Pet tipki zajedno spojeno je na A0 pin Arduina. Svaki od njih spojen je na razdjelnik napona, što omogućava razlikovanje tipki.

Možete koristiti analogRead (0) za pronalaženje određenih vrijednosti, koje se, naravno, mogu razlikovati od proizvođača. Ovaj jednostavan projekt prikazuje trenutnu vrijednost na LCD -u:

#include "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 (analogRead (0)); kašnjenje (200); }

Ovo su moji izmjereni rezultati:

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

S ovim pragovima moguće je čitati dugmad:

#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 DOWN; } if (rezultat <550) {return LEFT; } if (rezultat <850) {return SELECT; } return NONE; }

Korak 4: Povezivanje državne mašine

Povezivanje sa državnom mašinom
Povezivanje sa državnom mašinom

Generirani C ++ kod državne mašine pruža sučelja koja se moraju implementirati za kontrolu državne mašine. Prvi korak je povezivanje ulaznih događaja pomoću tipki štitnika tipkovnice. Već sam pokazao kako čitati dugmad, ali za njihovo povezivanje sa državnom mašinom potrebno je otkazivanje dugmadi - u suprotnom bi se događaji podigli više puta, što rezultira nepredvidivim ponašanjem. Koncept uklanjanja softvera nije nov. Možete pogledati Arduino dokumentaciju.

U mojoj implementaciji otkrivam pad (otpuštanje dugmeta). Pročitao sam vrijednost gumba, pričekao 80 ms (dobili bolje rezultate sa 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 dugme ranije pritisnuto i sada je otpušteno. Zatim podižem odgovarajući ulazni događaj državne mašine.

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 (); break; } slučaj LIJEVO: {stateMachine-> getSCI_Button ()-> raise_set (); break; } slučaj DOLJE: {stateMachine-> getSCI_Button ()-> raise_light (); break; } slučaj gore: {stateMachine-> getSCI_Button ()-> raise_light_r (); break; } slučaj DESNO: {stateMachine-> getSCI_Button ()-> raise_onoff (); break; } default: {break; }}}}

Korak 5: Povežite stvari zajedno

Glavni program koristi tri dijela:

  • Državna mašina
  • Tajmer
  • Rukovatelj ekrana (tipičan lcd.print (…))

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

Državni stroj koristi rukovatelj ekrana i ima mjerač vremena, koji će biti ažuriran za kontrolu vremenskih događaja. Nakon toga, mašina za stanje se inicijalizira i unosi.

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

  • Podizanje ulaznih događaja
  • Izračunajte proteklo vrijeme i ažurirajte mjerač vremena
  • Pozovite državnu mašinu

long current_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 tekućem IDE -u sa: 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 upotrebu!

Preporučuje se: