Cuprins:
- Provizii
- Pasul 1: Cum funcționează ceasul digital
- Pasul 2: Mașina de stat
- Pasul 3: ecranul tastaturii LCD
- Pasul 4: interfațarea mașinii de stat
- Pasul 5: Cablarea lucrurilor împreună
- Pasul 6: Obțineți exemplul
Video: Ceas digital pe Arduino folosind o mașină cu stare finită: 6 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:43
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
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
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
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:
Cum să faci ceas analogic și ceas digital cu bandă LED folosind Arduino: 3 pași
Cum să faci ceas analogic și ceas digital cu bandă led folosind Arduino: Astăzi vom face un ceas analogic & Ceas digital cu Led Strip și modul MAX7219 Dot cu Arduino. Acesta va corecta ora cu fusul orar local. Ceasul analogic poate folosi o bandă cu LED mai lungă, deci poate fi agățat pe perete pentru a deveni un artist
Ceas digital Arduino folosind DS1302: 4 pași
Ceas digital Arduino folosind DS1302: Introducere Bună băieți, sper că vă veți descurca bine. Acesta va fi un proiect scurt și simplu despre cum să faci un ceas digital folosind Arduino. În acest proiect, vom realiza un ceas digital cu ajutorul Arduino și un registru de schimbare. Acest
Mașină de stare finită pe un MSP430: 6 pași
Mașină de stat finit pe un MSP430: Vă voi arăta cum să programați un Launchpad MSP430G2 cu mașini de stat finit (FSM) folosind YAKINDU Statechart Tools direct în Texas Instruments Code Composer Studio. Acest tutorial conține șase pași: Instalarea YAKINDU Statechart Tools ca
Ceas digital simplu folosind Arduino Nano și DS1307: 4 pași
Ceas digital simplu folosind Arduino Nano și DS1307: În acest articol vă voi arăta un tutorial pentru a crea un ceas digital folosind Arduino .. Placa Arduino pe care o folosesc este Arduino Nano V3, DS1307 ca furnizor de date de timp, MAX7219 7 Segment ca urmăriți afișajul.înainte de a intra în tutorial, vă recomand
Realizarea unui ceas cu M5stick C folosind Arduino IDE - Ceas RTC în timp real cu M5stack M5stick-C: 4 pași
Realizarea unui ceas cu M5stick C folosind Arduino IDE | Ceas RTC în timp real cu M5stack M5stick-C: Bună băieți, în acest instructables vom învăța cum să facem un ceas cu placa de dezvoltare m5stick-C a m5stack folosind Arduino IDE. Deci, m5stick va afișa data, ora și amp; săptămână a lunii pe ecran