Не полностью работает прерывание
- Войдите на сайт для отправки комментариев
Втр, 10/12/2013 - 10:57
Захотелось к новому году сделать герлянду в офис. Имеется лед пиксели 50 шт на WS2801. Переключение режимов организавал через прерывание. Переключение происхоид с брелка и приемника. Проблема в следующем, запускается все хорошо, одно переключение проходит четко и на этом все, не какой реакции нет. Пробывал разные виды прерываний, не помогло. Ардуиной балуюсь не шибко много.
Пример кода
volatile int vol;
void setup() {
attachInterrupt(0, change, CHANGE);
strip.begin();
strip.show();
vol = 1;
rbg();
}
void change()
{
vol = vol + 1;
if (vol == 5) vol = 1;
switch (vol){
case 1:
rbg;
break;
case 2:
randmOne();
break;
case 3:
randm();
break;
default:
black()
}
}
void black()
{
colorWipe(Color(0, 0, 0), 0);
strip.show();
}
void randmOne()
{
int k = 0;
int i;
while (k == 0)
{
for (i = 1; i< 50; i++)
{
strip.setPixelColor(i, Color(random(10, 255), random(10,255), random(10, 255)));
strip.show();
}
}
}
void randm()
{
int k = 0;
while (k == 0)
{
colorWipe(Color(random(10, 255), random(10,255), random(10, 255)), 0);
strip.show();
}
}
void rbg ()
{
int i;
// Some example procedures showing how to display to the pixels
int k = 0;
while (k == 0)
{
for (i = 1; i<255; i=i+20)
{
colorWipe(Color(i, 0, 0), 0);
}
for (i = 1; i<255; i=i+20)
{
colorWipe(Color(0, i, 0), 0);
}
for (i = 1; i<255; i=i+20)
{
colorWipe(Color(0, 0, i), 0);
}
}
}
Правильно у вас висящие циклы во всех режимах - программа только в нем и выполняется считая что выполняет прерывание - поэтому не может выполнить еще одно прерывание.
Вобщем ваш код нужно полность переработать опираясь на то что loop() зациклен(повторяется бесконечное число раз) без ваших while. Правильно будет если в прерывании будет устанавливаться только значение переменной режима(и никаких там вызовов функций), а обробатываться оно будет в loop().
Написал ответ и все понял, :) т.е. пока функция прерывания ( change() ) не отработает прерывание не закончится? Такого не подозревал, спасибо.
Доработал, теперь работает
Добрый день. Можете поподробнее описать вашу гирлянду? что за брелок, какие режимы.
брелок бал такой
http://dx.com/ru/p/2272-m4-non-lock-4-way-wireless-remote-control-module-w-receiving-panel-148825#.UrvAQPRdW30
По по ходу он или шумный или просто макетка плохая. А с режимами тут фантазия нужна, был плавный переход между цветами, рандомное моргание цветами и т.д. Пока подзабил на это дело.
А если убрать брелок, и оставить просто перебор режимов? Можете выложить скетч?
Так это не очень сложно, циклы можно сделать через вайл, и контролировать в цикле време. Т.е. сначало присваеваем переменной текущее значение millis(), затем выполняем цикл пока millis() не равно переменная + заданное время работы режима и так каждый цикл. Скетча готового нет, но написать его не сложно.
Можете написать? БУду очень благодарен.
Если только позже, навыходных может быть займусь
Ок, обуду ОЧЕНЬ ждать! Нужно нести красоту в массы))