Innehållsförteckning:

Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin: 6 steg
Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin: 6 steg

Video: Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin: 6 steg

Video: Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin: 6 steg
Video: High Density 2022 2024, November
Anonim
Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin
Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin

Hej, jag ska visa dig hur en digital klocka kan skapas med YAKINDU Statechart Tools och köras på en Arduino, som använder en LCD -knappsats.

Den ursprungliga modellen av den digitala klockan är tagen från David Harel. Han har publicerat ett papper om

"[…] bred utvidgning av den konventionella formalismen för statsmaskiner och tillståndsdiagram."

I detta dokument använde han exemplet med den digitala klockan för sin forskning. Jag har använt den som en inspiration och byggt om klockan med YAKINDU Statechart Tools (ett verktyg för att skapa grafiska modeller av tillståndsmaskiner och generera C/C ++ - kod med den) och återupplivat den på en Arduino.

Tillbehör

Hårdvara:

  • Arduino Uno eller Mega
  • LCD -knappsatsskärm

Programvara:

  • YAKINDU Statechart -verktyg
  • Eclipse C ++ IDE för Arduino

Steg 1: Hur den digitala klockan fungerar

Image
Image

Låt oss börja med att definiera hur den digitala klockan ska fungera. Kommer du ihåg dessa … låt oss säga … "ultraköla" digitala klockor som alla hade på 90 -talet? Ett integrerat stoppur, olika larm och dess irriterande pip varje hel timme. Om inte, ta en titt: 90 -talets digitala klocka.

Så i princip är det en konfigurerbar klocka med olika lägen. Huvudsakligen kommer den aktuella tiden att visas, men det finns några andra funktioner. Som ingång har du en på/av, ett läge och en inställningsknapp. Dessutom kan du slå på och av lampan. Med lägesknappen kan du skilja mellan lägena och aktivera/inaktivera klockfunktionerna:

  • Visa tiden (klocka)
  • Visa datum (datum)
  • Ställ in larmet (larm 1, larm 2)
  • Aktivera/inaktivera klockspel (Ställ in klocka)
  • Använd stoppuret (Stop Watch)

I menyerna kan du använda på/av -knappen för att konfigurera läget. Set -knappen låter dig ställa in tiden - t.ex. för klockan eller larmet. Stoppuret kan styras - startas och stoppas - med hjälp av knappen för tändning och avstängning. Du kan också använda en integrerad varvräknare

Dessutom finns det en klocka som ringer varje hel timme och en kontrollerbar bakgrundsbelysning integrerad. I det första steget ledde jag dem inte till Arduino.

Steg 2: State Machine

LCD -knappsatsskärm
LCD -knappsatsskärm

Jag vill inte gå in så mycket i detalj för förklaringen av detta exempel. Det är inte för att det är för komplext, det är bara lite för stort. Jag ska försöka förklara grundtanken om hur det fungerar. Utförandet bör vara självförklarande genom att titta på modellen eller ladda ner och simulera den. Vissa delar av tillståndsmaskinen summeras i delregioner, till exempel den inställda tidsregionen. Med detta bör läsbarheten för statsmaskinen säkerställas.

Modellen är uppdelad i två delar - en grafisk och en textuell. I den textuella delen kommer händelser, variabler etc. att definieras. I den grafiska delen - tillståndsdiagrammet - anges det logiska utförandet av modellen. För att skapa en tillståndsmaskin som uppfyller det angivna beteendet krävs vissa ingångshändelser som kan användas i modellen: onoff, set, mode, light och light_r. Inom definitionsavsnittet används en intern händelse som ökar tidsvärdet var 100: e ms:

var 100 ms / gång += 1

Baserat på 100 ms -stegen beräknas den aktuella tiden i formatet HH: MM: SS:

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

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

Värdena kopplas till LCD -skärmen med hjälp av operationen updateLCD varje gång tillståndsmaskinen kommer att ringas:

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

Grundutförandet av tillståndsmaskinen är redan definierat i avsnittet Hur den digitala klockan fungerar. I verktyget har jag använt några "speciella" modelleringselement som CompositeState, History, Sub-Diagrams, ExitNodes, etc… En detaljerad beskrivning finns i användarhandboken.

