首页 文章

Arduino操作启用/禁用开关或引脚

提问于
浏览
0

我的论文需要一些帮助 . 我完成了开关1,2和3的操作 .

如流程图所示,我需要禁用开关2和3,这样它就不会中断开关1的操作,也不会中断其他开关 . 然后我需要先打开开关1,然后在开关1操作结束后立即禁用开关1并启用开关2 .

启用开关2后,开关1和3应保持禁用状态,以便它不会中断开关2的操作,然后当开关2关闭时,应禁用它,然后启用开关3 .

启用开关3后,开关1和开关被禁用,因此我无法中断开关3的操作 . 关闭开关3后,它应该回到开始状态 .

我正在编写Arduino Mega 2560 .

enter image description here

这是我的代码

void loop() {
 // put your main code here, to run repeatedly:
 buttonState1 = digitalRead(buttonPin1);
 buttonState2 = digitalRead(buttonPin2);
 buttonState3 = digitalRead(buttonPin3);
if (buttonState1 == HIGH && buttonState2 == LOW && buttonState3 == LOW && counter == 1) {
plantMode();
} else if (buttonState1 == LOW && buttonState2 == HIGH && buttonState3 == LOW && counter == 2) {
maintenance();
} else if (buttonState1 == LOW && buttonState2 == LOW && buttonState3 == HIGH && counter == 3) {
harvestMode();
} else {
if (counter == 1) {
  lcd.setCursor(0, 0);
  lcd.print("   SWITCH  ON   ");
  lcd.setCursor(0, 1);
  lcd.print(" PLANTING  MODE ");
  digitalWrite(valve, HIGH);
  delay(500);
} else if (counter == 2) {
  lcd.setCursor(0, 0);
  lcd.print("   SWITCH  ON   ");
  lcd.setCursor(0, 1);
  lcd.print("MAINTENANCE MODE");
  digitalWrite(valve, HIGH);
  delay(500);
} else {
  lcd.setCursor(0, 0);
  lcd.print("   SWITCH  ON   ");
  lcd.setCursor(0, 1);
  lcd.print("  HARVEST MODE  ");
  digitalWrite(valve, HIGH);
  delay(500);
}
}
}

1 回答

  • 0

    制作一台状态机,每个按钮都有一个状态检查 .

    我没有编译代码,但我相信它会起作用 .

    int state = 1
    
    void loop() {
      switch(state){
        case 1:
          if (digitalRead(buttonPin1)){
            plantMode();
            state = 2;
          }
          break;
        case 2:
          if (digitalRead(buttonPin2)){
            maintenance();
            state = 3;
          }
          break;
        case 3:
          if (digitalRead(buttonPin2)){
            maintenance();
          }
          else{
            state = 4;
          }
          break;
        case 4:
          if (digitalRead(buttonPin3)){
            harvestMode();
            state = 5;
          }
          break;
        case 5:
        if (digitalRead(buttonPin2)){
            harvestMode();
          }
          else{
            state = 1;
          }
          break;
      }   
      else{
        lcdPrint(state);
        delay(500);
      }
    }
    
    void lcdPrint(int state){
        lcd.setCursor(0, 0);
        lcd.print("   SWITCH  ON   ");
        lcd.setCursor(0, 1);
        switch(state){
          case 1:
            lcd.print(" PLANTING  MODE ");
            break;
          case 2:
            lcd.print("MAINTENANCE MODE");
            break;
          case 3:
            lcd.print("  HARVEST MODE  ");
            break;
          default:
            lcd.print("  UNKOWN MODE  ");
        }
        digitalWrite(valve, HIGH);
    }
    

相关问题