BlinkWithoutDelay раз 5)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Мужики, возник такой момент в моей карьере "тру-программиста": Представим, что нужно сделать штук 5 блинков без делэя с разным интервалом времени... Я могу решить это обычным способом, примерно так:

unsigned long cTime=0;
unsigned long pTime=0;
unsigned long pTime1=0;
unsigned long pTime2=0;
unsigned long pTime3=0;
unsigned long pTime4=0;  //ну и так далее, не буду плодить бесполезный код


void loop(){
cTime=millis();// ну тут понятно...

if (cTime-pTime>1000){    //и тут понеслась....
digitalWrite(led1Pin, !digitalRead(led1Pin)) // мигаем первой лампочкой
pTime=cTime;
}

if (cTime-pTime2>2000){  // и так можно до опупения...
digitalWrite(led2Pin, !digitalRead(led2Pin)) // мигаем второй лампочкой

pTime2=cTime;

}

}



 

Но это ведь издевательство какое-то... Как бы попроще сделать, типа как в теме про "blynk" (ну кто читал), вроде timer.setInterval(тут пишем параметр времени, через которое будет запускаться ФУНКЦИЯ...   ,  а тут пишем саму эту ФУНКЦИЮ)... Там, конечно, сложновато.... Рад буду и промежуточному способу... Подскажите куда копать.

std
Offline
Зарегистрирован: 05.01.2012

У меня в светофоре был массив шириной в полный цикл, ну а дальше обычным способом: millis()-метка времени, с разрешением цикла, для светофора 500 мс т. к. зелёный мигает по полсекунды, ну думаю понятно.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Вот тут через прерывания мигают с произвольными интервалами.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015
Andrey-S
Offline
Зарегистрирован: 02.01.2015

Нихрена себе, отвернулся чаю налить, а тут 3 ответа уже.. Спасибо всем! Щааааа разберусь че тут для меня ТоСамое!

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Клапауций 001 пишет:

http://www.pjrc.com/teensy/td_libs_Metro.html - не?

Саааамый то, что нужно практически! Большое спасибо! Затестил - работает!

P.S. Класс титановая кнопка продолжает исправно работать! 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

Andrey-S пишет:

P.S. Класс титановая кнопка продолжает исправно работать! 

на то он и титановый велосипед - пользуйся на здоровье

Logik
Offline
Зарегистрирован: 05.08.2014

unsigned long cTime=0;
unsigned long pTime[5];
byte ledPin[5]={4,5,6,7,8};
word t[5]={1000,2000,3000,4000,5000};
void setup()
{
 memset(pTime, 0, sizeof(pTime));
}

void loop(){
cTime=millis();// ну тут понятно...

for(byte i=0;i<5;i++)
{
	if (cTime-pTime[i]>t[i]){    //и тут понеслась....
	digitalWrite(ledPin[i], !digitalRead(ledPin[i])) // мигаем первой лампочкой
	pTime[i]=cTime;
	}
}
}

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Logik пишет:


unsigned long cTime=0; // Ну тут понятно...
unsigned long pTime[5]; // ну тут тоже
byte ledPin[5]={4,5,6,7,8};// ну тут массив лампочек
word t[5]={1000,2000,3000,4000,5000}; //ну тут массив самих интервалов для строки 2 
void setup()
{
 memset(pTime, 0, sizeof(pTime)); // вот тут вообще нихрена не понятно))) 
}

void loop(){
cTime=millis();// ну тут понятно...

for(byte i=0;i<5;i++) //здесь все ясно
{
	if (cTime-pTime[i]>t[i]){    //и тут понеслась.... Понятно 
	digitalWrite(ledPin[i], !digitalRead(ledPin[i])) // мигаем первой лампочкой
	pTime[i]=cTime;
	}
}
}

 

А так спасибо! Хороший пример для понимания всей логики...  Вот Setup только не понял.. Че такое memset и как оно появилось, если не было объявлено... Ну и что за значения внутри нее?

Logik
Offline
Зарегистрирован: 05.08.2014

Andrey-S пишет:

 Че такое memset и как оно появилось,

Это pTime[0]=0;pTime[1]=0;pTime[2]=0;pTime[3]=0;pTime[4]=0; Стандартное.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Тобишь, как я вижу и понимаю: memset(pTime, 0, sizeof(pTime)); ====  Устанавливаем одинаковое значение для всех переменных МАССИВА (МАССИВ, значение, НЕПОНЯТНАЯ ФИГНЯ). Какую роль тут играет  sizeof(pTime)?

Joiner
Offline
Зарегистрирован: 04.09.2014

Клапауций 001 пишет:

http://www.pjrc.com/teensy/td_libs_Metro.html - не?

Пока не понял что это такое, но интуиция подсказывает что нужная штука.

Сенкс.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Joiner пишет:

Пока не понял что это такое, но интуиция подсказывает что нужная штука.

Сенкс.

Ды офигеть какая на самом деле... Я уже заценил все прелести... Самое то!

Joiner
Offline
Зарегистрирован: 04.09.2014

Andrey-S пишет:

Joiner пишет:

Пока не понял что это такое, но интуиция подсказывает что нужная штука.

Сенкс.

Ды офигеть какая на самом деле... Я уже заценил все прелести... Самое то!

Объясни

Andrey-S
Offline
Зарегистрирован: 02.01.2015
#include <Metro.h> //Подключаем библиотеку

//Задаем необходимые интервалы
Metro metro0 = Metro(60000); //Минута
Metro metro1 = Metro(2000);// Пара секунд
Metro metro2 = Metro(500);  //Пол секунды

 ledPins[]={10, 11, 12}; // Берем троечку лампочек

void setup(){

for (int i=0; i<3; i++){                        //Для всех трех лапочек
pinMode(ledPins[i], OUTPUT);     //Пин в режим выхода
digitalWrite(ledPins[i], LOW);        //Не горим

}
}

void loop(){

if (metro0.check()==1){  //Если интервал в 60 секунд приплыл...
digitalWrite(ledPins[0], !digitalRead(ledPins[0])); //Инвертируем состояние первой лампочки
}

if (metro1.check()==1){  //Если интервал в 2 секунд приплыл...
digitalWrite(ledPins[1], !digitalRead(ledPins[1]));// Инвертируем состояние второй лампочки
}
    // ну и так далее....
}

Ну как-то так...

Joiner
Offline
Зарегистрирован: 04.09.2014

Andrey-S пишет:

Ну как-то так...

Спасибо :)