проблема с несколькими переключателями на arduino uno - PullRequest
0 голосов
/ 19 апреля 2020

Я создал меню, используя корпус переключателя, поэтому, когда пользователь нажимает кнопку выбора, выполняется функция.

Проблема: одна из функций содержит другой корпус переключателя, в котором также используются кнопки, но когда я нажимаю кнопку Кнопки снова управляются только меню, а не функцией, т. е. она загружает функцию и первый случай, но при нажатии кнопки ничего не происходит.

Что я хочу сделать: я хочу, чтобы кнопки перестали управлять меню и управление переключателем в другой функции. Кнопки должны управлять меню, только когда вызывается функция меню (и то же самое для других соответствующих функций).

Я не уверен, как решить эту проблему, и не знаю, в чем проблема.

nb, пожалуйста, не предлагайте никаких дополнительных библиотек, кроме тех, которые я использовал, также функция отлично работает сама по себе вне меню, так что я знаю, что она работает. Я также новичок в программировании на C и использовании arduino.

nb Я также попытался использовать случай с вложенным переключателем безрезультатно :( (хотя я, возможно, поступил об этом неправильно) Я также могу использовать операторы if (или что-либо еще подходящее) (в крайнем случае), однако я бы предпочел использовать переключатели.

Я очень признателен за любую помощь, поскольку я в своем уме. : O

#include <Wire.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>
#include <EEPROM.h>

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();


//variables to decide which buttons are being used when
bool choosing;
bool playing;

//variables to select the users choices, 3 and 2 and the starting numbers displayed
int size_S=4;
int size_M=2;

uint8_t choice=1;
uint8_t oldButtons=0;

char buffer [12];

//function displaying the menu options
void SelectDisplay(int size_S, int size_M){
  lcd.setCursor(0,0);
  sprintf(buffer, "S:%02d M:%02d", size_S, size_M);
  lcd.print(buffer);
  lcd.setCursor (0,1);
  lcd.print((choice==1?"Choose S":"Choose M"));
}

//variables to store user's choice
int choice_S;
int choice_M;

//!!THIS IS THE FUNCTION THAT DOESN'T WORK INSIDE THE MENU
//function for user to select options S and M
int Select(int choice_S, int choice_M){

  uint8_t buttons, changes;

  buttons = lcd.readButtons ();
  changes = oldButtons & (~buttons);

  if (playing==true){

    //calling the menu disply function
    SelectDisplay (size_S,size_M);

      switch (choice){
        case 1: //case S
          if (changes & BUTTON_UP){
            size_S = (size_S == 10 ? 4:size_S+1);
          }else if (changes & BUTTON_DOWN){
            size_S = (size_S == 4 ? 10:size_S-1);
          }else if (changes & BUTTON_RIGHT){
            choice= 2;
          }
          break;
        case 2: //case M
          if (changes & BUTTON_UP){
            size_M = (size_M == 4 ? 2:size_M+1);
          }else if (changes & BUTTON_DOWN){
            size_M = (size_M == 2 ? 4:size_M-1);
          }else if (changes & BUTTON_LEFT){
            choice = 1;
          }
          break;
      }

     if (changes & BUTTON_SELECT){
        choice_S=size_S;
        choice_M=size_M; 
      }

  }
    oldButtons=buttons; 
}

//variable to change the menu page and options
int menu=1;
//function displaying what the menu options
void displayMenu(){

    switch(menu){
      case 0:
        menu=1;
        break;
      case 1:
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(">Play");
        lcd.setCursor(0,1);
        lcd.print(" Characters");
        break;
      case 2:
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print(" Play");
        lcd.setCursor(0,1);
        lcd.print(">Characters");
        break;
      case 3:
        break;
        //etc..
    }
}

//function for carrying out the user's menu selection
void menuAction (){

    switch (menu){
      case 1://play
        Select(choice_S, choice_M); //!!HERE IS WHERE THE FUNCTION I WANT TO WORK IS CALLED
        break;
      case 2:       
        break;
      case 3:
        break;
      //etc..
    } 
}

//function for navigating the menu
void mainMenu(){
  int navigate = lcd.readButtons ();

  if (playing==true){
    choosing=false;
  }else{
    choosing=true;
  }

  if(choosing==true){

    //if statement to navigate the menu
    if (BUTTON_DOWN & navigate){
      menu++;
      displayMenu();
      delay(200);
    }
    if (BUTTON_UP & navigate){
      menu--;
      displayMenu();
      delay(200);
    }
    if (BUTTON_SELECT & navigate){
      playing=true;
      menuAction();
      delay(200);
    }
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  lcd.begin(16,2);
  displayMenu();
  choice=1;
  choosing=true;
}

void loop() {
  // put your main code here, to run repeatedly:

  mainMenu();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...