Используя переключатель, чтобы выбрать случай с кнопкой - переключить - PullRequest
0 голосов
/ 02 января 2019

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

Я хочу увеличить счетчик с помощью кнопки, используя функцию x ++ и некоторый сохраненный мной код переключения, который должен использоваться в операторе switch (case) для созданияжелаемых результатов в конкретном случае, включив выходной контакт при выборе случая и выключить, когда случай больше не действителен.Каждый случай будет иметь свой собственный выходной контакт с определенным циклом, который будет выполняться, когда этот случай станет действительным.Я могу записать выходные циклы, как только включу режим переключения.В коде есть некоторые недостающие фрагменты.У меня нет опыта формального кодирования, и я немного научился здесь и там.Я начал с моей основной доски для домашних заданий и переключился с BS2 на Arduino.Моя цель - собрать нужные мне коды для базовых проектов и сохранить их.Тогда я могу по-настоящему покончить с базовым кодированием и сосредоточиться на подключении аппаратного обеспечения и точной настройке аппаратного обеспечения: программного обеспечения.

Не совсем уверен, как использовать эту функцию переключателя.Хотите знать, если мне нужно где-то там оператор FOR для увеличения моего счетчика.Думал, что смогу увеличить счетчик каждый раз, когда значение toggle1 меняется или что-то в этом роде.Другой вариант - использовать переключатель (регистр) по модулю, переключая значения регистров нажатием кнопки определенное количество раз.1 нажатие - это случай 1, 2 нажатие - случай 2, 3 нажатие - случай 3 и т. Д. Случай 0 может быть 5 нажатий и быть последним циклом с использованием оператора ++ x.Случай переключения с использованием кнопок и ++ должен быть очень простым делом.У меня очень мало опыта в программировании.Хотелось бы немного руководства.Я надеюсь, что суть моей идеи все в коде.Спасибо.

const int btn = 22;
const int led = 3;
int selector1 = i;
int btnValue = digitalRead(btn);
int i = 0;


bool isPressed = false;


if (btnValue == LOW && isPressed == false){
    i = i++;

    if (i > 3){
        i = 0;
    }
}

{
    switch(case){

        case 1:

        selector1 == 0;
        do digitalWrite(led, HIGH);
        Serial.println(digitalRead(23));
        break;

        case 2:

        selector1 == 1;
        do digitalWrite(13, HIGH);
        Serial.println(digitalRead(13));
        break;

        case 3:

        selector1 == 2; 

        do digitalWrite(4, HIGH);
        Serial.println(digitalRead(4));
        break;

        case 4:

        selector1 == 3

        do digitalWrite(5, HIGH);
        Serial.println("You've reached the last selection.");
        Serial.println(digitalRead(5));
    }
}

1 Ответ

0 голосов
/ 02 января 2019

Какой у вас вопрос?Держите это коротким и простым;) Кроме того, вы пробовали Google? Это - первый удар с использованием 'Arduino switch'.Есть даже примеры ( one two ), встроенные в IDE Arduino.Поиск и попытка научат вас лучше, чем спрашивать.На самом деле, попробовать вещи - много.Когда вы сталкиваетесь с чем-то новым, например оператором switch, загрузите очень простой набросок в arduino и просто протестируйте его.

С учетом вышесказанного, основная проблема здесь заключается в том, что ваш код очень неполный.Это тестовый код, или вы просто скопировали некоторые вещи, чтобы передать свою идею?Потому что из-за этого кода очень сложно помочь вам ясным и конкретным способом.Вы также вновь представили проблему нажатия кнопки из вашего предыдущего вопроса (который все еще открыт).

Для вашего назидания я перечислю пару или проблемы, а также предоставлю исправленный код ниже

i++; достаточно для увеличения i

switch(case) должно быть switch(i)

удалить 'do' из do digitalWrite()

selector1 == 1;ничего не делает.

нет основного цикла

int selector1 = i; это инициирование переменной с переменной, которая еще не существует.Это передача по значению, а не ссылка на i, поэтому ваш текущий код selector1 никогда не изменится.

int btnValue = digitalRead(btn); аналогично, это одноразовое задание, оно никогда не меняется

digitalWrite(13, HIGH); Serial.println(digitalRead(13)); Это странно, хотя, к моему удивлению, это невозможно.Что ты здесь пытаешься сделать?Потому что это не имеет смысла для меня.

Исправленный код:

const int btn = 22;
const int led = 3;
int selector = 0;
boolean isPressed = false; 

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT_PULLUP);
  pinMode(led, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop ()
{
  if (digitalRead(btn) == LOW && isPressed == false ) //button is pressed AND this is the first digitalRead() that the button is pressed
  {
    isPressed = true;  //set to true, so this code will not run again until button released
    doSwitchStatement(); // a call to a separate function that performs the switch statement and subsequent evoked code

    selector++; // this is done after the doSwitchStatement(), so case 0 will be executed on the first button press 
    if (selector > 3) {
      selector = 0;
    }
    // selector = (selector+1) % 4;  // does the same, without if-statement
  } else if (digitalRead(btn) == HIGH)
  {
    isPressed = false; //button is released, variable reset
  }
}

void doSwitchStatement() {
  switch(selector) {
  case 0:
    digitalWrite(led, HIGH);
    Serial.println("Case 0");
    // add a call to doExtraStuff() if you like
    break;
  case 1:
    digitalWrite(13, HIGH);
    Serial.println("Case 1");
    break;
  case 2:
    digitalWrite(4, HIGH);
    Serial.println("Case 2");
    break;
  case 3:
    do digitalWrite(5, HIGH);
    Serial.println("You've reached the last selection.");
    Serial.println("Case 3");
  }
}

При каждом нажатии кнопки выполняется первый doSwitchStatement(), который устанавливает высокий выходной вывод и печатает сообщение.После этого значение selector увеличивается и устанавливается на 0, если оно достигает 4.

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