Съдържание:
- Консумативи
- Стъпка 1: Как работи цифровият часовник
- Стъпка 2: Държавната машина
- Стъпка 3: Щит на LCD клавиатурата
- Стъпка 4: Връзка с държавната машина
- Стъпка 5: Свържете нещата заедно
- Стъпка 6: Вземете примера
Видео: Цифров часовник на Arduino с използване на машина с крайно състояние: 6 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:51
Здравейте, ще ви покажа как може да се създаде дигитален часовник с инструментите на YAKINDU Statechart и да работи на Arduino, който използва щит за LCD клавиатура.
Оригиналният модел на цифровия часовник е взет от Дейвид Харел. Той е публикувал статия за
„[…] Широко разширяване на конвенционалния формализъм на машините на състоянието и диаграмите на състоянието.“
В тази статия той използва примера на цифровия часовник за своите изследвания. Използвах го като вдъхновение и възстанових часовника с YAKINDU Statechart Tools (инструмент за създаване на графични модели на състоятелни машини и генериране на C/C ++ код с него) и го върнах към живот на Arduino.
Консумативи
Хардуер:
- Arduino Uno или Mega
- Щит за LCD клавиатура
Софтуер:
- Инструменти за диаграми на състоянието на YAKINDU
- Eclipse C ++ IDE за Arduino
Стъпка 1: Как работи цифровият часовник
Нека започнем, като определим как трябва да работи цифровият часовник. Спомняте ли си тези… да кажем… „супер готини“цифрови часовници, които всички са имали през 90 -те? Интегриран хронометър, различни аларми и неговият досаден звуков сигнал на всеки цял час. Ако не, погледнете: цифров часовник от 90 -те.
Така че по принцип това е конфигурируем часовник с различни режими. Основно ще се показва текущото време, но има и някои други функции. Като вход, имате включване/изключване, режим и бутон за настройка. Освен това можете да включвате и изключвате светлината. С бутона за режим можете да правите разлика между режимите и да активирате/деактивирате функциите на часовника:
- Показване на часа (Часовник)
- Показване на датата (Date)
- Задайте аларма (Аларма 1, Аларма 2)
- Активиране/деактивиране на звънене (Set Chime)
- Използвайте хронометъра (хронометър)
В менютата можете да използвате бутона за включване/изключване, за да конфигурирате режима. Бутонът за настройка ви позволява да настроите часа - напр. за часовника или алармите. Хронометърът може да се управлява - стартира и спира - с помощта на бутона за включване и изключване на светлината. Можете също да използвате интегриран брояч на обиколки
Освен това има звънец, който звъни на всеки цял час, и вградена контролируема подсветка. На първата стъпка не ги свързах към Arduino.
Стъпка 2: Държавната машина
Не искам да отивам много подробно за обяснението на този пример. Не защото е твърде сложно, просто е малко прекалено голямо. Ще се опитам да обясня основната идея за това как работи. Изпълнението трябва да се обяснява от само себе си, като погледнете модела или го изтеглите и симулирате. Някои части от машината на състоянието се сумират в подрегиони, като например зададената времева област. С това трябва да се гарантира четимостта на държавната машина.
Моделът е разделен на две части - графична и текстова. В текстовата част ще бъдат дефинирани събитията, променливите и т.н. В графичната част - диаграмата на състоянието - е посочено логическото изпълнение на модела. За да се създаде машина на състоянието, която отговаря на посоченото поведение, са необходими някои входни събития, които могат да се използват в модела: onoff, set, mode, light и light_r. В раздела за дефиниция се използва вътрешно събитие, което увеличава стойността на времето на всеки 100 ms:
на всеки 100 ms / час += 1
Въз основа на стъпките от 100 ms текущото време ще бъде изчислено във формат HH: MM: SS:
display.first = (време / 36000) % 24;
display.second = (време / 600) % 60; display.third = (време / 10) % 60;
Стойностите ще бъдат свързани към LCD дисплея с помощта на операцията updateLCD всеки път, когато машината на състоянието ще бъде извикана:
display.updateLCD (display.first, display.second, display.third, display.text)
Основното изпълнение на машината на състоянието вече е дефинирано в раздела Как работи цифровият часовник. В рамките на инструмента съм използвал някои „специални“моделиращи елементи като CompositeState, History, Sub-Diagrams, ExitNodes и др. Подробно описание може да бъде намерено в Ръководството за потребителя.
Стъпка 3: Щит на LCD клавиатурата
Щитът на LCD клавиатурата е доста готин за прости проекти, които изискват екран за визуализация и някои бутони като вход - типичен, прост HMI (Human Machine Interface). Щитът на LCD клавиатурата съдържа пет потребителски бутона и още един за нулиране. Всичките пет бутона са свързани към щифта A0 на Arduino. Всеки от тях е свързан към делител на напрежение, което позволява да се прави разлика между бутоните.
Можете да използвате analogRead (0), за да намерите конкретните стойности, които, разбира се, могат да се различават в зависимост от производителя. Този прост проект показва текущата стойност на LCD дисплея:
#включва "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 ("Измерена стойност"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); забавяне (200); }
Това са моите измерени резултати:
- Няма: 1023
- Изберете: 640
- Вляво: 411
- Надолу: 257
- Нагоре: 100
- Вдясно: 0
С тези прагове е възможно да се четат бутоните:
#define NONE 0 #define SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; резултат = analogRead (0); if (резултат <50) {return RIGHT; } if (резултат <150) {връщане НАГОРЕ; } if (резултат <300) {връщане НАДОЛУ; } if (резултат <550) {return LEFT; } if (резултат <850) {return SELECT; } връщане NONE; }
Стъпка 4: Връзка с държавната машина
Генерираният C ++ код на машината на състоянието предоставя интерфейси, които трябва да бъдат внедрени за управление на машината на състоянието. Първата стъпка е свързването на събития in с клавишите на щита на клавиатурата. Вече съм показал как да се четат бутоните, но за свързването им към машината на състоянието е необходимо премахване на бутоните - в противен случай събитията ще бъдат повдигнати многократно, което води до непредсказуемо поведение. Концепцията за премахване на софтуера не е нова. Можете да разгледате документацията на Arduino.
В моето изпълнение откривам падащ ръб (освобождаване на бутона). Прочетох стойността на бутона, изчаквам 80 ms (получих по -добри резултати с 80 вместо 50), запазвам резултата и чета новата стойност. Ако oldResult не е NONE (без натиск) и новият резултат е NONE, знам, че бутонът е бил натиснат преди и сега е освободен. След това повдигам съответното входно събитие на машината на състоянието.
int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); забавяне (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode (); прекъсване; } регистър НАЛЯВО: {stateMachine-> getSCI_Button ()-> raise_set (); прекъсване; } случай НАДОЛУ: {stateMachine-> getSCI_Button ()-> raise_light (); прекъсване; } регистър нагоре: {stateMachine-> getSCI_Button ()-> raise_light_r (); прекъсване; } случай RIGHT: {stateMachine-> getSCI_Button ()-> raise_onoff (); прекъсване; } по подразбиране: {break; }}}}
Стъпка 5: Свържете нещата заедно
Основната програма използва три части:
- Държавната машина
- Таймер
- Манипулатор на дисплея (типичен lcd.print (…))
DigitalWatch* stateMachine = нов DigitalWatch (); CPPTimerInterface* timer_sct = нов CPPTimerInterface (); DisplayHandler* displayHandler = нов DisplayHandler ();
Машината на състоянието използва манипулатор на дисплея и има таймер, който ще бъде актуализиран, за да контролира събитията по време. След това машината на състоянието се инициализира и въвежда.
void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Цикълът прави три неща:
- Повишаване на входните събития
- Изчислете изминалото време и актуализирайте таймера
- Обадете се на държавната машина
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 (); }
Стъпка 6: Вземете примера
Това е. Вероятно не съм споменал всеки детайл от внедряването, но можете да разгледате примера или да оставите коментар.
Добавете примера към работеща IDE с: File -> New -> Example -> YAKINDU Statechart Примери -> Next -> Arduino -Digital Watch (C ++)
> Можете да изтеглите IDE тук <<
Можете да започнете с 30 -дневен пробен период. След това трябва да получите лиценз, който е безплатен за некомерсиална употреба!
Препоръчано:
Как да направите аналогов часовник и цифров часовник с LED лента с помощта на Arduino: 3 стъпки
Как да направите аналогов часовник и цифров часовник с LED лента с помощта на Arduino: Днес ще направим аналогов часовник & Цифров часовник с Led Strip и MAX7219 Dot модул с Arduino, Той ще коригира времето с местната часова зона. Аналоговият часовник може да използва по -дълга LED лента, така че да може да бъде окачен на стената, за да се превърне в произведение на изкуството
Система за опростено състояние и резервация на Kicker със слаба интеграция: 12 стъпки (със снимки)
Simple Kicker Status and Reserve System with Slack Integration: Във фирма, в която работя, има маса за кикър. Компанията заема много етажи и за някои от служителите са необходими до 3 минути, за да стигнат до масата и … да осъзнаят, че масата вече е заета. Затова възникна идея за изграждане на ки
Как да съборите цифров апарат и как работи цифров апарат: 4 стъпки
Как да съборите цифров апарат и как работи цифров апарат: Много хора знаят как да използват шублери за измерване. Този урок ще ви научи как да съборите цифров шублер и обяснение как работи цифровият апарат
ESP8266 Мрежов часовник без RTC - Nodemcu NTP Часовник Няма RTC - ИНТЕРНЕТЕН ЧАСОВНИК ПРОЕКТ: 4 стъпки
ESP8266 Мрежов часовник без RTC | Nodemcu NTP Часовник Няма RTC | ИНТЕРНЕТЕН ЧАСОВНИК ПРОЕКТ: В проекта ще се прави часовник проект без RTC, ще отнеме време от интернет с помощта на wifi и ще го покаже на дисплея st7735
Машина с крайно състояние на MSP430: 6 стъпки
Машина с крайни състояния на MSP430: Ще ви покажа как да програмирате MSP430G2 Launchpad с машини с крайни състояния (FSM), използвайки инструментите за диаграми на състоянието на YAKINDU директно в Texas Instruments Code Composer Studio. Този урок съдържа шест стъпки: Инсталиране на YAKINDU Statechart Tools като