Какой у вас вопрос?Держите это коротким и простым;) Кроме того, вы пробовали 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.