Sisukord:

Digitaalkell Arduino'l piiratud olekuga masina abil: 6 sammu
Digitaalkell Arduino'l piiratud olekuga masina abil: 6 sammu

Video: Digitaalkell Arduino'l piiratud olekuga masina abil: 6 sammu

Video: Digitaalkell Arduino'l piiratud olekuga masina abil: 6 sammu
Video: Простые цифровые часы с использованием Arduino, код часов Arduino, часть 1 2024, November
Anonim
Digitaalkell Arduino'l, kasutades piiratud olekuga masinat
Digitaalkell Arduino'l, kasutades piiratud olekuga masinat

Tere, ma näitan teile, kuidas saab YAKINDU Statechart Tools abil luua digitaalse kella ja töötada Arduinoga, mis kasutab LCD -klaviatuuri.

Digikella algne mudel on võetud David Harelilt. Ta on avaldanud artikli selle kohta

"[…] Riigimasinate ja olekudiagrammide tavapärase formalismi lai laiendamine."

Selles artiklis kasutas ta oma uurimistööks digikella näidet. Kasutasin seda inspiratsioonina ja ehitasin kella YAKINDU Statechart Tools abil (tööriist olekumasinate graafiliste mudelite loomiseks ja sellega C/C ++ koodi genereerimiseks) ümber ja tõstsin selle Arduinole uuesti ellu.

Tarvikud

Riistvara:

  • Arduino Uno või Mega
  • LCD klahvistiku kilp

Tarkvara:

  • YAKINDU olekukaardi tööriistad
  • Eclipse C ++ IDE Arduino jaoks

Samm: kuidas digitaalkell töötab

Image
Image

Alustuseks määratleme, kuidas digitaalne kell peaks töötama. Kas mäletate neid… ütleme… „ülilahedaid” digitaalseid kellasid, mis kõigil olid 90ndatel? Integreeritud stopper, erinevad alarmid ja selle tüütu piiks igal täistunnil. Kui ei, siis vaadake: 90ndate digitaalne kell.

Nii et põhimõtteliselt on see erinevate režiimidega seadistatav kell. Peamiselt kuvatakse praegune kellaaeg, kuid on ka muid funktsioone. Sisendina on teil sisse/välja lülitatud, režiim ja seadistusnupp. Lisaks saate valgust sisse ja välja lülitada. Režiimi nupuga saate režiime eristada ja kellafunktsioone aktiveerida/keelata:

  • Kella kuvamine (kell)
  • Kuva kuupäev (kuupäev)
  • Äratuse seadistamine (Alarm 1, Alarm 2)
  • Kellamängu lubamine/keelamine (helina määramine)
  • Stopperi kasutamine (Stopper)

Menüüdes saate režiimi konfigureerimiseks kasutada sisse/välja nuppu. Seadistusnupp võimaldab määrata kellaaega - nt. kella või äratuste jaoks. Stopperit saab juhtida - käivitada ja peatada - kasutades valguse sisselülitamise ja väljalülitamise nuppu. Võite kasutada ka integreeritud ringiloendurit

Lisaks on olemas helisignaal, mis heliseb igal täistunnil, ja integreeritud juhitav taustvalgus. Esimesel sammul ei ühendanud ma neid Arduinoga.

2. samm: olekumasin

LCD klahvistiku kilp
LCD klahvistiku kilp

Ma ei taha selle näite selgitamiseks väga üksikasjalikult rääkida. See pole sellepärast, et see oleks liiga keeruline, vaid lihtsalt natuke liiga suur. Püüan selgitada selle toimimise põhiideed. Teostus peaks olema iseenesestmõistetav, vaadates mudelit või laadides selle alla ja simuleerides. Mõned olekumasina osad on koondatud alampiirkondadesse, näiteks määratud ajapiirkond. Sellega tuleks tagada olekumasina loetavus.

Mudel on jagatud kaheks osaks - graafiline ja tekstiline. Tekstiosas määratletakse sündmused, muutujad jne. Graafilises osas - olekudiagrammis - on täpsustatud mudeli loogiline täitmine. Määratud käitumist täitva olekumasina loomiseks on vaja mõningaid sisendsündmusi, mida saab mudelis kasutada: onoff, set, mode, light ja light_r. Definitsioonide jaotises kasutatakse sisemist sündmust, mis suurendab ajaväärtust iga 100 ms järel:

iga 100 ms / kord += 1

100 ms sammu põhjal arvutatakse praegune aeg vormingus HH: MM: SS:

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

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

Väärtused ühendatakse LCD -ekraanile operatsiooni updateLCD abil iga kord, kui olekumasinale helistatakse:

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

Olekumasina põhiline täitmine on juba määratletud jaotises Kuidas digitaalkell töötab. Tööriista sees olen kasutanud mõningaid "spetsiaalseid" modelleerivaid elemente, nagu CompositeState, ajalugu, alamdiagrammid, ExitNodes jne. Üksikasjaliku kirjelduse leiate kasutusjuhendist.

