Police flash или снова мигаем без delay

AndyResh
Offline
Зарегистрирован: 08.04.2013

Для своего бота стал делать проблесковый маячек. Идея была в том, что светодиоды я планирую сделать линейку красных и линейку синих, напрямую к Arduino такое кол-во цеплять нецелесообразно и я подумал использовать под эту тему драйвер двигателей L293d. Получается на один мост я могу зацепить красные с одной полярностью, а синии с обратной, далее Arduino будет подавать серии вспышек то на красные, то на синие, попарно меняя HIGH и LOW. Надеюсь, правильно все изложил.

На второй мост хочу таким же образом зацепить "фары" и ИК-подсветку камеры, но там мигать уже ничего не будет и эту часть реализовать проблем нет.

Так вот, за основу я взял всем известный пример http://arduino.ru/forum/programmirovanie/eshche-raz-migaem-svetodiodom-bez-delay#comment-40693

Напильником подпилил до такого:

#define RED 22
#define BLUE 24

#define LOW_INTERVAL 300 // сколько времени выдавать LOW
#define HIGH_INTERVAL 250 // сколько времени выдавать HIGH

byte count_flash=0;
boolean change = false;

void setup()  {
  pinMode(RED, OUTPUT);
  pinMode(BLUE, OUTPUT);
}


void loop()  {
  flashing();
}


void flashing()  {
  if (change = true) red_flash();
  if (change = false) blue_flash();
}


void red_flash()  {
  static unsigned long period= LOW_INTERVAL; // текущий интервал мигания
  static unsigned long prevMillis=0;
  count_flash++;

  if( (millis()-prevMillis)>=period)  {
    prevMillis=millis();
    digitalWrite(RED,!digitalRead(RED));
    period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL
  }      

  if (count_flash == 5)  {
    change = false;
    count_flash = 0;
  }
}


void blue_flash()  {
  static unsigned long period= LOW_INTERVAL; // текущий интервал мигания
  static unsigned long prevMillis=0;
  count_flash++;

  if( (millis()-prevMillis)>=period)  {
    prevMillis=millis();
    digitalWrite(BLUE,!digitalRead(BLUE));
    period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL
  }

  if (count_flash == 5)  {
    change = true;
    count_flash = 0;
  }
}

Затупил я на следующем шаге - пин красный и пин синий должны попарно менять HIGH / LOW на LOW / HIGH, в зависимости от того какой цвет сейчас "блинкует". Чувствую, что что-то простое, а никак не могу допинать. В связи с чем и прошу помощи.

AndyResh
Offline
Зарегистрирован: 08.04.2013

Чутка дописал и приложил рисунок

#define RED 22
#define BLUE 24

#define FLASH 5           // сколько вспышек одного цвета
#define LOW_INTERVAL 300  // сколько времени выдавать LOW
#define HIGH_INTERVAL 250 // сколько времени выдавать HIGH

byte count_flash=0;
boolean change = false;

void setup()  {
  pinMode(RED, OUTPUT);
  pinMode(BLUE, OUTPUT);
}


void loop()  {
  flashing();
}


void flashing()  {
  if (change = true) red_flash();
  if (change = false) blue_flash();
}


void red_flash()  {
  static unsigned long period= LOW_INTERVAL; // текущий интервал мигания
  static unsigned long prevMillis=0;
  count_flash++;

  if( (millis()-prevMillis)>=period)  {
    prevMillis=millis();
    digitalWrite(RED,!digitalRead(RED));
    period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL
  }      

  if (count_flash == FLASH)  {
    change = false;
    count_flash = 0;
  }
}


void blue_flash()  {
  static unsigned long period= LOW_INTERVAL; // текущий интервал мигания
  static unsigned long prevMillis=0;
  count_flash++;

  if( (millis()-prevMillis)>=period)  {
    prevMillis=millis();
    digitalWrite(BLUE,!digitalRead(BLUE));
    period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL
  }

  if (count_flash == FLASH)  {
    change = true;
    count_flash = 0;
  }
}

На рисунке диоды = светодиоды.

maksim
Offline
Зарегистрирован: 12.02.2012
#define RED 22
#define BLUE 24

#define FLASH 5           // сколько вспышек одного цвета
#define LOW_INTERVAL 200  // сколько времени выдавать LOW
#define HIGH_INTERVAL 50  // сколько времени выдавать HIGH

void setup()  
{
  pinMode(RED, OUTPUT);
  pinMode(BLUE, OUTPUT);
}

void loop()  
{
  flashing();
}

void flashing()
{
  static byte count_flash = 0;
  static bool change = 0;
  static unsigned long period = LOW_INTERVAL; // текущий интервал мигания
  static unsigned long prevMillis = 0;

  if(millis()-prevMillis >= period)
  {
    prevMillis = millis();
    digitalWrite(change?RED:BLUE, !digitalRead(change?RED:BLUE));
    count_flash++;
    period = period==LOW_INTERVAL?HIGH_INTERVAL:LOW_INTERVAL;  // чередуем
    if(count_flash == FLASH)  
    {
      change = !change;
      count_flash = 0;
    }
  }
}

 

AndyResh
Offline
Зарегистрирован: 08.04.2013

2 maksim - гениально! Мои благодарности!