Оглавление:

Цифровые часы на Arduino с использованием конечного автомата: 6 шагов
Цифровые часы на Arduino с использованием конечного автомата: 6 шагов

Видео: Цифровые часы на Arduino с использованием конечного автомата: 6 шагов

Видео: Цифровые часы на Arduino с использованием конечного автомата: 6 шагов
Видео: Всё про WS2812b - самая подробная инструкция (подключение, настройка, прошивка для Ардуино) 2024, Ноябрь
Anonim
Цифровые часы на Arduino с использованием конечного автомата
Цифровые часы на Arduino с использованием конечного автомата

Привет, я собираюсь показать вам, как можно создать цифровые часы с помощью YAKINDU Statechart Tools и запустить на Arduino, который использует экран LCD Keypad Shield.

Оригинальная модель цифровых часов была взята у Дэвида Харела. Он опубликовал статью о

«[…] Широкое расширение обычного формализма конечных автоматов и диаграмм состояний».

В этой статье он использовал для своего исследования пример цифровых часов. Я использовал его как источник вдохновения и перестроил часы с помощью YAKINDU Statechart Tools (инструмент для создания графических моделей конечных автоматов и генерации кода C / C ++ с их помощью) и вернул их к жизни на Arduino.

Запасы

Аппаратное обеспечение:

  • Arduino Uno или Mega
  • Экран ЖК-клавиатуры

Программное обеспечение:

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

Шаг 1. Как работают цифровые часы

Image
Image

Начнем с определения того, как должны работать цифровые часы. Вы помните эти… скажем так… «ультра крутые» цифровые часы, которые были у всех в 90-х? Встроенный секундомер, различные будильники и раздражающий звуковой сигнал каждый полный час. Если нет, взгляните: цифровые часы 90-х годов.

По сути, это настраиваемые часы с разными режимами. В основном будет отображаться текущее время, но есть и другие особенности. В качестве входных данных у вас есть кнопка включения / выключения, режима и кнопки настройки. Дополнительно вы можете включать и выключать свет. С помощью кнопки режима вы можете различать режимы и включать / отключать функции часов:

  • Отображение времени (Часы)
  • Отображение даты (Дата)
  • Установите будильник (Будильник 1, Будильник 2)
  • Включение / отключение звонка (Установить звонок)
  • Используйте секундомер (Stop Watch)

В меню вы можете использовать кнопку включения / выключения для настройки режима. Кнопка установки позволяет вам установить время - например, для часов или будильника. Секундомером можно управлять - запускать и останавливать - с помощью кнопки включения и выключения света. Вы также можете использовать встроенный счетчик кругов.

Кроме того, есть звонок, который звонит каждый полный час, и встроенная управляемая подсветка. На первом этапе я не подключал их к Arduino.

Шаг 2: конечный автомат

Экран ЖК-клавиатуры
Экран ЖК-клавиатуры

Я не хочу вдаваться в подробности объяснения этого примера. Это не потому, что он слишком сложен, он просто слишком велик. Я постараюсь объяснить основную идею того, как это работает. Выполнение должно быть самоочевидным, если взглянуть на модель или загрузить и смоделировать ее. Некоторые части конечного автомата суммируются в субрегионах, например, в заданном временном диапазоне. При этом должна быть обеспечена читаемость конечного автомата.

Модель разделена на две части - графическую и текстовую. В текстовой части будут определены события, переменные и т. Д. В графической части - диаграмме состояний - указано логическое выполнение модели. Чтобы создать конечный автомат, который выполняет указанное поведение, требуются некоторые входные события, которые можно использовать в модели: onoff, set, mode, light и light_r. В разделе определения используется внутреннее событие, которое увеличивает значение времени каждые 100 мс:

каждые 100 мс / раз + = 1

На основе шагов 100 мс текущее время будет рассчитано в формате ЧЧ: ММ: СС:

display.first = (время / 36000)% 24;

display.second = (время / 600)% 60; display.third = (время / 10)% 60;

