C/Arduino 和图中人员在房间计数器的 FSM

FSM for a people in room counter in C/Arduino and diagram

首先,如果这不是 post 这个问题的正确站点,请原谅我,但我不知道在哪里问这个问题。

我需要实现一个 FSM 来表示一个房间里的人数,有两种可能性,人们可以进入房间或​​离开房间。一开始保证空房间,一次只能进一个人

为了知道一个人是进入还是离开,有 2 个传感器 A 和 B,它们根据激活的顺序指示一个人是进入还是离开。 A then B表示有人进房间,B then A表示有人离开房间。

现在,我必须在 arduino 上实现它并制作 FSM 图,但我在弄清楚该图时遇到了问题,尽管我认为我已经正确地使用了 C 程序(尚未测试)

所以,基本上这是我的 C/Arduino 计划的一部分

int currentPeople = 0;
PeopleState currentState = None;
enum PeopleState {
 A,
 B,
 None
};

现在这两个函数会被各自的传感器调用

 //Gets called every time sensor A is activated
 void countPeopleA(){
    if (currentState == None){
       currentState = A;
    } else if (currentState == B){
       if(currentPeople > 0){
           currentPeople--;
       }
       currentState = None;
    }
 }
 //Gets called every time sensor B is activated
 void countPeopleB(){
     if (currentState == None){
         currentState = B;
     } else if (currentState == A){
         currentPeople++;
         currentState = None;
     }
 }

我的顾虑是:

Are the states I defined correct for the problem? I mean, defining a state for whenever a sensor is activated is right or should the states be Entering and Leaving?

我觉得你的状态很好。不要将他们的 名称 与他们 所代表的 混淆。您需要一种状态,表示传感器组合起来已被激活偶数次的情况(这也是初始状态),一种表示先前激活的奇数次,最后一次激活是 A,另一种表示奇数次先前激活的次数,最后一次激活是 B.

How can I diagram the states?

你有三种状态。为它们写下名称或标签,在它们周围画圈,并为不同传感器激活时发生的转换绘制带标签的箭头。 (另见下文。)

I'm just learning about FSM so I have problems figuring it out, like how can you guarantee that if the room is empty a person doesn't leave? I can check for that condition in code but I don't know how to represent it.

你不能用 有限 状态机表示该条件,除非你对房间设置了入住限制。 (上面的评论假设你不这样做,因此房间占用人数不是 FSM 状态的一部分。)如果你想走那条路,那么你需要一种不同的方法,每个占用人数都有不同的状态.由于这是一个介绍性练习,我倾向于认为这不是您想要做的。

另请注意,无论您是否对占用限制进行建模,有些转换您既没有明确禁止也没有指定行为。具体来说,如果从初始状态开始,两个传感器中的一个连续被触发两次,会发生什么情况?例如,想象一下,它们相距足够远,可以容纳一个人触发一个,然后在门口转身再次触发它。如果它们被允许(即使不允许),那么它们应该在您的图表中表示出来。无论是否允许,您的代码都应该考虑到它们。