Как использовать кнопку без использования if, else

Я хочу, чтобы светодиод мигал в течение 3 секунд, затем 2 секунды, затем одну секунду, используя кнопку один раз и не используя if / else

void setup() {
    // put your setup code here, to run once: 
    pinMode(5, INPUT); 
    pinMode(6, OUTPUT);
} 

void loop() { 
    // put your main code here, to run repeatedly: 
    digitalRead(5, HIGH);
    digitalWrite(6, HIGH); 
    delay(3000);
    digitalWrite(6, LOW);
    digitalWrite(6, HIGH); 
    delay(2000); 
    digitalWrite(6, LOW); 
    digitalWrite(6, HIGH); 
    delay(1000); 
}

, 👍0

Обсуждение

Почему вы не хотите использовать if/else? Или это школьное задание?, @chrisl

на самом деле это школьное задание, @Sam Abdul

`switch case" - ваш друг ;), @ElectronSurf

Switch - это альтернатива if --- если только вы не находитесь в разделе "прерывания" вашего класса..., @GMc

digitalRead() возвращает либо LOW (что является макросом, эквивалентным 0), либо HIGH (что равно 1)., @Edgar Bonet

Я могу придумать дюжину способов написать то, что вы хотите. Ни один из них не очень хорош, лучшим методом было бы использовать оператор if. Проблема в том, что учитель, вероятно, хочет, чтобы вы использовали какой-то навык, который вы только что освоили, а мы не знаем, что это такое. Я мог бы написать вам отличную программу, которая не использует оператор if, но если это не то, что ищет ваш учитель, то вы, вероятно, все равно не получите оценку за задание, и вы сделаете очевидным, что у вас есть люди в Интернете, которые делают вашу домашнюю работу за вас, что, если ваш учитель хоть сколько-нибудь хорош в том, чтобы тебя выгнали из класса., @Delta_G

@GMc delay не работает, когда помещается внутри метода прерывания, потому что сам он использует прерывания для увеличения счетчика миллисекундного таймера. Единственный способ написать эту логику с прерываниями - установить флаг в глобальной области видимости, а затем использовать if для проверки этого флага в методе loop. Так что прерывания не являются хорошим решением этой домашней работы. Разве что, может быть, заставить кнопку нажать прерывание, чтобы настроить прерывание таймера? Это кажется действительно ужасным.., @Filip Franik

@FilipFranik Я согласен и не выступал за это. Вы определенно не хотите включать какие-либо длительные операции в процедуру обслуживания прерываний. Мой комментарий был скорее предположением, что switch является очевидной альтернативой использованию if, но также возможно, что OP находился в разделе "прерывания" их класса и, следовательно, потребовал бы совершенно другого подхода к последовательному коду, как указано в вопросе, - и, как вы предлагаете, определенно не следует использовать задержку. Надеюсь, этому тоже учили в классе... Возможно, оглядываясь назад, мне следовало бы быть более ясным в моем первоначальном комментарии., @GMc

это была "вырезка и паста" с "digitalRead (5, HIGH);"? Функция digitalRead() принимает только один аргумент, а не 2., @user3765883

И, раз уж я затронул эту тему, несколько замечаний о хорошем стиле кодирования. Старайтесь избегать использования "магических чисел" в вашем коде. Операторы типа 'digitalWrite (6, HIGH)' следует заменить чем-то вроде 'digitalWrite (LED_PIN, HIGH), где LED_PIN определяется перед setup () чем-то вроде '#define LED_PIN 6' или 'const int LED_PIN = 6;' (какой из них вы используете здесь, это больше вопрос стиля, чем что-либо еще). Также следует широко использовать поясняющие комментарии; они заставят вас задуматься о том, что вы пытаетесь сделать, и помогут таким рецензентам, как мы, понять ваши намерения., @user3765883


3 ответа


1

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

,

1

Вы могли бы просто инвертировать логическую переменную, чтобы установить состояние светодиода.

const int LedPin = 5;
bool ledState = true;

// в вашем цикле

// bool будет преобразован из true в 1 (HIGH)
digitalWrite(LedPin, (int)ledState);
// инвертировать состояние светодиода на false
ledState = !ledState;
// false -> 0 (НИЗКИЙ)
digitalWrite(LedPin, (int)ledState);
,

1

Троичный оператор может быть полезен. [Ссылка]

,

Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только для ссылок могут стать недействительными, если страница, на которую дана ссылка, изменится., @sempaiscuba