Satura rādītājs:
- Piegādes
- 1. darbība. Kā darbojas digitālais pulkstenis
- 2. solis: valsts mašīna
- 3. darbība: LCD tastatūras vairogs
- 4. darbība: saskarne ar valsts iekārtu
- 5. solis: lietu savienošana kopā
- 6. darbība: iegūstiet piemēru
Video: Digitālais pulkstenis Arduino, izmantojot ierobežota stāvokļa mašīnu: 6 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:54
Sveiki, es jums parādīšu, kā digitālo pulksteni var izveidot, izmantojot YAKINDU Statechart Tools un darboties ar Arduino, kas izmanto LCD tastatūras vairogu.
Digitālā pulksteņa oriģinālais modelis tika ņemts no Deivida Harela. Viņš ir publicējis rakstu par
"[…] Valsts iekārtu un stāvokļa diagrammu tradicionālā formālisma plašs paplašinājums."
Šajā rakstā viņš pētījumiem izmantoja digitālā pulksteņa piemēru. Esmu to izmantojis kā iedvesmu un pārbūvējis pulksteni, izmantojot YAKINDU Statechart Tools (rīku valsts iekārtu grafisko modeļu izveidei un C/C ++ koda ģenerēšanai), un atdzīvinājis to Arduino.
Piegādes
Aparatūra:
- Arduino Uno vai Mega
- LCD tastatūras vairogs
Programmatūra:
- YAKINDU stāvokļa diagrammas rīki
- Eclipse C ++ IDE Arduino
1. darbība. Kā darbojas digitālais pulkstenis
Sāksim, nosakot, kā digitālajam pulkstenim vajadzētu darboties. Vai atceraties šos … pieņemsim … "īpaši foršos" digitālos pulksteņus, kas visiem bija 90. gados? Integrēts hronometrs, dažādi trauksmes signāli un tā kaitinošais pīkstiens katru pilnu stundu. Ja nē, ieskatieties: 90. gadu digitālais pulkstenis.
Tātad būtībā tas ir konfigurējams pulkstenis ar dažādiem režīmiem. Galvenokārt tiks parādīts pašreizējais laiks, taču ir dažas citas funkcijas. Kā ievade jums ir ieslēgšana/izslēgšana, režīms un iestatīšanas poga. Turklāt jūs varat ieslēgt un izslēgt gaismu. Ar režīma pogu jūs varat atšķirt režīmus un aktivizēt/atspējot pulksteņa funkcijas:
- Rādīt laiku (pulkstenis)
- Parādīt datumu (datums)
- Modinātāja iestatīšana (1. modinātājs, 2. modinātājs)
- Iespējot/atspējot signālu (iestatīt zvanu)
- Hronometra izmantošana (hronometrs)
Izvēlnēs varat izmantot ieslēgšanas/izslēgšanas pogu, lai konfigurētu režīmu. Iestatīšanas poga ļauj iestatīt laiku - piem. pulkstenim vai modinātājiem. Hronometru var kontrolēt - iedarbināt un apturēt -, izmantojot gaismas ieslēgšanas un izslēgšanas pogu. Varat arī izmantot integrētu klēpja skaitītāju
Turklāt ir zvana signāls, kas zvana katru pilnu stundu, un integrēts kontrolējams apgaismojums. Pirmajā solī es tos nepārvadāju ar Arduino.
2. solis: valsts mašīna
Es nevēlos sīkāk iedziļināties šī piemēra skaidrojumā. Tas nav tāpēc, ka tas ir pārāk sarežģīts, tas ir tikai nedaudz par lielu. Es mēģināšu izskaidrot pamatideju, kā tā darbojas. Izpildei vajadzētu būt pašsaprotamai, apskatot modeli vai lejupielādējot un simulējot to. Dažas valsts iekārtas daļas ir apkopotas apakšreģionos, piemēram, iestatītais laika reģions. Tādējādi būtu jānodrošina valsts iekārtas lasāmība.
Modelis ir sadalīts divās daļās - grafiskā un teksta. Tekstuālajā daļā tiks definēti notikumi, mainīgie utt. Grafiskajā daļā - stāvokļa diagrammā - ir norādīta modeļa loģiskā izpilde. Lai izveidotu stāvokļa mašīnu, kas atbilst norādītajai uzvedībai, ir nepieciešami daži ievades notikumi, kurus var izmantot modelī: ieslēgts, iestatīts, režīms, gaisma un gaisma_r. Definīcijas sadaļā tiek izmantots iekšējs notikums, kas palielina laika vērtību ik pēc 100 ms:
ik pēc 100 ms / reizi += 1
Pamatojoties uz 100 ms soļiem, pašreizējais laiks tiks aprēķināts formātā HH: MM: SS:
display.first = (laiks / 36000) % 24;
display.second = (laiks / 600) % 60; displejs.trešais = (laiks / 10) % 60;
Vērtības tiks pieslēgtas LCD displejam, izmantojot darbību updateLCD katru reizi, kad tiks izsaukta valsts iekārta:
display.updateLCD (display.first, display.second, display.third, display.text)
Stāvokļa pamata izpilde jau ir definēta sadaļā Kā darbojas digitālais pulkstenis. Rīka ietvaros esmu izmantojis dažus "īpašus" modelēšanas elementus, piemēram, CompositeState, Vēsture, Apakšdiagrammas, ExitNodes utt. Detalizētu aprakstu var atrast Lietotāja rokasgrāmatā.
3. darbība: LCD tastatūras vairogs
LCD tastatūras vairogs ir diezgan foršs vienkāršiem projektiem, kuru vizualizācijai ir nepieciešams ekrāns un dažas pogas kā ieeja - tipisks, vienkāršs HMI (cilvēka un mašīnas saskarne). LCD tastatūras ekrānā ir piecas lietotāja pogas un vēl viena atiestatīšanas poga. Visas piecas pogas ir savienotas ar Arduino A0 tapu. Katrs no tiem ir savienots ar sprieguma dalītāju, kas ļauj atšķirt pogas.
Varat izmantot analogRead (0), lai atrastu konkrētās vērtības, kuras, protams, var atšķirties atkarībā no ražotāja. Šis vienkāršais projekts LCD parāda pašreizējo vērtību:
#ietver "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 ("Izmērītā vērtība"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); kavēšanās (200); }
Šie ir mani izmērītie rezultāti:
- Nav: 1023
- Izvēlieties: 640
- Pa kreisi: 411
- Uz leju: 257
- Uz augšu: 100
- Pareizi: 0
Izmantojot šos sliekšņus, ir iespējams izlasīt pogas:
#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; rezultāts = analogRead (0); ja (rezultāts <50) {return RIGHT; } ja (rezultāts <150) {return UP; } ja (rezultāts <300) {return DOWN; } ja (rezultāts <550) {return LEFT; } ja (rezultāts <850) {return SELECT; } atgriezt NAV; }
4. darbība: saskarne ar valsts iekārtu
Ģenerētais valsts mašīnas C ++ kods nodrošina saskarnes, kas jāievieš, lai kontrolētu stāvokļa mašīnu. Pirmais solis ir savienot notikumus ar tastatūras vairoga taustiņiem. Es jau esmu parādījis, kā lasīt pogas, taču, lai tās savienotu ar valsts iekārtu, ir jāatvieno pogas - pretējā gadījumā notikumi tiks pacelti vairākas reizes, kā rezultātā rodas neparedzama uzvedība. Programmatūras atcelšanas jēdziens nav jauns. Jūs varat apskatīt Arduino dokumentāciju.
Īstenojot, es atklāju krītošu malu (atlaižot pogu). Es izlasīju pogas vērtību, gaidu 80 ms (ieguvu labākus rezultātus ar 80, nevis 50), saglabāju rezultātu un izlasīju jauno vērtību. Ja oldResult nebija NONE (nenospiests) un jaunais rezultāts NONE, es zinu, ka poga ir bijusi nospiesta iepriekš un tagad ir atbrīvota. Tad es paaugstinu atbilstošo valsts iekārtas ievades notikumu.
int oldState = NAV; static void raiseEvents () {int buttonPressed = readButton (); kavēšanās (80); oldState = pogaNospiests; if (oldState! = NONE && read read Button () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); pārtraukums; } gadījums LEFT: {stateMachine-> getSCI_Button ()-> raise_set (); pārtraukums; } gadījums LEJU: {stateMachine-> getSCI_Button ()-> raise_light (); pārtraukums; } gadījums uz augšu: {stateMachine-> getSCI_Button ()-> raise_light_r (); pārtraukums; } gadījums PAREIZI: {stateMachine-> getSCI_Button ()-> raise_onoff (); pārtraukums; } noklusējums: {break; }}}}
5. solis: lietu savienošana kopā
Galvenā programma sastāv no trim daļām:
- Valsts mašīna
- Taimeris
- Displeja apstrādātājs (tipisks lcd.print (…))
DigitalWatch* stateMachine = jauns DigitalWatch (); CPPTimerInterface* timer_sct = jauns CPPTimerInterface (); DisplayHandler* displayHandler = jauns DisplayHandler ();
Stāvokļa mašīna izmanto displeja apstrādātāju un ieguva taimeri, kas tiks atjaunināts, lai kontrolētu notikumus ar laiku. Pēc tam valsts iekārta tiek inicializēta un ievadīta.
void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Cilpa veic trīs lietas:
- Palieliniet ievades notikumus
- Aprēķiniet pagājušo laiku un atjauniniet taimeri
- Zvaniet valsts mašīnai
garš pašreizējais_laiks = 0; ilgs pēdējais_cikla_laiks = 0; void loop () {raiseEvents (); last_cycle_time = pašreizējais_laiks; pašreizējais_laiks = milis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }
6. darbība: iegūstiet piemēru
Tieši tā. Iespējams, es neesmu pieminējis katru ieviešanas detaļu, bet jūs varat apskatīt piemēru vai atstāt komentāru.
Pievienojiet piemēru darbojošam IDE, izmantojot: Fails -> Jauns -> Piemērs -> YAKINDU valsts diagrammas piemēri -> Tālāk -> Arduino -digitālais pulkstenis (C ++)
> IDE varat lejupielādēt šeit <<
Jūs varat sākt ar 30 dienu izmēģinājumu. Pēc tam jums ir jāsaņem licence, kas ir bezmaksas nekomerciālai lietošanai!
Ieteicams:
Arduino digitālais pulkstenis, izmantojot DS1302: 4 soļi
Arduino digitālais pulkstenis, izmantojot DS1302: Ievads Sveiki, puiši, es ceru, ka jums visiem klājas lieliski. Šis būs īss un vienkāršs projekts par to, kā izveidot digitālo pulksteni, izmantojot Arduino. Šajā projektā mēs izveidosim digitālo pulksteni, izmantojot Arduino un maiņu reģistru. Šī
Digitālais pulkstenis, izmantojot Arduino un Led Dot Matrix displeju: 6 soļi
Digitālais pulkstenis, izmantojot Arduino un Led Dot Matrix Display: Mūsdienās veidotāji, izstrādātāji priekšroku dod Arduino, lai strauji attīstītu projektu prototipus. Arduino ir atvērtā koda elektronikas platforma, kuras pamatā ir viegli lietojama aparatūra un programmatūra. Arduino ir ļoti laba lietotāju kopiena. Šajā projektā
Vienkāršs digitālais pulkstenis, izmantojot Arduino Nano un DS1307: 4 soļi
Vienkāršs digitālais pulkstenis, izmantojot Arduino Nano & DS1307: Šajā rakstā es jums parādīšu pamācību digitālā pulksteņa izgatavošanai, izmantojot Arduino .. Arduino tāfele, kuru izmantoju, ir Arduino Nano V3, DS1307 kā laika datu nodrošinātājs, MAX7219 7 Segments kā skatīties displeju. pirms ieejas apmācībā, iesaku
Vienkāršs digitālais pulkstenis, izmantojot Arduino: 6 soļi
Vienkāršs digitālais pulkstenis, izmantojot Arduino: izveidojiet vienkāršu digitālo pulksteni, izmantojot arduino un vienkāršu PCB
12 stundu digitālais pulkstenis, izmantojot Arduino: 3 soļi
12 stundu digitālais pulkstenis, izmantojot Arduino: Šis ir uz maizes dēļa balstīts projekts, kas izmanto Atmel Atmega 2560 (Arduino Mega) un 16x2 LCD ekrānu, lai izveidotu 12 stundu digitālo pulksteni bez papildu perifērijas ierīcēm. Mēs varam arī iestatīt un mainīt laiku, izmantojot divas spiedpogas. Viss