Умный светодиод, не хочет работать переключение эффектов.
- Войдите на сайт для отправки комментариев
Пт, 16/09/2016 - 08:01
Доброго всем!
Умный светодиод, не хочет работать переключение эффектов. delay - все тормозит, но избавлятся от него нет желания. Пршу помочь интегрировать в код break. Все старания безуспешны, помогите пожалуйста.
#include <Adafruit_NeoPixel.h> Adafruit_NeoPixel leds = Adafruit_NeoPixel(8, 14, NEO_GRB + NEO_KHZ800); int wait = 1; int regim = 1; int flag = 0; void setup() { leds.begin(); leds.setPixelColor(0, leds.Color(0, 0, 0)); leds.show(); delay(500); } void loop() { if(digitalRead(7)==HIGH&&flag==0) { regim++; flag=1; if(regim>3) { regim=1; } } if(digitalRead(7)==LOW&&flag==1) { flag=0; } if(regim==1)//1 режим { for(int x=0; x<4; x++) { for(int y=0; y<255; y++) { leds.setPixelColor(x, leds.Color(0, 0, y)); leds.setPixelColor(x+4, leds.Color(0, y, 0)); delay(wait); leds.show(); } } for(int x=0; x<4; x++) { for(int y=0; y<255; y++) { leds.setPixelColor(x, leds.Color(0, 0, ~y)); leds.setPixelColor(x+4, leds.Color(0, ~y, 0)); delay(wait); leds.show(); } } } if(regim==2)//2 режим { for(int x=0; x<8; x++) { for(int y=0; y<255; y++) { leds.setPixelColor(x, leds.Color(y, 0, 0)); leds.show(); delay(wait); } } } if(regim==3)//3 режим { for(int x=0; x<8; x++) { for(int y=0; y<255; y++) { leds.setPixelColor(x, leds.Color(0, y, 0)); leds.show(); delay(wait); } } } }
Доброго всем!
Пршу помочь интегрировать в код break.
Не понял, в чём Вам нужна помощь. Объясните подробнее, пожалуйста.
кнопка плохо срабатывает пока цыкл не закончился, делей тормозит выполнение меню, кнопка подключена по всем правилам, если сократить паузу то все ок, требуется по кнопке останавливать цикл, ну как то так
Ну посадите кнопку на второй или третий пин, назначьте на неё прерывание с помощью attachInterrupt, в обработчике прерывания присваивайте какой-нибудь переменной buttonPressed = true; а во все условия циклов добавьте && ! buttonPressed (например,
or
(
int
y=0; y<255 && !buttonPressed; y++)
). Тогда по нажатию, Вы будете немедленно вылетать из циклов.спасибо, буду ломать голову, отпишусь
пробую с millis, но что то как обычно, поправьте пожалуйста, это будет елочная гирлянда с кучей эффектов, но переключение между эффектами тормозит из за delay (в прошлом коде)
Ох, шото коварное Вы задумали)))
Проще на коде первого сообщения остановится. Там делей не так уже и страшен т.к. он всего 1мсек. А это не много.
Докинте в начала каждого вложеного цикла строки 34, 42 и 53 так
if
(digitalRead(7)==HIGH&&flag==0) break;
. Тогда будет проверятся нажатие кнопки и если она нажата, то из внутреннего цикла вывалимся сразу. После нескольких таких проходов завершится и внешний цикл, это не совсем красиво зато просто. В результате лоп перейдет к работе с кнопкой. Можна и сразу из лопа выходить, тогдаif
(digitalRead(7)==HIGH&&flag==0) return;