Cuprins:

Ceas digital pe Arduino folosind o mașină cu stare finită: 6 pași
Ceas digital pe Arduino folosind o mașină cu stare finită: 6 pași

Video: Ceas digital pe Arduino folosind o mașină cu stare finită: 6 pași

Video: Ceas digital pe Arduino folosind o mașină cu stare finită: 6 pași
Video: Redresor auto din LIDL Ultimate Speed - inteligent [TEST] 2024, Noiembrie
Anonim
Ceas digital pe Arduino folosind o mașină cu stare finită
Ceas digital pe Arduino folosind o mașină cu stare finită

Bună, vă voi arăta cum poate fi creat un ceas digital cu YAKINDU Statechart Tools și să ruleze pe un Arduino, care utilizează un ecran de tastatură LCD.

Modelul original al ceasului digital a fost preluat de la David Harel. A publicat o lucrare despre

„[…] Extindere largă a formalismului convențional al mașinilor de stare și diagramelor de stare.”

În această lucrare, el a folosit exemplul ceasului digital pentru cercetarea sa. L-am folosit ca inspirație și am reconstruit ceasul cu YAKINDU Statechart Tools (un instrument pentru crearea de modele grafice de mașini de stat și generarea codului C / C ++ cu acesta) și l-am readus la viață pe un Arduino.

Provizii

Hardware:

  • Arduino Uno sau Mega
  • Ecranul tastaturii LCD

Software:

  • Instrumente YAKINDU Statechart
  • Eclipse C ++ IDE pentru Arduino

Pasul 1: Cum funcționează ceasul digital

Image
Image

Să începem prin a defini modul în care ar trebui să funcționeze ceasul digital. Îți amintești aceste … să spunem … ceasuri digitale "ultra cool" pe care le-a avut toată lumea în anii '90? Un cronometru integrat, alarme diferite și un bip enervant la fiecare oră întreagă. Dacă nu, aruncă o privire: ceasul digital din anii 90.

Deci, practic este un ceas configurabil cu moduri diferite. În principal, va fi afișată ora curentă, dar există și alte caracteristici. Ca intrare, aveți o pornire / oprire, un mod și un buton de setare. În plus, puteți aprinde și opri lumina. Cu butonul de mod puteți distinge între moduri și puteți activa / dezactiva caracteristicile ceasului:

  • Afișați ora (Ceas)
  • Afișează data (Data)
  • Setați alarma (Alarma 1, Alarma 2)
  • Activați / dezactivați soneria (Set Chime)
  • Folosiți cronometrul (Cronometru)

În cadrul meniurilor, puteți utiliza butonul de pornire / oprire pentru a configura modul. Butonul de setare vă permite să setați ora - de ex. pentru ceas sau alarme. Cronometrul poate fi controlat - pornit și oprit - utilizând butonul de aprindere și oprire. De asemenea, puteți utiliza un contor de ture integrat

În plus, există un clopot, care sună la fiecare oră întreagă, și o lumină de fundal controlabilă integrată. La primul pas, nu i-am conectat la Arduino.

Pasul 2: Mașina de stat

Ecranul tastaturii LCD
Ecranul tastaturii LCD

Nu vreau să merg prea mult în detaliu pentru explicația acestui exemplu. Nu pentru că este prea complex, ci doar puțin prea mare. Voi încerca să explic ideea de bază despre cum funcționează. Execuția ar trebui să se explice de la sine, aruncând o privire asupra modelului sau descărcându-l și simulându-l. Unele părți ale mașinii de stat sunt rezumate în subregiuni, cum ar fi regiunea de timp setată. Cu aceasta, ar trebui asigurată lizibilitatea mașinii de stat.

Modelul este împărțit în două părți - una grafică și una textuală. În partea textuală vor fi definite evenimentele, variabilele etc. În partea grafică - diagrama de stare - este specificată execuția logică a modelului. Pentru a crea o mașină de stare, care îndeplinește comportamentul specificat, sunt necesare câteva evenimente de intrare, care pot fi utilizate în model: onoff, set, mode, light și light_r. În secțiunea de definiție este utilizat un eveniment intern, care crește valoarea timpului la fiecare 100 ms:

la fiecare 100 ms / timp + = 1

Pe baza pașilor de 100 ms, timpul curent va fi calculat în formatul HH: MM: SS:

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

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

Valorile vor fi conectate la afișajul LCD utilizând operația de actualizare LCD de fiecare dată când aparatul de stat va fi apelat:

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

