Как использовать кнопку без использования 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);
}
@Sam Abdul, 👍0
Обсуждение3 ответа
▲ 1
Поскольку требуемая операция конечна и коротка, вы можете просто жестко закодировать последовательность.
,
@he77789
▲ 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);
,
@Aleksej Vasinov
▲ 1
Троичный оператор может быть полезен. [Ссылка]
,
@Prateek Goyal
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только для ссылок могут стать недействительными, если страница, на которую дана ссылка, изменится., @sempaiscuba
Смотрите также:
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Почему вы не хотите использовать 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