Помогите выйти из цикла

Etore
Offline
Зарегистрирован: 25.11.2018

Здравствуйте, делаю контроллер для управлением светодиода Rgb c Ик пульта, функция плавного перехода цветов. Все запускается но выйти из цикла не получается, на кнопки пульта не реагирует (В Com порте не прописывает) Как сделать выход из цикла правильно?

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

IRrecv irrecv(A0); 
decode_results results;
int Red = 6;
int Green = 10;
int Blue = 9;
int BR = 0; 
int BG = 0;
int BB = 0;
int dim = 5;
int set = 0;


void setup() 
{
  irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  
  pinMode(Red, OUTPUT); 
  pinMode(Green, OUTPUT); 
  pinMode(Blue, OUTPUT);
  pinMode(A0, INPUT); 
  
  Serial.begin(9600); 
}

void loop() 
{

 if (irrecv.decode(&results)) //данные с ik порта
  {
    Serial.println(results.value); 
    
     if (results.value == 16773135)
    {
      set=1;
    while(set==1)
      {
      delay(100);
      for(int i=255; i>=0; i--)            
          {
        analogWrite( Red, i/dim );
        analogWrite( Green, (255-i)/dim );
        delay(10);
          }
      for(int i=255; i>=0; i--)
          {
        analogWrite( Green, i/dim );
        analogWrite( Blue, (255-i)/dim );
        delay(10);
          }
    
      for(int i=255; i>=0; i--)
          {
        analogWrite( Blue, i/dim );
        analogWrite( Red, (255-i)/dim );
        delay(10);
          }
       irrecv.resume();
        if (irrecv.decode(&results))
           {
          if (results.value > 16700000 && results.value < 16800000) 
             {
             set=0;
             break;
             }
           }
     }
   }     
 }
    irrecv.resume(); // принимаем следующий сигнал на ИК приемнике

  
  BR = constrain(BR, 0, 254);  
    analogWrite(Red, BR);   //яркость от 0 до 254
      

  BG = constrain(BG, 0, 254);  
    analogWrite(Green, BG);   
     
    
  BB = constrain(BB, 0, 254);  
    analogWrite(Blue, BB);   
     

}

 

mixail844
Offline
Зарегистрирован: 30.04.2012

нужно начать с того что слово "set" в строчках 15,39,40 ,67 надо заменить на другое,так как  "set" являеться зарезервированным словом языка

 

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

mixail844 пишет:

"set" являеться зарезервированным словом языка

Какого?

Бэйсика? Или какой язык Вы имели в виду?

Etore
Offline
Зарегистрирован: 25.11.2018

mixail844 пишет:

нужно начать с того что слово "set" в строчках 15,39,40 ,67 надо заменить на другое,так как  "set" являеться зарезервированным словом языка

 

поменял ничего не изменилось

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

Etore пишет:

поменял ничего не изменилось

И не должно было.

Чтобы читать кнопки Вам нужно

1. Либо избавиться от цикла в строке 40, за счёт реорганизации программы, либо внести чтение конопок внутрь этого цикла. Лучше избавиться, по жизни он там не нужен.

2. Либо избавиться от всех delay, либо читать кнопки во время delay в функции yield(). Опять же, лучше избавиться, чем костыли городить.

Вот когда это сделаете, то полегчает.

mixail844
Offline
Зарегистрирован: 30.04.2012

ЕвгенийП пишет:

mixail844 пишет:

"set" являеться зарезервированным словом языка

Какого?

Бэйсика? Или какой язык Вы имели в виду?

"set" же выделяется "синтакс-подсветчиком" на сайте,поэтому и подумал что это некое зарезервированное слово языка.

потом глянул http://www.cplusplus.com/reference/set/set/ и подумал что set это контрукция("container" -это контрукция?) языка которую  среда ардуино неявно подключает.

хотя с другой стороны,у ТС код "виснет",значит компилируется...значет может ТС при добавлении кода не ту подсветку выбрал.

Etore
Offline
Зарегистрирован: 25.11.2018

ЕвгенийП пишет:

1. Либо избавиться от цикла в строке 40, за счёт реорганизации программы, либо внести чтение конопок внутрь этого цикла. Лучше избавиться, по жизни он там не нужен.

2. Либо избавиться от всех delay, либо читать кнопки во время delay в функции yield(). Опять же, лучше избавиться, чем костыли городить.

1. Разве строки 62-65 не вносят чтение кнопок в цикл? Как можно зациклить процесс по другому?

2. Насчет функции "yield", я вообще с ней не знаком, я новичек в этом деле. Неделю как приобрел ардуино, освоил 5-6 уроков. Захотелось собрать что-то интересное и не знаю как реализовать задумку.

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

Etore пишет:

1. Разве строки 62-65 не вносят чтение кнопок в цикл?

вносят. Только программа их исполняет примерно 0.01 -0.1 секунды раз в 7 секунд. Можете сами прикинуть, каков ваш шанс попасть с нажатием кнопки на пульте именно в эти доли секунды. А все остальное время программа занята вашим циклом и сигналы пульта не принимает.

Цитата:
Как можно зациклить процесс по другому?

подпрограмма loop() сама является циклом - потому так и называется. Так что цикл в строке 40 и правда лишний, его можно выкинуть. Только вашу проблему это никак не решит. Проблема "кнопка не считывается внутри цикла" - классическая. Вы можете найти десятки собратьев по несчастью на других форумах. Увы, но путь решения один - программу нужно переписывать полностью

 

 

Etore
Offline
Зарегистрирован: 25.11.2018

Спасибо, да действительно, поставил delay секунду, после irrecv.resume(), в цикле и да иногда на кнопку реагирует, и цикл выключается.

Это не единственый цикл в моем скетче, я его просто привел в пример, поэтому в loop() их все зациклить даже представить себе не могу. Прийдется оставить затею, может вернусь к ней позже, когда чуть получше освою програмирование.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Etore пишет:

Это не единственый цикл в моем скетче, я его просто привел в пример, поэтому в loop() их все зациклить даже представить себе не могу.

Найдите приемры blink и blink without delay. Там одно и то же делается разными способами. Разберитесь. Как следует разберитесь, в чем разница. И перепишите свой скетч тем способом, который реализован во втором примере.