首页 > 编程知识 正文

有限状态机的分类,状态机 java

时间:2023-05-04 19:33:05 阅读:137961 作者:3525

这个帖子最后由topdog在2021-3-24 06:32编辑

Arduino用按钮控制LED。 一个按钮的正确姿势如下图所示。

Button.jpg(181.3kb,下载次数: 0 ) )。

2021-3-23 23:38上传

当mgdls按下按钮时,按钮连接电路中的两个点,UNO引线引脚3的电平变化控制板上引脚13的LED的点亮或熄灭。

const int buttonPin=3;

const int ledPin=13;

int buttonState=0;

void setup () }

pinmode(ledpin,OUTPUT );

pinmode(Buttonpin,INPUT );

}

void loop () }

button state=digitalread (button pin;

if(buttonstate==high ) {

数字写入(led pin,HIGH );

} else {

数字写入(led pin,LOW );

}

}

但是,按钮是机械装置,通常会发生虚假或欺诈的状态转移,不除去抖动,按下一次按钮可能会产生意想不到的结果。 必须在短时间内检查两次,确认按钮确实被按下了。 下面的示例使用millis ) )函数记录按钮被按下后经过的时间。 这称为无阻塞方式(delay ) ),后者称为阻塞方式。

const int buttonPin=3;

const int ledPin=13;

int ledState=HIGH;

int buttonState;

int lastButtonState=LOW;

unsigned long lastDebounceTime=0;

unsigned long debounceDelay=50;

void setup () }

pinmode(Buttonpin,INPUT );

pinmode(ledpin,OUTPUT );

数字写入(led pin,ledState );

}

void loop () }

intreading=digitalread (button pin );

if (就绪!=lastButtonState ) {

lastDebounceTime=millis (;

}

if () millis (-lastdebouncetime (debouncedelay ) )

if (就绪!=buttonState ) {

buttonState=reading;

if(buttonstate==high ) {

ledState=! ledState;

}

}

}

数字写入(led pin,ledState );

lastButtonState=reading;

}

也就是说,考虑到防抖的基本需求,在控制中只需一个按钮就可以实现有限状态机(finite state machine,简称: FSM ),建议使用onebutton库。 以下示例是双击触发事件。

#include 'OneButton.h '

//简化写法

//onebuttonbutton(3;

#define BUTTON_PIN 3

//初始化为高电平

OneButton button=OneButton (

BUTTON_PIN,

false、

);

void setup () }

pinmode(13,输出;

button.attach double click (double click );

}

void loop () }

button.tick (;

延迟(10;

}

void doubleclick (

静态输入m=low;

m=! m;

数字写入(13,m );

}

实施详细信息:

如果你想知道这个库是如何工作的,这里有:的说明

OneButton库的tick ) )函数中,可以找到输入端子检查的单击、双击或长按情况的实现。 这个实现被称为有限状态机(FSM ),实现以下的状态图:

onebuttonfsm2.jpg(125.13kb,下载次数: 0 ) )。

2021-3-24 00:25上传

每次调用tick ) )函数时,都会显示当前状态,分析当前状态和输入值,并根据需要调用外部函数或更改当前状态。 OneButton库的实现通常会立即返回,因为它不会调用delay ()或类似的函数。 总之,OneButton库可以非常简单地实现有限状态机(FSM ),有助于降低实现的复杂度。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。