Execuția de bază a mașinii de stat este deja definită în secțiunea Cum funcționează ceasul digital. În cadrul instrumentului am folosit câteva elemente de modelare „speciale” precum CompositeState, History, Sub-Diagrams, ExitNodes, etc. O descriere detaliată poate fi găsită în Ghidul utilizatorului.

Pasul 3: ecranul tastaturii LCD

Ecranul tastaturii LCD este destul de cool pentru proiecte simple, care necesită un ecran pentru vizualizare și câteva butoane ca intrare - un HMI (Human Machine Interface) tipic și simplu. Ecranul tastaturii LCD conține cinci butoane de utilizator și altul pentru resetare. Cele cinci butoane împreună sunt conectate la pinul A0 al Arduino. Fiecare dintre ele este conectat la un divizor de tensiune, care permite distincția între butoane.

Puteți utiliza analogRead (0) pentru a găsi valorile specifice, care, desigur, pot diferi de producător. Acest proiect simplu afișează valoarea curentă pe ecranul LCD:

#include „Arduino.h”

#includeți „LiquidCrystal.h” LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write („Valoare măsurată”); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); întârziere (200); }

Acestea sunt rezultatele mele măsurate:

  • Niciuna: 1023
  • Selectați: 640
  • Stânga: 411
  • Jos: 257
  • Sus: 100
  • Dreapta: 0

Cu aceste praguri este posibil să citiți butoanele:

#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) {returnează DREAPTA; } if (rezultat <150) {return UP; } if (rezultat <300) {returnează JOS; } if (rezultat <550) {return STÂNGA; } if (rezultat <850) {return SELECT; } returnează NICIUL; }

Pasul 4: interfațarea mașinii de stat

Interfața mașinii de stat
Interfața mașinii de stat

Codul C ++ generat al mașinii de stat oferă interfețe, care trebuie implementate pentru a controla mașina de stare. Primul pas este conectarea evenimentelor cu tastele ecranului tastaturii. Am arătat deja cum să citesc butoanele, dar pentru interfațarea acestora cu mașina de stare, este necesară dezorientarea butoanelor - în caz contrar, evenimentele ar fi ridicate de mai multe ori, ceea ce duce la un comportament imprevizibil. Conceptul de debouncing software nu este nou. Puteți arunca o privire la documentația Arduino.

În implementarea mea, detectez o margine de cădere (eliberând butonul). Am citit valoarea butonului, aștept 80 ms (am obținut rezultate mai bune cu 80 în loc de 50), salvez rezultatul și am citit noua valoare. Dacă vechiul Rezultat nu a fost NICIUL (neaprins) și noul rezultat este NICIUL, știu, că butonul a fost apăsat înainte și acum a fost eliberat. Apoi, ridic evenimentul de intrare corespunzător al mașinii de stare.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); întârziere (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button () -> raise_mode (); pauză; } caz STÂNGA: {stateMachine-> getSCI_Button () -> raise_set (); pauză; } caz DOWN: {stateMachine-> getSCI_Button () -> raise_light (); pauză; } caz UP: {stateMachine-> getSCI_Button () -> raise_light_r (); pauză; } caz DREAPTA: {stateMachine-> getSCI_Button () -> raise_onoff (); pauză; } implicit: {pauză; }}}}

Pasul 5: Cablarea lucrurilor împreună

Programul principal folosește trei părți:

  • Mașina de stat
  • Un cronometru
  • Un dispozitiv de gestionare a afișajului (tipic lcd.print (…))

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

Mașina de stat folosește un dispozitiv de gestionare a afișajului și a primit un temporizator, care va fi actualizat pentru a controla evenimentele temporizate. Ulterior, mașina de stat este inițializată și introdusă.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Bucla face trei lucruri:

  • Creșteți evenimentele de intrare
  • Calculați timpul scurs și actualizați temporizatorul
  • Apelați mașina de stat

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

Pasul 6: Obțineți exemplul

Asta e. Probabil că nu am menționat fiecare detaliu al implementării, dar puteți arunca o privire la exemplu sau puteți lăsa un comentariu.

Adăugați exemplul la un IDE care rulează cu: Fișier -> Nou -> Exemplu -> Exemple de diagramă de stat YAKINDU -> Următor -> Arduino - Ceas digital (C ++)

> Puteți descărca IDE aici <<

Puteți începe cu o perioadă de încercare de 30 de zile. Ulterior, trebuie să obțineți o licență, care este gratuită pentru utilizare necomercială!

Recomandat: