Sisällysluettelo:

Digitaalinen kello Arduinolla äärellisen tilan koneen avulla: 6 vaihetta
Digitaalinen kello Arduinolla äärellisen tilan koneen avulla: 6 vaihetta

Video: Digitaalinen kello Arduinolla äärellisen tilan koneen avulla: 6 vaihetta

Video: Digitaalinen kello Arduinolla äärellisen tilan koneen avulla: 6 vaihetta
Video: Scott Aaronson: The Greatest Unsolved Problem in Math 2024, Marraskuu
Anonim
Digitaalinen kello Arduinolla äärellisen tilan koneella
Digitaalinen kello Arduinolla äärellisen tilan koneella

Hei, näytän sinulle, kuinka digitaalinen kello voidaan luoda YAKINDU Statechart Tools -työkalulla ja käyttää Arduinolla, joka käyttää LCD -näppäimistön suojaa.

Digitaalikellon alkuperäinen malli on otettu David Harelilta. Hän on julkaissut paperin aiheesta

"[…] Laajentaa laajasti valtion koneiden ja tilakaavioiden perinteistä muodollisuutta."

Tässä artikkelissa hän käytti tutkimuksessaan digitaalisen kellon esimerkkiä. Olen käyttänyt sitä inspiraationa ja rakentanut kellon uudelleen YAKINDU Statechart Tools -työkalulla (työkalu tilakoneiden graafisten mallien luomiseen ja C/C ++ -koodin luomiseen sen avulla) ja herättänyt sen takaisin elämään Arduinolla.

Tarvikkeet

Laitteisto:

  • Arduino Uno tai Mega
  • LCD -näppäimistön suojus

Ohjelmisto:

  • YAKINDU Statechart Tools
  • Eclipse C ++ IDE Arduinolle

Vaihe 1: Kuinka digitaalikello toimii

Image
Image

Aloitetaan määrittelemällä, miten digitaalikello toimii. Muistatko nämä … sanotaanpa … "erittäin viileitä" digitaalisia kelloja, jotka kaikilla oli 90 -luvulla? Integroitu sekuntikello, eri hälytykset ja sen ärsyttävä piippaus joka täysi tunti. Jos ei, katso: 90 -luvun digitaalikello.

Joten periaatteessa se on konfiguroitava kello, jossa on erilaisia tiloja. Pääasiassa nykyinen aika näytetään, mutta on myös muita ominaisuuksia. Tulona sinulla on päälle/pois, tila ja asetuspainike. Lisäksi voit kytkeä valon päälle ja pois päältä. Tilapainikkeella voit erottaa tilat ja aktivoida/poistaa käytöstä kellotoiminnot:

  • Näytä aika (kello)
  • Näytä päivämäärä (päivämäärä)
  • Aseta hälytys (hälytys 1, hälytys 2)
  • Ota soittoääni käyttöön/poista se käytöstä (Aseta soittoääni)
  • Sekuntikellon käyttäminen (sekuntikello)

Valikoissa voit määrittää tilan on/off -painikkeella. Asetuspainikkeella voit asettaa ajan - esim. kelloa tai hälytyksiä varten. Sekuntikelloa voidaan ohjata - käynnistää ja pysäyttää - käyttämällä valon sytytys- ja sammutuspainiketta. Voit myös käyttää integroitua kierroslaskuria

Lisäksi on kello, joka soi joka täysi tunti, ja sisäänrakennettu ohjattava taustavalo. Ensimmäisessä vaiheessa en langannut niitä Arduinolle.

Vaihe 2: Tilakone

LCD -näppäimistön suojus
LCD -näppäimistön suojus

En halua mennä yksityiskohtaisesti tämän esimerkin selitykseen. Se ei johdu siitä, että se on liian monimutkainen, vaan vain hieman liian suuri. Yritän selittää perusajatuksen siitä, miten se toimii. Suorituksen pitäisi olla itsestään selvää katsomalla mallia tai lataamalla ja simuloimalla sitä. Jotkin tilakoneen osat on summattu alialueille, kuten asetettu aika -alue. Tällä tavoin on varmistettava tilakoneen luettavuus.

Malli on jaettu kahteen osaan - graafinen ja tekstillinen. Tekstiosassa määritellään tapahtumat, muuttujat jne. Graafisessa osassa - tilakaaviossa - määritetään mallin looginen suoritus. Määritetyn toiminnon täyttävän tilakoneen luomiseksi vaaditaan joitain syöttötapahtumia, joita voidaan käyttää mallissa: onoff, set, mode, light ja light_r. Määritelmäosassa käytetään sisäistä tapahtumaa, joka lisää aika -arvoa 100 ms: n välein:

100 ms / kerta += 1

100 ms: n vaiheiden perusteella nykyinen aika lasketaan muodossa HH: MM: SS:

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

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

Arvot kytketään nestekidenäyttöön käyttämällä updateLCD -toimintoa aina, kun tilakonetta kutsutaan:

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

Tilakoneen perustoiminnot on jo määritelty osiossa Digitaalikellon toiminta. Työkalussa olen käyttänyt joitain "erityisiä" mallinnuselementtejä, kuten CompositeState, Historia, Alakaaviot, ExitNodes jne. Yksityiskohtainen kuvaus löytyy käyttöoppaasta.

Vaihe 3: LCD -näppäimistön suoja

LCD -näppäimistön suojus on varsin siisti yksinkertaisiin projekteihin, jotka vaativat näytön visualisointiin ja joitain painikkeita syöttöön - tyypillinen, yksinkertainen HMI (Human Machine Interface). LCD -näppäimistön suojus sisältää viisi käyttäjäpainiketta ja yhden nollattavaksi. Kaikki viisi painiketta yhdistetään Arduinon A0 -nastaan. Jokainen niistä on kytketty jännitteenjakajaan, jonka avulla painikkeet voidaan erottaa toisistaan.

Voit käyttää analogReadia (0) löytääksesi arvot, jotka voivat tietysti vaihdella valmistajan mukaan. Tämä yksinkertainen projekti näyttää nykyisen arvon nestekidenäytössä:

#Sisällytä "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 ("mitattu arvo"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analoginenLue (0)); viive (200); }

Nämä ovat mitatut tulokset:

  • Ei mitään: 1023
  • Valitse: 640
  • Vasen: 411
  • Alas: 257
  • Ylös: 100
  • Oikea: 0

Näillä kynnyksillä on mahdollista lukea painikkeet:

#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 staattinen int readButton () {int result = 0; tulos = analoginen (0); if (tulos <50) {return OIKEA; } if (tulos <150) {return UP; } if (tulos <300) {return DOWN; } if (tulos <550) {return VASEN; } if (tulos <850) {return SELECT; } palauta NONE; }

Vaihe 4: Liitäntä tilakoneeseen

Liitäntä valtion koneeseen
Liitäntä valtion koneeseen

Tilakoneen generoitu C ++ -koodi tarjoaa rajapintoja, jotka on toteutettava tilakoneen ohjaamiseksi. Ensimmäinen askel on yhdistää tapahtumat näppäimistön kilven näppäimiin. Olen jo osoittanut, miten painikkeita luetaan, mutta niiden liittämiseksi tilakoneeseen painikkeiden poistaminen on välttämätöntä - muuten tapahtumat nousevat useita kertoja, mikä johtaa arvaamattomaan käyttäytymiseen. Ohjelmiston poistamisen käsite ei ole uusi. Voit katsoa Arduinon dokumentaatiota.

Toteutuksessani havaitsen putoavan reunan (painikkeen vapauttaminen). Luin painikkeen arvon, odotan 80 ms (sain parempia tuloksia 80: llä 50: n sijasta), tallennan tuloksen ja luen uuden arvon. Jos oldResult ei ollut NONE (ei painettu) ja uusi tulos on NONE, tiedän, että painiketta on painettu aiemmin ja nyt se on vapautettu. Nostan sitten tilakoneen vastaavan syöttötapahtuman.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); viive (80); oldState = -painikePainettu; if (oldState! = NONE &&& readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); tauko; } tapaus VASEN: {stateMachine-> getSCI_Button ()-> raise_set (); tauko; } tapaus ALAS: {stateMachine-> getSCI_Button ()-> raise_light (); tauko; } tapaus YLÖS: {stateMachine-> getSCI_Button ()-> raise_light_r (); tauko; } tapaus OIKEA: {stateMachine-> getSCI_Button ()-> raise_onoff (); tauko; } oletus: {break; }}}}

Vaihe 5: Asioiden yhdistäminen yhteen

Pääohjelma käyttää kolmea osaa:

  • Valtion kone
  • Ajastin
  • Näytönkäsittelijä (tyypillinen lcd.print (…))

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

Tilakone käyttää näytönkäsittelijää ja sai ajastimen, joka päivitetään hallitsemaan ajastettuja tapahtumia. Tämän jälkeen tilakone alustetaan ja syötetään.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Silmukka tekee kolme asiaa:

  • Nosta syöttötapahtumia
  • Laske kulunut aika ja päivitä ajastin
  • Soita valtion koneelle

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

Vaihe 6: Hae esimerkki

Se siitä. Luultavasti en ole maininnut kaikkia toteutuksen yksityiskohtia, mutta voit katsoa esimerkkiä tai jättää kommentin.

Lisää esimerkki käynnissä olevaan IDE: hen seuraavasti: Tiedosto -> Uusi -> Esimerkki -> YAKINDU Statechart Esimerkit -> Seuraava -> Arduino -Digitaalikello (C ++)

> Voit ladata IDE: n täältä <<

Voit aloittaa 30 päivän kokeilujaksolla. Jälkeenpäin sinun on hankittava lisenssi, joka on ilmainen ei-kaupalliseen käyttöön!

Suositeltava: