Цифровые часы на Arduino с использованием конечного автомата
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
| ||||
|
Об этом проекте
Привет,
Я собираюсь показать вам, как можно создать цифровые часы с помощью YAKINDU Statechart Tools и запустить их на Arduino, который использует экран LCD Keypad Shield.
Оригинальная модель цифровых часов была взята у Дэвида Харела. Он опубликовал статью о «широком расширении традиционного формализма конечных автоматов и диаграмм состояний».
В этой статье он использовал пример цифровых часов для своего исследования. Я использовал его как источник вдохновения и перестроил часы с помощью YAKINDU Statechart Tools (инструмент для создания графических моделей конечных автоматов и генерации кода C / C ++ с их помощью) и вернул их к жизни на Arduino.
Как работают цифровые часы
Начнем с определения того, как должны работать цифровые часы. Вы помните эти ... скажем так ... "ультра крутые" цифровые часы, которые были у всех в 90-х? Встроенный секундомер, различные будильники и раздражающий звуковой сигнал каждый полный час. Если нет, обратите внимание:цифровые часы 90-х.
По сути, это настраиваемые часы с разными режимами. В основном будет отображаться текущее время, но есть и другие особенности. В качестве ввода у вас есть вкл / выкл , режим и набор кнопка. Кроме того, вы можете включать и выключать свет.
В режиме Кнопка позволяет различать режимы и включать / отключать функции часов:
- Отображение времени (Часы)
- Показать дату (Дата)
- Установите будильник (Будильник 1, Будильник 2)
- Включение / отключение звукового сигнала (Установить звуковой сигнал)
- Используйте секундомер (Stop Watch)
В меню вы можете использовать вкл / выкл кнопку для настройки режима. набор кнопка позволяет вам установить время - например, для часов или будильника. Секундомером можно управлять - запускать и останавливать - с помощью кнопки включения и выключения света. Вы также можете использовать встроенный счетчик кругов.
Кроме того, есть звонок, который звонит каждый раз, и интегрированная управляемая подсветка. На первом этапе я не подключал их к Arduino.
Конечный автомат
Я не хочу вдаваться в подробности объяснения этого примера. Это не потому, что он слишком сложный, он просто немного великоват. Я постараюсь объяснить основную идею того, как это работает. Выполнение должно быть самоочевидным, если взглянуть на модель или загрузить и смоделировать ее. Некоторые части конечного автомата суммируются в субрегионах, например, установленное время . область. Этим должна быть обеспечена читаемость конечного автомата.
Модель разделена на две части - графическую и текстовую. В текстовой части будут определены события, переменные и т. Д. В графической части - диаграмме состояний - указано логическое выполнение модели. Чтобы создать конечный автомат, который выполняет указанное поведение, требуются некоторые входные события, которые можно использовать в модели: onoff , установить , режим , свет и light_r. В разделе определения используется внутреннее событие, которое увеличивает значение времени каждые 100 мс:
каждые 100 мс / раз + =1
На основе шагов 100 мс текущее время будет рассчитано в формате ЧЧ:ММ:СС формат:
display.first =(time / 36000)% 24;
display.second =(time / 600)% 60;
display.third =(time / 10)% 60;
Значения будут подключены к ЖК-дисплею с помощью операции updateLCD . каждый раз будет вызываться конечный автомат:
display.updateLCD (display.first, display.second, display.third, display.text)
Базовое выполнение конечного автомата уже определено в разделе Как работают цифровые часы . . В этом инструменте я использовал некоторые "специальные" элементы моделирования, такие как CompositeState , История , Поддиаграммы , Узлы выхода, и т. д. Подробное описание можно найти в Руководстве пользователя.
Экран ЖК-клавиатуры
Экран LCD Keypad Shield очень хорош для простых проектов, требующих экрана для визуализации и некоторых кнопок в качестве ввода - типичного простого HMI (человеко-машинного интерфейса). Экран ЖК-клавиатуры содержит пять пользовательских кнопок и еще одну для сброса. Все пять кнопок подключены к контакту A0 Arduino. Каждый из них подключен к делителю напряжения, что позволяет различать кнопки.
Вы можете использовать analogRead (0), чтобы найти конкретные значения, которые, конечно, могут отличаться в зависимости от производителя. Этот простой проект отображает текущее значение на ЖК-дисплее:
#include
#include
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;
result =analogRead (0);
if (result <50) {
return ВПРАВО;
}
if (result <150) {
return UP;
}
if (result <300) {
return DOWN;
}
if (result <550) {
return LEFT;
}
if (result <850) {
return SELECT;
}
return NONE;
}
Взаимодействие с конечным автоматом
Сгенерированный код C ++ конечного автомата предоставляет интерфейсы, которые должны быть реализованы для управления конечным автоматом. Первый шаг - это соединение событий in с клавишами Keypad Shield. Я уже показал, как читать кнопки, но для их взаимодействия с конечным автоматом требуется отключение кнопок - в противном случае события будут возникать несколько раз, что приведет к непредсказуемому поведению. Концепция устранения неполадок программного обеспечения не нова. Вы можете ознакомиться с документацией Arduino.
В моей реализации я обнаруживаю спад (отпускание кнопки). Я читаю значение кнопки, жду 80 мс (лучше с 80 вместо 50), сохраняю результат и читаю новое значение. Если oldResult не было NONE (не нажата), и новый результат - НЕТ , Я знаю, что кнопка была нажата раньше, а теперь отпущена. Затем я вызываю соответствующее событие ввода конечного автомата.
int oldState =NONE;
static void raiseEvents () {
int buttonPressed =readButton ();
delay (80);
oldState =buttonPressed;
if (oldState! =NONE &&readButton () ==NONE) {
switch (oldState) {
case SELECT:{
stateMachine-> getSCI_Button () -> raise_mode ();
break;
}
case LEFT:{
stateMachine-> getSCI_Button () -> raise_set ();
break;
}
case DOWN:{
stateMachine-> getSCI_Button () -> raise_light ();
break;
}
case UP:{
stateMachine-> getSCI_Button () -> raise_light_r ();
break;
}
case RIGHT:{
stateMachine-> getSCI_Button () -> raise_onoff ();
break;
}
по умолчанию:{
break;
}
}
}
}
Соединяем все вместе
Основная программа состоит из трех частей:
- Конечный автомат
- Таймер
- Обработчик дисплея (типичный lcd.print (...))
DigitalWatch * stateMachine =new DigitalWatch ();
CPPTimerInterface * timer_sct =new CPPTimerInterface ();
DisplayHandler * displayHandler =new 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 ();
}
Получить пример
Вот и все. Я, наверное, не упомянул все детали реализации, но вы можете посмотреть пример или оставить комментарий.
Добавьте пример в работающую среду IDE с помощью:
Файл -> Создать -> Пример -> Примеры диаграмм состояний YAKINDU -> Далее -> Arduino - Цифровые часы (C ++)
>> Вы можете скачать IDE здесь <<
Вы можете начать с 30-дневной пробной версии. После этого вы должны получить лицензию, которая бесплатна для некоммерческого использования . !
Производственный процесс
- Конечные автоматы
- Создание монитора Ambilight с помощью Arduino
- Цифровые игральные кости Arduino
- Ультразвуковой левитационный аппарат с использованием ARDUINO
- Вольтметр своими руками с использованием Arduino и смартфона
- Монитор сердечного ритма с использованием Интернета вещей
- WebServerBlink с использованием Arduino Uno WiFi
- Клон Arduino Tamagotchi - цифровой питомец
- Arduino Apple Watch
- Автоматизированная игра Дино с использованием arduino