Значения будут подключены к ЖК-дисплею с помощью ЖК-дисплея операции update каждый раз, когда будет вызван конечный автомат:

display.updateLCD (display.first, display.second, display.third, display.text)

Базовое выполнение конечного автомата уже определено в разделе «Как работают цифровые часы». В этом инструменте я использовал некоторые «специальные» элементы моделирования, такие как CompositeState, History, Sub-Diagrams, ExitNodes и т. Д. Подробное описание можно найти в Руководстве пользователя.

Шаг 3: Экран ЖК-клавиатуры

Экран LCD Keypad Shield довольно хорош для простых проектов, требующих экрана для визуализации и некоторых кнопок в качестве ввода - типичного простого HMI (человеко-машинного интерфейса). Экран ЖК-клавиатуры содержит пять пользовательских кнопок и еще одну для сброса. Все пять кнопок подключены к контакту A0 Arduino. Каждый из них подключен к делителю напряжения, что позволяет различать кнопки.

Вы можете использовать analogRead (0), чтобы найти конкретные значения, которые, конечно, могут отличаться в зависимости от производителя. Этот простой проект отображает текущее значение на ЖК-дисплее:

#include "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 # определить SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; результат = analogRead (0); если (результат <50) {вернуть ВПРАВО; } если (результат <150) {вернуть ВВЕРХ; } если (результат <300) {вернуть ВНИЗ; } если (результат <550) {return LEFT; } если (результат <850) {return SELECT; } return NONE; }

Шаг 4: взаимодействие с конечным автоматом

Взаимодействие с конечным автоматом
Взаимодействие с конечным автоматом

Сгенерированный код C ++ конечного автомата предоставляет интерфейсы, которые должны быть реализованы для управления конечным автоматом. Первый шаг - это соединение событий in с клавишами Keypad Shield. Я уже показал, как читать кнопки, но для их взаимодействия с конечным автоматом требуется отключение кнопок - в противном случае события будут возникать несколько раз, что приведет к непредсказуемому поведению. Концепция противодействия программному обеспечению не нова. Вы можете посмотреть документацию Arduino.

В своей реализации я обнаруживаю спад (отпускание кнопки). Я читаю значение кнопки, жду 80 мс (лучше с 80 вместо 50), сохраняю результат и читаю новое значение. Если oldResult не был NONE (не нажат), а новый результат - NONE, я знаю, что кнопка была нажата раньше, а теперь отпущена. Затем я вызываю соответствующее событие ввода конечного автомата.

int oldState = NONE; static void raiseEvents () {int buttonPressed = readButton (); задержка (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {переключатель (oldState) {case SELECT: {stateMachine-> getSCI_Button () -> raise_mode (); перерыв; } case LEFT: {stateMachine-> getSCI_Button () -> raise_set (); перерыв; } case DOWN: {stateMachine-> getSCI_Button () -> raise_light (); перерыв; } case UP: {stateMachine-> getSCI_Button () -> raise_light_r (); перерыв; } case RIGHT: {stateMachine-> getSCI_Button () -> raise_onoff (); перерыв; } по умолчанию: {перерыв; }}}}

Шаг 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-> ввод (); }Цикл выполняет три функции:

  • Поднять входные события
  • Рассчитайте прошедшее время и обновите таймер
  • Вызов конечного автомата

long current_time = 0; длинный last_cycle_time = 0; void loop () {raiseEvents (); last_cycle_time = текущее_время; current_time = миллис (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Шаг 6. Получите пример

Вот и все. Я, наверное, не упомянул все детали реализации, но вы можете посмотреть пример или оставить комментарий.

Добавьте пример в работающую среду IDE с помощью: Файл -> Создать -> Пример -> Примеры диаграмм состояний YAKINDU -> Далее -> Arduino - Цифровые часы (C ++)

> Вы можете скачать IDE здесь <<

Вы можете начать с 30-дневной пробной версии. После этого вы должны получить лицензию, которая бесплатна для некоммерческого использования!

Рекомендуемые: