Innehållsförteckning:
- Tillbehör
- Steg 1: Hur den digitala klockan fungerar
- Steg 2: State Machine
- Steg 3: LCD -knappsatsskärm
- Steg 4: Gränssnitt mot State Machine
- Steg 5: Koppla ihop saker
- Steg 6: Få exemplet
Video: Digital klocka på Arduino med hjälp av en slutlig tillståndsmaskin: 6 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:44
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
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
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
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:
Hur man gör analog klocka och digital klocka med LED -remsa med Arduino: 3 steg
Hur man gör analog klocka och digital klocka med LED -remsa med Arduino: Idag kommer vi att göra en analog klocka & Digital klocka med Led Strip och MAX7219 Dot -modul med Arduino. Den kommer att korrigera tiden med den lokala tidszonen. Den analoga klockan kan använda en längre LED -remsa, så den kan hängas på väggen för att bli en konstverk
Arduino digital klocka synkroniserad med 60 Hz kraftledning: 8 steg (med bilder)
Arduino digital klocka synkroniserad med 60Hz kraftledning: Denna Arduino baserade digitala klocka synkroniseras med 60Hz kraftledning. Den har en enkel och billig 4 -siffrig 7 -segmentig anoddisplay som visar timmar och minuter. Den använder en cross -over -detektor för att upptäcka när den inkommande 60Hz sinusvåg
Skapa en klocka från en klocka: 11 steg (med bilder)
Skapa en klocka från en klocka: I denna instruktionsbok tar jag en befintlig klocka och skapar vad jag tycker är en bättre klocka. Vi går från bilden till vänster till bilden till höger. Innan du börjar på din egen klocka, vänligen vet att återmontering kan vara en utmaning som
Konvertera hem vanlig klocka till självglödande klocka: 8 steg (med bilder)
Konvertera hem vanlig klocka till självglödande klocka: FÖRST GÖR JAG MITT HJÄRTIGT TACK TILL INSTRUKTABLAR LAGET GÖR SOM MIN HÄLSA ÅTERSTÄLLNINGSDAGAR SÅ MER ANSVAR ….. I denna instruktion vill jag dela med er hur man konverterar din vanliga klocka hem. in till självglödande klocka. > > För att göra detta
Arduino digital klocka med alarmfunktion (anpassad kretskort): 6 steg (med bilder)
Arduino digital klocka med alarmfunktion (anpassad PCB): I denna DIY -guide visar jag dig hur du gör din egen digitala klocka till denna alarmfunktion. I detta projekt bestämde jag mig för att göra mitt eget kretskort som är baserat på Arduino UNO mikrokontroller - Atmega328p. Nedan hittar du det elektroniska schemat med PCB l