Как повторить кусок кода

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

Повторить!

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

Вопрос: есть ли способ повторить часть кода 3 раза без копирования и вставки?

, 👍0

Обсуждение

Кроме как с петлей?, @Ignacio Vazquez-Abrams

Погуглите "для цикла С++"., @Majenko

@IgnacioVazquez-Abrams Дело в том, что он должен остановиться после 3-кратного «моргания». И нет способа остановить цикл, поправьте меня, если я ошибаюсь., @Jordakoes

И? Есть циклы, которые могут это сделать. Или вы еще не смотрели учебники по C++?, @Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams Единственное, что я пока нашел, это Exit (0); что останавливает программу. Но тогда мне все равно придется копировать и вставлять код 3 раза, потому что в противном случае цикл останавливается после 1 на 1 выключенном цикле., @Jordakoes

Спасибо за его код .. просто небольшое продолжение. Если я хочу остановить мигание при нажатии кнопки, какой код нужно добавить. пример: светодиод мигает в течение 30 секунд, затем, когда я нажимаю кнопку, он останавливается. Спасибо, @sharkedge


3 ответа


Лучший ответ:

2

Здесь вы можете использовать цикл. классический цикл 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


0

Еще один способ — объявить функцию. Этот метод даст вам больше шансов использовать его по-разному.

    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


0

Вы также можете оптимизировать 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