2 раза моргуть светодиодом в Case:

Silent3886
Offline
Зарегистрирован: 22.06.2019

Здравствуйте!

В чем задумка, когда выбирается определенный оператор Case, то происходит индикация светодиодом этого режима. Например: при выборе Case 1: светодиод моргнет 2 раза, потом прекратит моргать и начнется выполнение основного кода. При выборе Case 2: светодиод моргнет 3 раза, остановится моргать, начнется выполнение программы. Это как алгоритм и пример. Но при использовании цикла for или while - светодиоды продолжают моргать и из цикла не выходит. Подозреваю, что проблема в условиях самого цикла. Вот часть моего нубо-кода.

Case 1:

for(int i=0; i<2; i++) {
digitalWrite(Led, 1);
delay(500);
digitalWrite(Led, 0);
delay(500);
if(i=2) break;
}

/* код программы /*
break;

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

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Во-первых код нужно вставлять по правилам. Во-вторых - полностью. В-третьих - да, все дело в цикле. Мой хрустальный шар говорит, что условие case 1: выполняется при каждой итерации loop();

Silent3886
Offline
Зарегистрирован: 22.06.2019

Принял, с мобильной версии просто не получается.
То есть цикл выполняется, но как он выполнен программа идет дальше и когда по кругу возвращается к case 1:, то выполняется все заново?

b707
Offline
Зарегистрирован: 26.05.2017

Silent3886 пишет:
То есть цикл выполняется, но как он выполнен программа идет дальше и когда по кругу возвращается к case 1:, то выполняется все заново?

да, именно так.

И ремарка - строчка с break не выполнится никогда. Но на выполнение это не влияет

Silent3886
Offline
Зарегистрирован: 22.06.2019

Значит как вариант в самом теле case 1: можно добавить условие на флаг(грубо говоря) и когда флаг true, то выполнять все, что в условии, а если false, то условие не выполнять и только в case 2: уже поменять переменную флага для первоого case 1:, чтобы при переключении условие выполнилось опять, примерно так можно?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Silent3886 пишет:
Принял, с мобильной версии просто не получается.

В любом мобильном браузере есть "кнопочка" "версия для ПК"

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Silent3886 пишет:
Значит как вариант в самом теле case 1: можно добавить условие на флаг(грубо говоря) и когда флаг true, то выполнять все, что в условии, а если false, то условие не выполнять и только в case 2: уже поменять переменную флага для первоого case 1:, чтобы при переключении условие выполнилось опять, примерно так можно?

Что гадать? Вставь весь код по правилам форума и тебе подскажут. 

StasOn
Offline
Зарегистрирован: 10.05.2017

Добрый день! Вот часть моего нубо-кода:

void ErrorPWM() { //функция сигнализации ошибки
  static unsigned long lastTime = 0; //переменная для хранения текущего времени
  sensorValueNew = sensorValueCur;
  sensorValueCur = 0;
  for (int i = 0; i <= 2; i = ++i) {
    while (sensorValueCur < 180) { //пока текущее значение уровня меньше нового значения
      if (millis() - lastTime > 2) { //каждые 15 lastTime увеличиваем sensorValueCur на 1
        lastTime = millis();
        analogWrite(3, ++sensorValueCur);
      }
    }
    if (sensorValueCur == 180) analogWrite(3, sensorValueCur = 0);
  }
  analogWrite(3, sensorValueCur = sensorValueNew);
}

Отдельная функция для моргалки, которая вызывается по событию. Можно сравнивать i с глобальной переменной, сколько она будет, столько раз и моргнет ) Правда над немного переделать под себя.

Еще есть программа, где можно настраивать время горения двух диодов и паузу между ними.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Часто, при создании такого шедевра, автор вопрос сам находит ответ. ;)))

StasOn
Offline
Зарегистрирован: 10.05.2017

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