Steg 3: LCD -knappsatsskärm

LCD -knappsatsen är ganska cool för enkla projekt, som kräver en skärm för visualisering och några knappar som ingång - en typisk, enkel HMI (Human Machine Interface). LCD -knappsatsen innehåller fem användarknappar och ytterligare en för återställning. De fem knapparna är tillsammans anslutna till A0 -stiftet på Arduino. Var och en av dem är ansluten till en spänningsdelare, vilket gör det möjligt att skilja mellan knapparna.

Du kan använda analogRead (0) för att hitta de specifika värdena, som naturligtvis kan skilja sig från tillverkaren. Detta enkla projekt visar det aktuella värdet på LCD -skärmen:

#inkludera "Arduino.h"

#inkludera "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("uppmätt värde"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); fördröjning (200); }

Detta är mina uppmätta resultat:

  • Ingen: 1023
  • Välj: 640
  • Vänster: 411
  • Ned: 257
  • Upp: 100
  • Höger: 0

Med dessa trösklar är det möjligt att läsa knapparna:

#define INGEN 0 #definiera VÄLJ 1 #define VÄNSTER 2 #define NED 3 #define UPP 4 #define RIGHT 5 static int readButton () {int result = 0; resultat = analogRead (0); if (resultat <50) {return RIGHT; } if (resultat <150) {return UP; } if (resultat <300) {return NED; } if (resultat <550) {return VÄNSTER; } if (resultat <850) {return SELECT; } returnera INGEN; }

Steg 4: Gränssnitt mot State Machine

Gränssnitt till statsmaskinen
Gränssnitt till statsmaskinen

Den genererade C ++ - koden för tillståndsmaskinen tillhandahåller gränssnitt, som måste implementeras för att styra tillståndsmaskinen. Det första steget är att ansluta in -händelserna med knapparna på knappsatsskyddet. Jag har redan visat hur man läser knapparna, men för att ansluta dem till tillståndsmaskinen krävs avstängning av knapparna - annars skulle händelserna höjas flera gånger, vilket resulterar i oförutsägbart beteende. Begreppet mjukvarudebouncing är inte nytt. Du kan titta på Arduino -dokumentationen.

I min implementering upptäcker jag en fallande kant (släpper knappen). Jag läste knappens värde, väntade 80 ms (fick bättre resultat med 80 istället för 50), sparade resultatet och läste det nya värdet. Om oldResult inte var NONE (ej tryckt) och det nya resultatet är NONE, vet jag att knappen har tryckts tidigare och nu har släppts. Sedan höjer jag den aktuella ingångshändelsen för tillståndsmaskinen.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); fördröjning (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); ha sönder; } fall VÄNSTER: {stateMachine-> getSCI_Button ()-> raise_set (); ha sönder; } fall NED: {stateMachine-> getSCI_Button ()-> raise_light (); ha sönder; } fall UP: {stateMachine-> getSCI_Button ()-> raise_light_r (); ha sönder; } fall HÖGER: {stateMachine-> getSCI_Button ()-> raise_onoff (); ha sönder; } standard: {break; }}}}

Steg 5: Koppla ihop saker

Huvudprogrammet består av tre delar:

  • Statens maskin
  • En timer
  • En bildskärmshanterare (typiskt LCD -tryck (…))

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

Tillståndsmaskinen använder en bildskärmshanterare och fick en timer, som kommer att uppdateras för att styra de tidsinställda händelserna. Därefter initialiseras och skrivs in tillståndsmaskinen.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Slingan gör tre saker:

  • Öka ingångshändelser
  • Beräkna förfluten tid och uppdatera timern
  • Ring tillståndsmaskinen

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

Steg 6: Få exemplet

Det är allt. Förmodligen har jag inte nämnt alla detaljer i implementeringen, men du kan titta på exemplet eller lämna en kommentar.

Lägg till exemplet till en IDE som körs med: Arkiv -> Nytt -> Exempel -> YAKINDU Statechart Exempel -> Nästa -> Arduino -Digital klocka (C ++)

> Du kan ladda ner IDE här <<

Du kan börja med en 30 dagars provperiod. Efteråt måste du få en licens, som är gratis för icke-kommersiellt bruk!

Rekommenderad: