Police flash или снова мигаем без delay
- Войдите на сайт для отправки комментариев
Для своего бота стал делать проблесковый маячек. Идея была в том, что светодиоды я планирую сделать линейку красных и линейку синих, напрямую к 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, в зависимости от того какой цвет сейчас "блинкует". Чувствую, что что-то простое, а никак не могу допинать. В связи с чем и прошу помощи.
Чутка дописал и приложил рисунок
#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; } }На рисунке диоды = светодиоды.
#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; } } }2 maksim - гениально! Мои благодарности!