Оператор switch. В чем причина некорректной работы?

Тема в разделе "Arduino & Shields", создана пользователем РоманИ, 10 янв 2017.

  1. РоманИ

    РоманИ Нерд

    Доброго времени суток уважаемые форумчане!
    Зациклился на некорректной работе оператора switch. Сначала все выполнялось, в ходе усложнения скетча что-то пошло не так. Откат назад не помог. Новое написание упрощенного варианта тоже не помогло. уже видно глаз замылился день потратил. готов впасть в отчаяние:(.

    Смысл скетча такой. При нажатии кнопки set(1) переходим к выполнению функции setmode.
    опрашиваем кнопки право влево итд. И так пока не нажмем кнопку set (1),тогда выходим из функции.

    Однако при переходе в функцию, независимо от нажатия кнопки set(1) срабатывает оператор while и выводит из функции setmode хотя не должен. Где я упустил чего?

    Благодарю заранее. С уважением Роман.

    Код (C++):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    //const int stepsPerRevolution = 2000;  //Stepper myStepper(200, 13, 12);

    boolean valset=false;

    void setup() {
     
      lcd.begin(16, 2);
     
      analogWrite(10,140);

      // set the speed at 60 rpm:  myStepper.setSpeed(200);
      // initialize the serial port:
      Serial.begin(9600);
    }
    byte key(){//1-719,2-480,3-130,4-306, 5-0
      int val=analogRead(0);
      if  (val<50) return 5;
      else if (val<150) return 3;
      else if (val<350) return 4;
      else if (val<500) return 2;
      else if (val<800) return 1;
      else if (val<1023) return 0;
      }


    void loop() {
     
      lcd.clear();
      lcd.setCursor(0, 0);
        lcd.print("analogRead ");
      lcd.print(analogRead(0));
    lcd.setCursor(0,1);
    switch (key()) {
     
    case 1:
    //lcd.print("set");
    setmode(true);//переход в фуекцию "setmode"
    break;
    case 2:
    lcd.print("left");
    break;
    case 3:
    lcd.print("up");
    break;
    case 4:
    lcd.print("down");
    delay(500);
    break;
    case 5:
    lcd.print("right");
    break;
    }
     
      delay (250);
    }
    void setmode(boolean valset)//собственно сама функция
    {
      do // пока переменная валсет истинна, печатаем z-axe и опрашиваем кнопки
      {
      lcd.setCursor(0,1);
      lcd.print("set Z-axe");

      switch(key())// опрос кнопок
      {
        case 1:// если нажата кнопка "set", меняем переменную valset на false
        lcd.setCursor(10,1);
      lcd.print("knob 1");
      delay(1000);
        valset=false;
           break;
        case 2:// если нажата 2, печатаем на экране кнопка 2
        lcd.setCursor(10,1);
        lcd.print("knob 2");
        delay(1000);
        break;
       }//скобка свитча
      }while(valset==true);
      lcd.print("close");
      delay(1000);
      }
     
  2. Unixon

    Unixon Оракул Модератор

    Вы не ждете, пока кнопка 1 отожмется, в результате у вас в одно нажатие все проскакивает.
     
    9xA59kK и Tomasina нравится это.