Innholdsfortegnelse:

Digital klokke på Arduino ved hjelp av en endelig maskin: 6 trinn
Digital klokke på Arduino ved hjelp av en endelig maskin: 6 trinn

Video: Digital klokke på Arduino ved hjelp av en endelig maskin: 6 trinn

Video: Digital klokke på Arduino ved hjelp av en endelig maskin: 6 trinn
Video: 7 проектов. Сборка светодиодного ЖК-будильника с использованием DS1307 и Arduino | Урок 105 2024, November
Anonim
Digital klokke på Arduino ved hjelp av en endelig maskin
Digital klokke på Arduino ved hjelp av en endelig maskin

Hei, jeg skal vise deg hvordan en digital klokke kan opprettes med YAKINDU Statechart Tools og kjøres på en Arduino, som bruker et LCD -tastaturskjerm.

Den originale modellen av den digitale klokken ble hentet fra David Harel. Han har publisert et papir om

"[…] Bred forlengelse av den konvensjonelle formalismen til statsmaskiner og statlige diagrammer."

I denne oppgaven brukte han eksemplet på den digitale klokken for sin forskning. Jeg har brukt den som en inspirasjon og gjenoppbygd klokken med YAKINDU Statechart Tools (et verktøy for å lage grafiske modeller av statlige maskiner og generere C/C ++ - kode med den) og brakt den tilbake til livet på en Arduino.

Rekvisita

Maskinvare:

  • Arduino Uno eller Mega
  • LCD -tastaturskjerm

Programvare:

  • YAKINDU Statechart Tools
  • Eclipse C ++ IDE for Arduino

Trinn 1: Hvordan den digitale klokken fungerer

Image
Image

La oss starte med å definere hvordan den digitale klokken skal fungere. Husker du disse… la oss si…”ultrakule” digitale klokker som alle hadde på 90 -tallet? En integrert stoppeklokke, forskjellige alarmer og irriterende pip hver hele time. Hvis ikke, ta en titt: 90 -tallets digitale klokke.

Så i utgangspunktet er det en konfigurerbar klokke med forskjellige moduser. Den viktigste tiden vil hovedsakelig bli vist, men det er noen andre funksjoner. Som input har du en av/på, en modus og en knapp. I tillegg kan du slå lyset på og av. Med modusknappen kan du skille mellom modusene og aktivere/deaktivere klokkefunksjonene:

  • Vis tiden (klokke)
  • Vis datoen (dato)
  • Still inn alarmen (alarm 1, alarm 2)
  • Aktiver/deaktiver klokkeslett (Sett klokkeslett)
  • Bruk stoppeklokken (Stop Watch)

I menyene kan du bruke av/på -knappen for å konfigurere modusen. Sett -knappen lar deg stille klokken - f.eks. for klokken eller alarmene. Stoppeklokken kan styres - startes og stoppes - ved å bruke lampen på og av. Du kan også bruke en integrert rundeteller

Videre er det en klokke, som ringer hver hele time, og en kontrollerbar bakgrunnsbelysning integrert. På det første trinnet ledet jeg dem ikke til Arduino.

Trinn 2: State Machine

LCD -tastaturskjerm
LCD -tastaturskjerm

Jeg vil ikke gå så mye i detalj for forklaringen på dette eksemplet. Det er ikke fordi det er for komplekst, det er bare litt for stort. Jeg skal prøve å forklare den grunnleggende ideen om hvordan det fungerer. Utførelsen bør være selvforklarende, ved å se på modellen eller laste ned og simulere den. Noen deler av statsmaskinen er oppsummert i delområder, for eksempel det angitte tidsområdet. Med dette bør lesbarheten til statsmaskinen sikres.

Modellen er delt i to deler - en grafisk og en tekstlig. I den tekstlige delen vil hendelsene, variablene, etc. bli definert. I den grafiske delen - tilstandsdiagrammet - er den logiske utførelsen av modellen spesifisert. For å opprette en tilstandsmaskin som oppfyller den angitte oppførselen, kreves noen inngangshendelser, som kan brukes i modellen: på, sett, modus, lys og lys_r. Innenfor definisjonsdelen brukes en intern hendelse, som øker tidsverdien hver 100 ms:

hver 100 ms / gang += 1

Basert på trinnene på 100 ms vil gjeldende tid bli beregnet i formatet HH: MM: SS:

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

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

Verdiene kobles til LCD -skjermen ved å bruke operasjonsoppdateringen LCD hver gang maskinen blir kalt:

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

Den grunnleggende utførelsen av statsmaskinen er allerede definert i avsnittet Hvordan den digitale klokken fungerer. I verktøyet har jeg brukt noen "spesielle" modelleringselementer som CompositeState, History, Sub-Diagrams, ExitNodes, etc. En detaljert beskrivelse finner du i brukerhåndboken.

Trinn 3: LCD -tastaturskjerm

LCD -tastaturet er ganske kult for enkle prosjekter, som krever en skjerm for visualisering og noen knapper som inngang - et typisk, enkelt HMI (Human Machine Interface). LCD -tastaturet inneholder fem brukerknapper og en til for tilbakestilling. De fem knappene er sammen koblet til A0 -pinnen på Arduino. Hver av dem er koblet til en spenningsdeler, som gjør det mulig å skille mellom knappene.

Du kan bruke analogRead (0) for å finne de spesifikke verdiene, som selvfølgelig kan variere fra produsent. Dette enkle prosjektet viser gjeldende verdi på LCD -skjermen:

#inkludere "Arduino.h"

#include "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); ugyldig oppsett () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("målt verdi"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); forsinkelse (200); }

Dette er mine målte resultater:

  • Ingen: 1023
  • Velg: 640
  • Venstre: 411
  • Ned: 257
  • Opp: 100
  • Høyre: 0

Med disse tersklene er det mulig å lese knappene:

#define NONE 0 #definere SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; resultat = analogRead (0); hvis (resultat <50) {return HØYRE; } if (resultat <150) {return UP; } if (resultat <300) {return NED; } if (resultat <550) {return LEFT; } if (resultat <850) {return SELECT; } returner INGEN; }

Trinn 4: Grensesnitt mot statsmaskinen

Grensesnitt mot statsmaskinen
Grensesnitt mot statsmaskinen

Den genererte C ++ - koden til tilstandsmaskinen gir grensesnitt, som må implementeres for å kontrollere tilstandsmaskinen. Det første trinnet er å koble hendelsene med tastene til tastaturskjoldet. Jeg har allerede vist hvordan jeg leser knappene, men for å koble dem til statsmaskinen er det nødvendig å avbryte knappene - ellers vil hendelsene bli hevet flere ganger, noe som resulterer i uforutsigbar oppførsel. Konseptet med programvaren debouncing er ikke nytt. Du kan se på Arduino -dokumentasjonen.

I min implementering oppdager jeg en fallende kant (slipper knappen). Jeg leste verdien på knappen, vent i 80 ms (fikk bedre resultater med 80 i stedet for 50), lagret resultatet og les den nye verdien. Hvis oldResult ikke var NONE (upresset) og det nye resultatet er NONE, vet jeg at knappen har blitt trykket før og nå har blitt sluppet. Deretter løfter jeg den tilhørende inndatahendelsen til tilstandsmaskinen.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); forsinkelse (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); gå i stykker; } sak VENSTRE: {stateMachine-> getSCI_Button ()-> raise_set (); gå i stykker; } sak NED: {stateMachine-> getSCI_Button ()-> raise_light (); gå i stykker; } case UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); gå i stykker; } sak HØYRE: {stateMachine-> getSCI_Button ()-> raise_onoff (); gå i stykker; } standard: {pause; }}}}

Trinn 5: Koble ting sammen

Hovedprogrammet bruker tre deler:

  • Statsmaskinen
  • En timer
  • En displayhåndterer (typisk LCD -utskrift (…))

DigitalWatch* stateMachine = ny DigitalWatch (); CPPTimerInterface* timer_sct = nytt CPPTimerInterface (); DisplayHandler* displayHandler = ny DisplayHandler ();

Statsmaskinen bruker en visningshåndterer og fikk en tidtaker, som vil bli oppdatert for å kontrollere de tidsbestemte hendelsene. Etterpå blir statsmaskinen initialisert og lagt inn.

ugyldig oppsett () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Sløyfen gjør tre ting:

  • Hev innspillshendelser
  • Beregn forløpt tid og oppdater timeren
  • Ring statsmaskinen

long current_time = 0; long last_cycle_time = 0; void loop () {raiseEvents (); siste_sykkel_tid = nåværende_tid; current_time = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Trinn 6: Få eksemplet

Det er det. Sannsynligvis har jeg ikke nevnt alle detaljer ved implementeringen, men du kan se på eksemplet eller legge igjen en kommentar.

Legg til eksemplet til en IDE som kjører med: Fil -> Ny -> Eksempel -> YAKINDU Statechart -eksempler -> Neste -> Arduino -Digital Watch (C ++)

> Du kan laste ned IDE her <<

Du kan starte med en 30 dagers prøveperiode. Etterpå må du få en lisens, som er gratis for ikke-kommersiell bruk!

Anbefalt: