Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

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

Компоненты и расходные материалы

Arduino UNO
Вы можете использовать любую Arduino, совместимую с LCD Shield. Я использовал Arduino Mega.
× 1
Экран ЖК-клавиатуры
× 1

Приложения и онлайн-сервисы

Инструменты диаграммы состояний YAKINDU
Бесплатно для некоммерческого использования.
Eclipse C ++ IDE для Arduino

Об этом проекте

Привет,

Я собираюсь показать вам, как можно создать цифровые часы с помощью 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-дневной пробной версии. После этого вы должны получить лицензию, которая бесплатна для некоммерческого использования . !


Производственный процесс

  1. Конечные автоматы
  2. Создание монитора Ambilight с помощью Arduino
  3. Цифровые игральные кости Arduino
  4. Ультразвуковой левитационный аппарат с использованием ARDUINO
  5. Вольтметр своими руками с использованием Arduino и смартфона
  6. Монитор сердечного ритма с использованием Интернета вещей
  7. WebServerBlink с использованием Arduino Uno WiFi
  8. Клон Arduino Tamagotchi - цифровой питомец
  9. Arduino Apple Watch
  10. Автоматизированная игра Дино с использованием arduino