Samm: LCD -klahvistiku kilp

LCD -klahvistiku kilp on üsna lahe lihtsate projektide jaoks, mille visualiseerimiseks on vaja ekraani ja sisendiks mõningaid nuppe - tüüpiline lihtne HMI (Human Machine Interface). LCD -klahvistiku kilp sisaldab viit kasutaja nuppu ja veel ühte lähtestamiseks. Kõik viis nuppu on ühendatud Arduino A0 tihvtiga. Igaüks neist on ühendatud pingejagajaga, mis võimaldab nuppe eristada.

Konkreetsete väärtuste leidmiseks võite kasutada analogRead (0), mis võib tootjal muidugi erineda. See lihtne projekt kuvab LCD -ekraanil praeguse väärtuse:

#sisaldab "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 ("Mõõdetud väärtus"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); viivitus (200); }

Need on minu mõõdetud tulemused:

  • Puudub: 1023
  • Valige: 640
  • Vasakul: 411
  • Alla: 257
  • Üles: 100
  • Õige: 0

Nende künnistega on võimalik nuppe lugeda:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 staatiline int readButton () {int tulemus = 0; tulemus = analogRead (0); if (tulemus <50) {return RIGHT; } if (tulemus <150) {return UP; } if (tulemus <300) {return DOWN; } if (tulemus <550) {return LEFT; } if (tulemus <850) {return SELECT; } tagastama MITTE; }

4. samm: olekumasina liidestamine

Riigimasina liidestamine
Riigimasina liidestamine

Olekumasina loodud C ++ kood pakub liideseid, mis tuleb olekumasina juhtimiseks rakendada. Esimene samm on sündmuste ühendamine klahvistiku kilbi klahvidega. Olen juba näidanud, kuidas nuppe lugeda, kuid nende olekumasinaga ühendamiseks on vaja nuppe tühistada - vastasel juhul tõstetakse sündmusi mitu korda, mille tulemuseks on ettearvamatu käitumine. Tarkvara tühistamise mõiste pole uus. Saate vaadata Arduino dokumentatsiooni.

Oma rakenduses tuvastan langeva serva (vabastades nupu). Lugesin nupu väärtust, ootan 80 ms (sain paremaid tulemusi 50 asemel 80 -ga), salvestan tulemuse ja loen uue väärtuse. Kui oldResult ei olnud MITTE (vajutamata) ja uus tulemus on MITTE, siis tean, et nuppu on varem vajutatud ja nüüd on see vabastatud. Seejärel tõstan olekumasina sisendsündmuse.

int oldState = NONE; staatiline void raiseEvents () {int nupp Vajutatud = readButton (); viivitus (80); oldState = nupp Vajutatud; if (oldState! = NOONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); murda; } juhtum LEFT: {stateMachine-> getSCI_Button ()-> raise_set (); murda; } juhtum ALLA: {stateMachine-> getSCI_Button ()-> raise_light (); murda; } juhtum ÜLES: {stateMachine-> getSCI_Button ()-> raise_light_r (); murda; } juhtum PAREM: {stateMachine-> getSCI_Button ()-> raise_onoff (); murda; } vaikimisi: {break; }}}}

Samm: ühendage asjad kokku

Põhiprogramm koosneb kolmest osast:

  • Osariigi masin
  • Taimer
  • A Display Handler (tüüpiline lcd.print (…))

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

Olekumasin kasutab kuvaritöötlejat ja sai taimeri, mida ajakohastatud sündmuste juhtimiseks uuendatakse. Seejärel vormindatakse olekumasin ja sisestatakse see.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Tsükkel teeb kolme asja:

  • Tõstke sisendüritusi
  • Arvutage kulunud aeg ja värskendage taimerit
  • Helistage riigimasinale

pikk praegune_aeg = 0; pikk viimane_tsükli_aeg = 0; void loop () {raiseEvents (); viimane_tsükli_aeg = praegune_aeg; praegune_aeg = millis (); timer_sct-> updateActiveTimer (olekumasin, praegune_aeg - viimane_tsükli aeg); stateMachine-> runCycle (); }

6. samm: hankige näide

See on kõik. Tõenäoliselt ei ole ma maininud kõiki rakenduse üksikasju, kuid võite näite vaadata või kommentaari jätta.

Lisage näide töötavale IDE -le, kasutades järgmist: Fail -> Uus -> Näide -> YAKINDU olekukaardi näited -> Järgmine -> Arduino -Digitaalkell (C ++)

> IDE saate alla laadida siit <<

Võite alustada 30 -päevase prooviperioodiga. Hiljem peate hankima litsentsi, mis on mitteäriliseks kasutamiseks tasuta!

Soovitan: