Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 有限状态机对数字计数器建模_Arduino - Fatal编程技术网

Arduino 有限状态机对数字计数器建模

Arduino 有限状态机对数字计数器建模,arduino,Arduino,我必须用Arduino C中的enum和switch/case属性编码创建一个有限状态机FSM来创建一个数字计数器。我应该有16个州:0-7倒计时和7-0倒计时。每当用户单击键盘上的一个键时,计数就会反转。例如,它应该打印0,1,2,3,4,5,6,7,0,1,2,3,4,…,然后在按下一个键后,打印4,3,2,1,0,7,6,5。。。等等都是打印出来的。我完全卡住了,需要一些帮助。谢谢 我有一个代码的总体框架: enum State { 0; 1; 2; //

我必须用Arduino C中的enum和switch/case属性编码创建一个有限状态机FSM来创建一个数字计数器。我应该有16个州:0-7倒计时和7-0倒计时。每当用户单击键盘上的一个键时,计数就会反转。例如,它应该打印0,1,2,3,4,5,6,7,0,1,2,3,4,…,然后在按下一个键后,打印4,3,2,1,0,7,6,5。。。等等都是打印出来的。我完全卡住了,需要一些帮助。谢谢

我有一个代码的总体框架:

enum State {
    0;
    1;
    2;
    // 16 of these...
}

void setup() {
   Serial.begin(9600);
   Serial.println("FSM Forwards & Backwards");
}

void loop() {
    state = nextState(state);
    switch (state) {
       case 0:
       // more states(cases) here
       // create a FSM to determine the next state of the machine.
}

State nextState(State state){
    char input = Serial.read();
    // more states(cases) here
}

bool checkReverse(){
    // which reverses the direction of the counter if a key on the 
    keyboard has been pressed
}
对我来说好像是家庭作业。 ARDUNO使用的是实际的C++语言。它包含了许多不同的图书馆思想

您可能想要这样做,注意它的内部状态是由变量state和direction组成的。它将每秒更新自动机的状态。同时,它将扫描输入数据中的“r”字符并反转方向

struct FSM {
  enum state_t {
    step0,
    step1,
    ...
    step8,
    step9,
    ...
  };
  state_t state;
  bool direction;

  FSM() {state = step0;}
  void nextState(bool toggle) {
    state_t oldState = state;
    state_t ret;
    if(direction) {
      switch(oldState) {
        case step0:
          ret = step8;
          break;
        case step1:
          ret = step8;
          break;
        ...
      }
    else {
      case step0:
        ret = step1;
        break;
      case step1:
        ret = step2;
        break;
      ...
    }
    state = ret; // Update state
    direction = toggle ? !direction: direction; // Update toggle
  }
  int getOutput() {
    switch(state) {
      case step0:
        return 0;
      ...
      case 8:
        return 7;
      case 9:
        return 6;
      ...
};
FSM fsm;
bool toggle = false;
unsigned intlastTime;
void setup() {
        lastTime = millis();
}
void loop() {
        int c = Serial.read();
        if(c == 'r') toggle = ! toggle;

        bool timeToCount = false;
        if(lastTime + 1000 < millis()) { // Every second
                timeToCount = true;
                lastTime = millis();
                fsm.nextState(toggle); // 
                Serial.println(fsm.getOutput());
                toggle = false;
        }


}

状态=下一个状态状态;foward声明的函数原型在哪里?什么是国家?显示问题的位置在哪里?这个网站是关于具体的C代码问题,而不是我该怎么做?状态为枚举类型枚举状态C区分大小写。无论如何,Arduino不是C,但与之类似。状态是FSM的状态