Съдържание:

Цифров часовник на Arduino с използване на машина с крайно състояние: 6 стъпки
Цифров часовник на Arduino с използване на машина с крайно състояние: 6 стъпки

Видео: Цифров часовник на Arduino с използване на машина с крайно състояние: 6 стъпки

Видео: Цифров часовник на Arduino с използване на машина с крайно състояние: 6 стъпки
Видео: Урок 99. Создание цифровых часов Arduino с использованием ЖК-дисплея DS3231 и семисегментного дисплея. 2024, Ноември
Anonim
Цифров часовник на Arduino с използване на машина с крайно състояние
Цифров часовник на Arduino с използване на машина с крайно състояние

Здравейте, ще ви покажа как може да се създаде дигитален часовник с инструментите на YAKINDU Statechart и да работи на Arduino, който използва щит за LCD клавиатура.

Оригиналният модел на цифровия часовник е взет от Дейвид Харел. Той е публикувал статия за

„[…] Широко разширяване на конвенционалния формализъм на машините на състоянието и диаграмите на състоянието.“

В тази статия той използва примера на цифровия часовник за своите изследвания. Използвах го като вдъхновение и възстанових часовника с YAKINDU Statechart Tools (инструмент за създаване на графични модели на състоятелни машини и генериране на C/C ++ код с него) и го върнах към живот на Arduino.

Консумативи

Хардуер:

  • Arduino Uno или Mega
  • Щит за LCD клавиатура

Софтуер:

  • Инструменти за диаграми на състоянието на YAKINDU
  • Eclipse C ++ IDE за Arduino

Стъпка 1: Как работи цифровият часовник

Image
Image

Нека започнем, като определим как трябва да работи цифровият часовник. Спомняте ли си тези… да кажем… „супер готини“цифрови часовници, които всички са имали през 90 -те? Интегриран хронометър, различни аларми и неговият досаден звуков сигнал на всеки цял час. Ако не, погледнете: цифров часовник от 90 -те.

Така че по принцип това е конфигурируем часовник с различни режими. Основно ще се показва текущото време, но има и някои други функции. Като вход, имате включване/изключване, режим и бутон за настройка. Освен това можете да включвате и изключвате светлината. С бутона за режим можете да правите разлика между режимите и да активирате/деактивирате функциите на часовника:

  • Показване на часа (Часовник)
  • Показване на датата (Date)
  • Задайте аларма (Аларма 1, Аларма 2)
  • Активиране/деактивиране на звънене (Set Chime)
  • Използвайте хронометъра (хронометър)

В менютата можете да използвате бутона за включване/изключване, за да конфигурирате режима. Бутонът за настройка ви позволява да настроите часа - напр. за часовника или алармите. Хронометърът може да се управлява - стартира и спира - с помощта на бутона за включване и изключване на светлината. Можете също да използвате интегриран брояч на обиколки

Освен това има звънец, който звъни на всеки цял час, и вградена контролируема подсветка. На първата стъпка не ги свързах към Arduino.

Стъпка 2: Държавната машина

Щит за LCD клавиатура
Щит за LCD клавиатура

Не искам да отивам много подробно за обяснението на този пример. Не защото е твърде сложно, просто е малко прекалено голямо. Ще се опитам да обясня основната идея за това как работи. Изпълнението трябва да се обяснява от само себе си, като погледнете модела или го изтеглите и симулирате. Някои части от машината на състоянието се сумират в подрегиони, като например зададената времева област. С това трябва да се гарантира четимостта на държавната машина.

Моделът е разделен на две части - графична и текстова. В текстовата част ще бъдат дефинирани събитията, променливите и т.н. В графичната част - диаграмата на състоянието - е посочено логическото изпълнение на модела. За да се създаде машина на състоянието, която отговаря на посоченото поведение, са необходими някои входни събития, които могат да се използват в модела: 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 -дневен пробен период. След това трябва да получите лиценз, който е безплатен за некомерсиална употреба!

Препоръчано: