Как повторить кусок кода
Для школьного задания мне нужно, чтобы светодиод мигал 3 раза, а затем останавливался. Теперь я придумал следующий код:
Я думаю, что это достаточно «чисто» для того, что он должен делать, но у меня есть ощущение, что здесь должен быть более простой способ заставить светодиод мигать 3 раза.
Вопрос: есть ли способ повторить часть кода 3 раза без копирования и вставки?
@Jordakoes, 👍0
Обсуждение3 ответа
Лучший ответ:
Здесь вы можете использовать цикл. классический цикл for в C++ выглядит так
for (int i = 0; i < n; i++)
{
// содержимое между этими скобками
}
где n – количество циклов, которые вы хотите повторить
вы также можете создать экземпляр i
перед циклом.
int i;
for (i = 0; i < n; i++)
{
//содержимое здесь
}
Приведенный ниже код должен работать. Поэкспериментируйте с ним и посмотрите, что получится.
int ledPin = 13;
int delayPeriod = 500;
void setup(){
pinMode(ledPin, OUTPUT);
for (int i = 0; i < 3; i++){
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
Другой подход, который вы можете использовать, – это цикл while. Такие циклы будут повторяться до тех пор, пока не будет достигнут заданный параметр. В вашем случае вы хотите, чтобы светодиод перестал мигать после 3 раз.
int start = 0;
int stop = 3;
while (start <= stop){
//содержимое здесь
}
Пока циклы будут выполняться до тех пор, пока параметр имеет значение true. Это означает, что что-то вроде while(1)
будет продолжать работать вечно.
Спасибо! Я попробовал Int i; функция и работает отлично!, @Jordakoes
@tisaconundrum вы пропустили приращение или уменьшение в цикле while?, @Michael Vincent
Как я могу изменить код для работы с операторами if и else, чтобы он работал в цикле., @Jordakoes
Еще один способ — объявить функцию. Этот метод даст вам больше шансов использовать его по-разному.
int LED_PIN = 13;
void flashing(size_t times=1) { // По умолчанию мигает один раз, вы можете использовать это по своему желанию
int delayPeriod = 500;
for (size_t loop = 0; loop < (times*2); ++loop) {
digitalWrite(LED_PIN, (loop % 2)?HIGH:LOW);// Использовать модуль
delay(delayPeriod);
} // Спасибо [Matt][1] и [Edgar Bonet][2] за комментарии
}
void setup() {
pinMode(ledPin, OUTPUT);
flashing(3);
}
void loop() {
// Делаем что-нибудь здесь
}
Я также придумал идею использования функции, но вы должны учитывать накладные расходы на ее вызов. В этом случае я не думаю, что это стоит затрат. Обычные стандарты кодирования не одобряют размещение двух операторов в одной строке. Навскидку я не мог сказать, что более эффективно: while или for, но лично для фиксированного количества итераций я бы выбрал цикл for, если бы мне нужно было выполнить цикл while, я бы установил I на ноль, чтобы я мог сделать (i<times)
, что было бы быстрее, чем то, что у вас есть. Все, что сказал, это все еще хороший ответ., @Code Gorilla
Цикл for определенно лучше с точки зрения разборчивости., @Edgar Bonet
Вы также можете оптимизировать 4 строки кода внутри цикла:
const int ledPin = 13;
const int delayPeriod = 500;
const size_t count = 3;
void setup()
{
pinMode(ledPin, OUTPUT);
for (size_t loop = 0; loop < (count*2); ++loop) // size_t, потому что переменная никогда не бывает отрицательной.
{ // Засчитывается два раза, потому что у вас есть только половина кода
digitalWrite(ledPin, (loop % 2)?HIGH:LOW);// Использовать модуль
delay(delayPeriod);
}
}
Извините за поздние ответы! Спасибо за помощь, я попробую этот метод позже сегодня вечером! Я уже заставил свой код работать с предыдущим ответом. Этот метод может быть легче читать для других. Деф собирается взглянуть на это. Еще раз спасибо, очень ценю время и усилия, которые вы потратили на ответ!, @Jordakoes
- Как использовать SPI на Arduino?
- Библиотека DHT.h не импортируется
- Светодиоды: разница между общим анодом и общим катодом
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Отображение двоичных данных на светодиодах
- Корпус кнопки и переключателя
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
Кроме как с петлей?, @Ignacio Vazquez-Abrams
Погуглите "для цикла С++"., @Majenko
@IgnacioVazquez-Abrams Дело в том, что он должен остановиться после 3-кратного «моргания». И нет способа остановить цикл, поправьте меня, если я ошибаюсь., @Jordakoes
И? Есть циклы, которые могут это сделать. Или вы еще не смотрели учебники по C++?, @Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Единственное, что я пока нашел, это Exit (0); что останавливает программу. Но тогда мне все равно придется копировать и вставлять код 3 раза, потому что в противном случае цикл останавливается после 1 на 1 выключенном цикле., @Jordakoes
Спасибо за его код .. просто небольшое продолжение. Если я хочу остановить мигание при нажатии кнопки, какой код нужно добавить. пример: светодиод мигает в течение 30 секунд, затем, когда я нажимаю кнопку, он останавливается. Спасибо, @sharkedge