Помогите выйти из цикла
- Войдите на сайт для отправки комментариев
Вс, 25/11/2018 - 14:47
Здравствуйте, делаю контроллер для управлением светодиода 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); }
нужно начать с того что слово "set" в строчках 15,39,40 ,67 надо заменить на другое,так как "set" являеться зарезервированным словом языка
"set" являеться зарезервированным словом языка
Какого?
Бэйсика? Или какой язык Вы имели в виду?
нужно начать с того что слово "set" в строчках 15,39,40 ,67 надо заменить на другое,так как "set" являеться зарезервированным словом языка
поменял ничего не изменилось
поменял ничего не изменилось
И не должно было.
Чтобы читать кнопки Вам нужно
1. Либо избавиться от цикла в строке 40, за счёт реорганизации программы, либо внести чтение конопок внутрь этого цикла. Лучше избавиться, по жизни он там не нужен.
2. Либо избавиться от всех delay, либо читать кнопки во время delay в функции yield(). Опять же, лучше избавиться, чем костыли городить.
Вот когда это сделаете, то полегчает.
"set" являеться зарезервированным словом языка
Какого?
Бэйсика? Или какой язык Вы имели в виду?
"set" же выделяется "синтакс-подсветчиком" на сайте,поэтому и подумал что это некое зарезервированное слово языка.
потом глянул http://www.cplusplus.com/reference/set/set/ и подумал что set это контрукция("container" -это контрукция?) языка которую среда ардуино неявно подключает.
хотя с другой стороны,у ТС код "виснет",значит компилируется...значет может ТС при добавлении кода не ту подсветку выбрал.
1. Либо избавиться от цикла в строке 40, за счёт реорганизации программы, либо внести чтение конопок внутрь этого цикла. Лучше избавиться, по жизни он там не нужен.
2. Либо избавиться от всех delay, либо читать кнопки во время delay в функции yield(). Опять же, лучше избавиться, чем костыли городить.
1. Разве строки 62-65 не вносят чтение кнопок в цикл? Как можно зациклить процесс по другому?
2. Насчет функции "yield", я вообще с ней не знаком, я новичек в этом деле. Неделю как приобрел ардуино, освоил 5-6 уроков. Захотелось собрать что-то интересное и не знаю как реализовать задумку.
1. Разве строки 62-65 не вносят чтение кнопок в цикл?
вносят. Только программа их исполняет примерно 0.01 -0.1 секунды раз в 7 секунд. Можете сами прикинуть, каков ваш шанс попасть с нажатием кнопки на пульте именно в эти доли секунды. А все остальное время программа занята вашим циклом и сигналы пульта не принимает.
подпрограмма loop() сама является циклом - потому так и называется. Так что цикл в строке 40 и правда лишний, его можно выкинуть. Только вашу проблему это никак не решит. Проблема "кнопка не считывается внутри цикла" - классическая. Вы можете найти десятки собратьев по несчастью на других форумах. Увы, но путь решения один - программу нужно переписывать полностью
Спасибо, да действительно, поставил delay секунду, после irrecv.resume(), в цикле и да иногда на кнопку реагирует, и цикл выключается.
Это не единственый цикл в моем скетче, я его просто привел в пример, поэтому в loop() их все зациклить даже представить себе не могу. Прийдется оставить затею, может вернусь к ней позже, когда чуть получше освою програмирование.
Это не единственый цикл в моем скетче, я его просто привел в пример, поэтому в loop() их все зациклить даже представить себе не могу.
Найдите приемры blink и blink without delay. Там одно и то же делается разными способами. Разберитесь. Как следует разберитесь, в чем разница. И перепишите свой скетч тем способом, который реализован во втором примере.