0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用YAKINDU Statechart Tools创建数字手表

科技观察员 来源:Robin Herrmann 作者:Robin Herrmann 2022-08-18 16:03 次阅读

为 16x2 LCD Keypad Shield 使用 YAKINDU 状态图工具创建数字手表。

我将向您展示如何使用YAKINDU Statechart Tools创建数字手表并在使用 LCD Keypad Shield 的 Arduino 上运行。

数字手表的原始模型取自大卫哈雷尔。他之前发表过一篇关于“状态机和状态图的传统形式的广泛扩展”的论文。在论文中,他以数字手表为例进行了研究。我以此为灵感,使用YAKINDU Statechart Tools (一种用于创建状态机图形模型并使用它生成 C/C++ 代码的工具)重建了手表,并在 Arduino 上让它重新焕发生机。

数字手表的工作原理

让我们从定义数字手表应该如何工作开始。

基本上,它是一个具有不同模式的可配置手表。主要是显示当前时间,但还有一些其他功能。作为输入,您有一个开/关、一个模式和一个设置按钮。此外,还可以打开和关闭灯。

使用模式按钮,您可以区分模式并激活/禁用时钟功能:

显示时间(时钟)

显示日期(日期)

设置闹钟(闹钟 1、闹钟 2)

启用/禁用铃声(设置铃声)

使用秒表(秒表)

在菜单中,您可以使用开/关按钮来配置模式。设置按钮允许您设置时间 - 例如时钟或闹钟。秒表可以通过使用开灯和关灯按钮来控制 - 启动和停止。您还可以使用集成的计圈器。

此外,还有一个钟声,每时每刻都在响起,并且集成了一个可控的背光。不过在第一步,我没有将它们连接到 Arduino。

状态机

poYBAGL98dGAbCURAAHXWlSlR2I169.png

我不想详细解释这个例子。这不是因为它太复杂,它只是有点太大了。不过我会尝试解释它具体如何工作的基本思想。通过查看模型或下载模拟它。状态机的某些部分在子区域中汇总,例如设置的时间区域。这样就可以确保状态机的可读性。

该模型共分为两部分 - 图形和文本。

在文本部分,将定义事件、变量等。

在图形部分 - 状态图 - 指定了模型的逻辑执行。

要创建满足指定行为的状态机,需要一些输入事件,这些事件可以在模型中使用:onoff 、set 、mode 、light和light_r。在定义部分中使用了一个内部事件,它每 100 毫秒递增一次时间值:

every 100 ms / time += 1

基于 100 毫秒步长,当前时间将以HH:MM:SS格式计算:

display.first = (time / 36000) % 24;
display.second = (time / 600) % 60;
display.third = (time / 10) % 60;

每次调用状态机时,这些值将通过使用updateLCD操作连接到 LCD 显示器:

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

状态机的基本执行已在“数字手表的工作原理”部分中定义。在该工具中,我使用了一些“特殊”建模元素,如CompositeState 、History 、Sub-Diagrams 、ExitNodes等。

LCD 键盘屏蔽
LCD Keypad Shield 对于需要一个可视化屏幕和一些按钮作为输入的简单项目来说非常酷 - 一个典型的简单 HMI(人机界面)。LCD Keypad Shield 包含五个用户按钮和一个用于重置的按钮。五个按钮一起连接到 Arduino 的 A0 引脚。它们中的每一个都连接到一个分压器,可以区分按钮。

您可以使用analogRead(0) 来查找特定值,这当然可能因制造商而异。这个简单的项目在 LCD 上显示当前值:

#include
#include

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.write("Measured Value");
}

void loop() {
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(analogRead(0));
delay(200);
}

这些是我的测量结果:

无:1023

选择:640

左:411

下降:257

上:100

右:0

poYBAGL98dqAC3pYAAVKAnDIS8U703.png

使用这些阈值可以读取按钮:

#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 RIGHT;
}
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 的键连接起来。我已经展示了如何读取按钮,但是为了将它们连接到状态机,需要对按钮进行去抖动。否则事件将被多次引发,从而导致不可预测的行为。软件去抖动的概念并不新鲜。

在我的实现中,我检测到下降沿(释放按钮)。我读取按钮的值,等待 80 毫秒,保存结果并读取新值。如果oldResult不是NONE (未按下)并且新结果是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;
}
default: {
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++)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4411

    浏览量

    167052
  • 手表
    +关注

    关注

    1

    文章

    139

    浏览量

    24630
  • Arduino
    +关注

    关注

    187

    文章

    6463

    浏览量

    186621
收藏 人收藏

    评论

    相关推荐

    ImageCraft MSP430 ANSI C Tools

    ImageCraft MSP430 ANSI C Tools ImageCraft MSP430 ANSI C Tools
    发表于 03-25 14:00 34次下载

    ImageCraft HC16 ANSI C Tools

    ImageCraft HC16 ANSI C Tools
    发表于 03-25 14:06 20次下载

    ImageCraft AVR ANSI C Tools

    ImageCraft AVR ANSI C Tools
    发表于 03-25 14:20 45次下载

    Motorola Phone Tools快速入门

    安装之前 Motorola Phone Tools屏幕快照本指南中的屏幕快照基于在Windows XP环境下使用Motorola Phone Tools。在其它Windows操作系统下运行此应用程序时,屏幕内容可能会有变化。这并不
    发表于 07-17 15:27 5次下载

    4小时数字手表电路

    4小时数字手表电路
    发表于 01-13 19:47 1245次阅读
    4小时<b class='flag-5'>数字</b><b class='flag-5'>手表</b>电路

    什么是Data Mining Tools

    什么是Data Mining Tools  英文缩写: Data Mining Tools 中文译名: 数据挖掘工具 分  类: IP与多媒体 解  释: 通
    发表于 02-22 17:34 1013次阅读

    Express-tools使用详解

    电子专业单片机相关知识学习教材资料——Express-tools使用详解
    发表于 08-23 15:55 0次下载

    avr-tools资料

    avr-tools资料
    发表于 09-21 12:35 5次下载
    avr-<b class='flag-5'>tools</b>资料

    LabVIEW网络讲坛第三季:介绍Statechart状态图的特点与原理(1)

    LabVIEW 8.5 推出了全新的Statechart状态图模块,让工程师们能够以最直观的方式实现程序的架构,本集主要侧重介绍Statechart的原理与特点,以及在LabVIEW中如何予以实现。
    的头像 发表于 06-25 03:06 3456次阅读
    LabVIEW网络讲坛第三季:介绍<b class='flag-5'>Statechart</b>状态图的特点与原理(1)

    介绍 LabVIEW 状态图及Statechart与状态机的区别的区别

    本集中,工程师将通过几个实际程序案例为您展示Statechart与状态机的区别,以及在并发、包含及历史保存这三部分中,Statechart是如何只是通过直观的设计方式就能帮助您轻松完成的。
    的头像 发表于 06-14 04:19 9365次阅读
    介绍 LabVIEW 状态图及<b class='flag-5'>Statechart</b>与状态机的区别的区别

    PCB技术:异形敷铜的创建

    执行菜单命令“Tools-Convert-Create Polygon From selected Primitives”,即可创建一个圆形的敷铜。
    的头像 发表于 10-12 09:38 4154次阅读
    PCB技术:异形敷铜的<b class='flag-5'>创建</b>

    液晶数字手表使用.原理及维修

    液晶数字手表使用.原理及维修讲解。
    发表于 03-23 13:57 16次下载
    液晶<b class='flag-5'>数字</b><b class='flag-5'>手表</b>使用.原理及维修

    xiami-tools虾米工具包

    ./oschina_soft/xiami-tools.zip
    发表于 06-01 10:46 1次下载
    xiami-<b class='flag-5'>tools</b>虾米工具包

    MCU ISP Tools安装程序

    MCU ISP Tools安装程序
    发表于 07-08 10:22 25次下载

    NVIDIA Texture Tools Exporter如何加速Texture Tools 3.0压缩器技术

    借助 NVIDIA Texture Tools Exporter,用户可以使用 NVIDIA 的 CUDA 加速 Texture Tools 3.0 压缩器技术,直接从图像源创建高度压缩的纹理文件(在磁盘和内存中占用空间较小)。
    的头像 发表于 10-14 09:57 1599次阅读