电梯控制程序-状态机
首先我们得知道状态机思想是什么意思,我找到一篇csdn的帖子,大家可以去看看
(83条消息) 状态机简单介绍_Evan丶K的博客-CSDN博客_状态机的三个部分
状态 事件 动作
-
状态,包括状态机所有的状态
-
条件,又称为**“事件”**,当触发一定条件后,条件便会触发,用于状态的切换
-
动作,对应状态下会有不同的动作,或者没有动作
在电梯控制程序中,初步可以划分:
状态有:
停下,上升,下降,等待
条件有:
条件 | 含义 |
---|---|
Up_flag | 是否前往上方楼层 |
Down_flag | 是否前往下方楼层 |
动作有:
等待对应动作,输入需要前往的楼层,每次输入后如果超过5s,电梯启动。
停下对应的动作,电机停下,打开门
上升和下降对应的动作,电机启动,关闭门
状态转换:
其他功能:
1、电机,用于模拟电梯上升及下降
2、串口,用于上报电梯所处状态,监控
3、eeprom,当前楼层,当突然断电,重启后,仍然是上次断电时的楼层
状态机代码架构
enum status11{stop,up,down,wait} status;//停下,上升,下降,等待
status = write;
switch(status){
case wait:
//动作:
//通过按键控制,确认前往楼层
//如果按键按下5s后,没有按键再次按下就会进入下方判断,进行次态判断
//次态:
//如果有上方目标楼层,则次态为 向上运行 up
//如果只有下方目标楼层,则次态为 向下运行 down
//如果没有按键按下,一直等待!!! 次态为自己 wait
break;
case stop:
//动作:
//打开门,延时一会儿
//关门
//次态:
//如果上面还有目标楼层,次态为 up
//如果只有下面还有目标楼层,次态为 down
//如果上下都没有楼层了,次态为 wait
break;
case up:
//动作:
//运行一会后,当前楼层数加一
//次态:
//如果当前楼层是目标楼层,则次态为 停下 stop
//如果当前楼层不是目标楼层,次态为 上升 up
break;
case down:
//动作:
//运行一会后,当前楼层数减一
//次态:
//如果当前楼层是目标楼层,则次态为 停下 stop
//如果当前楼层不是目标楼层,次态为 下降 down
break;
}
关键函数:
char target[10];//目标楼层,多设置了一些,一共六楼,为1的代表目标楼层
char Now_num; //当前楼层
char up_judge(){ //判断是否向上,是向上,返回值为1,
char accu;
for(int i = 9 ; i>Now_num ; i--) accu += target[i];
if(accu > 0) return 1;
else return 0;
}
char down_judge(){ //判断是否向下,是向下,返回值为1,
char accu;
for(int i = 1 ; i<Now_num ; i++) accu += target[i];
if(accu > 0) return 1;
else return 0;
}
添加功能:(未添加)
这电梯是专门针对,乘客已经处于电梯中了,现在的楼层按键都是设置在电梯内部的,一般电梯实际上,在入口出还设置有两个按键,用来使乘客进入电梯。
我就立马想到,正好,我们这个指南者的板子上不是带了两个按键吗?正好可以用来作为进入电梯的按键。
具体来说:
一般情况下,得先按K1,K2两个按键,开门延时,门开延时,关门延时,使得乘客进入。
所以,编程思路是,按下K1,后播放乘客进入电梯的动画