Не полностью работает прерывание

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

Захотелось к новому году сделать герлянду в офис. Имеется лед пиксели 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);
    }
  }
 
}
 
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

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

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

Написал ответ и все понял, :) т.е. пока функция прерывания ( change() ) не отработает прерывание не закончится? Такого не подозревал, спасибо.

 

Доработал, теперь работает

 

void loop() {
switch (vol){
  case 1: 
    rbg();
    break;
  case 2: 
    randmOne();
    break;
  case 3: 
    randm();
    break;
  case 4:
    black() ;  
  }
}
 
void change()
{  
  vol = vol + 1;
  if (vol == 4) vol = 1;  
  
}
 
void black()
{
  colorWipe(Color(0, 0, 0), 0);
  strip.show();
}
 
void randmOne()
{
  int k = 0;
  int i;
  while (k == 0)
  {
    if (vol !=  2) return;
    for (i = 1; i< 50; i++)
    {
      strip.setPixelColor(i, Color(random(10, 255), random(10,255), random(10, 255)));
      strip.show(); 
    }  
  }
}
 
veer1234
Offline
Зарегистрирован: 07.05.2013

Добрый день. Можете поподробнее описать вашу гирлянду? что за брелок, какие режимы. 

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

брелок бал такой

http://dx.com/ru/p/2272-m4-non-lock-4-way-wireless-remote-control-module-w-receiving-panel-148825#.UrvAQPRdW30

По по ходу он или шумный или просто макетка плохая. А с режимами тут фантазия нужна, был плавный переход между цветами, рандомное моргание цветами и т.д. Пока подзабил на это дело.

veer1234
Offline
Зарегистрирован: 07.05.2013

А если убрать брелок, и оставить просто перебор режимов? Можете выложить скетч?

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

Так это не очень сложно, циклы можно сделать через вайл, и контролировать в цикле време. Т.е. сначало присваеваем переменной текущее значение millis(), затем выполняем цикл пока millis()  не равно переменная + заданное время работы режима и так каждый цикл. Скетча готового нет, но написать его не сложно.

veer1234
Offline
Зарегистрирован: 07.05.2013

Можете написать? БУду очень благодарен. 

sg12@list.ru
Offline
Зарегистрирован: 13.08.2013

Если только позже, навыходных может быть займусь

veer1234
Offline
Зарегистрирован: 07.05.2013

Ок, обуду ОЧЕНЬ ждать! Нужно нести красоту в массы))