переключение светодиодов кнопкой

евгений1981
Offline
Зарегистрирован: 17.01.2019

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

 

#define G_LedPin 11            // Подключаем зеленый светодиод к порту 12
#define B_LedPin 10             // Подключаем синий светодиод к порту 11
#define ButPin 7               // Подключаем кнопку к выходу 10
int flag = 0;                  // флаг состояния
int regim = 1;                 // Переключалка
 
void setup()
{
  pinMode(G_LedPin, OUTPUT);
  pinMode(B_LedPin, OUTPUT);
}
 
void loop()
{
  if (digitalRead(ButPin) == HIGH && flag == 0)
  {
    regim ++;
    flag = 1;
    
    if (regim > 2)                    // Если номер режима превышает требуемого
    { // то отсчет начинается с нуля
      regim = 1;
    }
  }
 
  if (digitalRead(ButPin) == LOW && flag == 1)
  {
    flag = 0;
  }
 
  for (int i = 0; i <= 255; i++) {
    // ======= Вполняем задачу при выборе режима =======
    // РЕЖИМ 1: G
    if (regim == 1)
    {
      analogWrite(G_LedPin, i);
      analogWrite(B_LedPin, LOW);
      if (digitalRead(ButPin) == HIGH){
      break;}
      delay(5);
    }
 
    // РЕЖИМ 2: B
    if (regim == 2)
    {
      analogWrite(G_LedPin, LOW);
      analogWrite(B_LedPin, i);
      if (digitalRead(ButPin) == HIGH){
      break;}
      delay(5);
    }
  }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тема "ПЕСОЧНИЦА. ДЛЯ ВСЕХ НОВИЧКОВ" обязательна к прочтению (хотябы первые два поста) ДО того, как что-либо, постить.

Потрудитесь, пожалуйста, а потом перепостите Ваш вопрос (можно новым постом в этом же топике).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly.  И чтобы когда новобранец нажал первый раз "Создать тему"  переадресовывать в первый пост песочницы отоматически

kalapanga
Offline
Зарегистрирован: 23.10.2016

DetSimen пишет:

предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly.

Между прочим, это очень здравая идея.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

kalapanga пишет:

DetSimen пишет:

предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly.

Между прочим, это очень здравая идея.

нудак плюсуем

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

DetSimen пишет:

предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly.  И чтобы когда новобранец нажал первый раз "Создать тему"  переадресовывать в первый пост песочницы отоматически

думаешь они неделю будут правила читать?

будут постить те же унылые вопросы через неделю после регистрации. только и всего :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нинаю, за неделю мошт первый зуд в ладошках пройдёт. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

будут постить те же унылые вопросы через неделю после регистрации. только и всего :)

Да, не, типажи вроде "срочно, курсовик, завтра сдавать" уйдут на другие форумы мозг выносить. И то легче :)

евгений1981
Offline
Зарегистрирован: 17.01.2019

Музчины, вы очень нервно себя ведете, правил форума я не нарушал. Суть такая, это чисто мой личный интерес, есть устройство (ардуино уно, кнопка, 2 светодиода) которое долно работать так: при нажатии на кнопку происходит переключение светодиодов (при этом они мерцают), так вот - командой break прервать цикл не получается, он выполняется минимум один раз, после этого как по маслу. Если же нажать кнопку то цикл начинается снова и так до бесконечности.

Спасибо!!!

евгений1981
Offline
Зарегистрирован: 17.01.2019

Прошу прощения, дополню - если нажать на кнопку до конча первого выполнения цикла...

bwn
Offline
Зарегистрирован: 25.08.2014

Ничего нервного нет. Если бы вы изволили перечитать ссылку из первого поста, то узнали бы, как вставлять код, какая нужна дополнительная информация для создания темы и т.п., а также про "дедовщину".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

евгений1981 пишет:

правил форума я не нарушал. 

Нарушали. Просто Вы их так и не удосужились прочитать, хотя я явно написал Вам об этом в первом ответе. Хотите пример нарушения? Вы неправильно вставили код. В нём нет номеров строк. И как его обсуждать? "У Вас ошибка в строке №ХЗ и с строках №№ ХЗ-ХЗ". Так?

Пока не вставите код как положено, никто его читать не будет.

И пожалуйста, не учите старожилов как им себя вести, нервно или не очень - сами ведите себя нормально (в т.ч. соблюдайте правила) и проблемы исчезнут.

vk007
Offline
Зарегистрирован: 16.06.2015

евгений1981 пишет:

правил форума я не нарушал.

Интересно, как Вы можете это утверждать, если Вы этих самых правил даже не читали?

евгений1981
Offline
Зарегистрирован: 17.01.2019

Понятно! Еще раз дико извиняюсь

#define G_LedPin 11            // Подключаем зеленый светодиод к порту 12
#define B_LedPin 10             // Подключаем синий светодиод к порту 11
#define ButPin 7               // Подключаем кнопку к выходу 10
int flag = 0;                  // флаг состояния
int regim = 1;                 // Переключалка

void setup()
{
  pinMode(G_LedPin, OUTPUT);
  pinMode(B_LedPin, OUTPUT);
}

void loop()
{
  if (digitalRead(ButPin) == HIGH && flag == 0)
  {
    regim ++;
    flag = 1;
    
    if (regim > 2)                    // Если номер режима превышает требуемого
    { // то отсчет начинается с нуля
      regim = 1;
    }
  }

  if (digitalRead(ButPin) == LOW && flag == 1)
  {
    flag = 0;
  }

  for (int i = 0; i <= 255; i++) {
    // ======= Вполняем задачу при выборе режима =======
    // РЕЖИМ 1: G
    if (regim == 1)
    {
      analogWrite(G_LedPin, i);
      analogWrite(B_LedPin, LOW);
      if (digitalRead(ButPin) == HIGH){
      break;}
      delay(5);
    }

    // РЕЖИМ 2: B
    if (regim == 2)
    {
      analogWrite(G_LedPin, LOW);
      analogWrite(B_LedPin, i);
      if (digitalRead(ButPin) == HIGH){
      break;}
      delay(5);
    }
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вообще-то, не нужно организовывать цикл в строке №31 - сама по себе функция loop вызывается в бесконечном цикле и этим нужно пользоваться.

Но, если Вам так уж захотелось, то тогда Вам необходимо следить за своей флаговой переменной и всегда устанавливать её в ноль перед break. break-то срабатывает в этом нет сомнения (поставьте печать в сериал и убедитесь), а вот логика сломана из-за некорректного значения флага - оно у Вас всегда 1 при выходе по break в первом проходе.

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

евгений1981
Offline
Зарегистрирован: 17.01.2019

Я немного пока понимаю, новичек еще, без цикла в 31 строке и команды break все работает идеально, но хотелось чтоб светодиод загорался постепенно, так и происходит но переключается на другой только если цикл будет выполнен один раз. Если не дождаться полного загорания светодиода и последующего затухания и нажать на кнопку цикл начинается сначала.  

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогдаВам надо свосем по-другому делать. Я-то думал, что сначала Вас устраивает. А Вам надо, чтобы новый эффект начинался с того же состояния светодиода в котором он был при нажатии кнопки? Так? Т.е. ещё раз. В одном режиме первый светодиод меняет свою яркость, а второй - нет. При перекючении, первый остётся как есть, а второй начинает менять. При новом переключении, первый начинает менять с того места где остановился, а второя останавливается. Так?

евгений1981
Offline
Зарегистрирован: 17.01.2019

Нет, не совсем, код взял из интернета, мне нужно чтоб по нажатию кнопки переключались светодиоды (или режимы - не важно) и если убрать из кода цикл for и команду break все работает как надо (по нажатию все замечательно переключается) мне же надо чтоб они мерцали. Т.е. мерцает один светодиод а по нажатию он гаснет и начинает мерцать второй и т.д. Как только добавил цикл кнопка работает но перключает только псле того как яркость светодиода достигнет максимума и цикл пойдет по второму кругу (кароче на первом кругу не переключает)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так я же Вам написал в посте #14, при первом проходе у Вас переменная flag всегда 1. Делайте её 0 перед break и всего делов. Вы не читали? 

евгений1981
Offline
Зарегистрирован: 17.01.2019

Спасибо большое!!

 

евгений1981
Offline
Зарегистрирован: 17.01.2019

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

Я завтра скину ссылку на видео 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, потому что flag равен 1 а переключение происходит только, когда он равен 0 - см. строку 15

gfx125
Offline
Зарегистрирован: 27.05.2017

евгений1981 пишет:

 мерцает один светодиод а по нажатию он гаснет и начинает мерцать второй и т.д.

Так?

#define G_LedPin 11            // Подключаем зеленый светодиод к порту 12
#define B_LedPin 10             // Подключаем синий светодиод к порту 11
#define ButPin 7               // Подключаем кнопку к выходу 10
int flag = 0;                  // флаг состояния
int regim = 1;                 // Переключалка

void setup()
{
  pinMode(ButPin, INPUT);
  pinMode(G_LedPin, OUTPUT);
  pinMode(B_LedPin, OUTPUT);
}

void Led(int led1, int led2) {
  for (int i = 0; i <= 255; i++){
  analogWrite(led1, i);
      analogWrite(led2, LOW);
      if (digitalRead(ButPin) == HIGH){break;}
      delay(5);
      }
}


void loop()
{
  
  if (digitalRead(ButPin) == HIGH && flag == 0) {
          
    regim ++;
    flag = 1;
    
    if (regim > 2)                    // Если номер режима превышает требуемого
    { // то отсчет начинается с нуля
      regim = 1;
    }
 }
    
if (digitalRead(ButPin) == LOW && flag == 1)
  {
    flag = 0;
  }
  
if (regim == 1)  Led (G_LedPin, B_LedPin);
if (regim == 2)  Led (B_LedPin, G_LedPin);

}

 

 

евгений1981
Offline
Зарегистрирован: 17.01.2019

Загрузил... то же самое

евгений1981
Offline
Зарегистрирован: 17.01.2019

https://radikal.ru/video/IjyXyLqjQJw

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну Вы можете в своём коде, просто рядом с break поставить ещё и flag = 0; ????

gfx125
Offline
Зарегистрирован: 27.05.2017

евгений1981 пишет:

Загрузил... то же самое

ну незнаю, в железе не смотрел, а в Протеусе нормально переключается

или моя твоя не понимать

upd

if (digitalRead(ButPin) == HIGH) {delay (5); break;}
delay(5);

https://radikal.ru/video/KoF6UZqqaXe