Как помигать светодиодами?

Bishkek
Offline
Зарегистрирован: 11.12.2014

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

#define LED_PIN1  13
#define LED_PIN2  10
#define LED_PIN3 11
#define SERIAL_SPEED 9600 // скорость работы Serial

unsigned long millis_old[5];//массив для хранения последних данных о времени срабатывания таймера.Количество элементов соответствует количеству таймеров
boolean my_timer(unsigned long time, byte nomer)//функция таймер, time-время задержки, nomer-номер таймера
{
  unsigned long current_millis;//текущее значение миллисекунды
  current_millis = millis();
  if (current_millis - millis_old[nomer] > time) //если время срабатывания таймера наступило
  {
    millis_old[nomer] = current_millis; //перезаписываем время последнего срабатывания таймера
    return true;//возвращаем true
  } else return false;//возвращаем false
}

void setup()
{
  Serial.begin(SERIAL_SPEED);

  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
  pinMode(LED_PIN3, OUTPUT);
}

void loop()

{
  if (my_timer(500, 0)) //если таймер №0, отсчитал 0.5 секундs
  {
    //выполняем наши действия
    digitalWrite(LED_PIN1, HIGH);
  }

  if (my_timer(2500, 2)) //если таймер №2, отсчитал 2.5 секундs
  {
    digitalWrite(LED_PIN2, HIGH);
  }
  if (my_timer(4000, 4)) //если таймер №4, отсчитал 4 секундs
  {
    //выполняем наши действия
    digitalWrite(LED_PIN3, HIGH);
  }
}

 


 

com
Offline
Зарегистрирован: 06.09.2013

добавить вначале

int led1state=0;

int led2state=0;

int led3state=0;

и в цикле для каждого диода

ledXstate = 1 - ledXstate;

digitalWrite (led_pinX, ledXstate);

Bishkek
Offline
Зарегистрирован: 11.12.2014

Спасибо,буду пробовать.А как выставить время через сколько светик потухнет?То есть откуда и как он это значение получит?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Например, для каждого светика хранить массив структур, где каждая структура хранит время и состояние. Соответственно для каждого массива хранить индекс. Начинать с 0. Проверять 0 структуру пока она не сработает, тогда перейти к следующей структуре. В конце массива стоп или закольцевать.
Таймеры можно привязать к светикам или массивам, либо автоматически выбирать свободный.

SKub
Offline
Зарегистрирован: 19.04.2015

вы забыли указать таймер через сколько выключить и функцию выключения

digitalWrite(LED_PIN1, LOW);

LOW это выключить

 

SKub
Offline
Зарегистрирован: 19.04.2015
void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}


еще пример

 if(millis() - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = millis(); 
   
// digitalWrite(diodRed,LOW); 
digitalWrite(diodRed,!digitalRead(diodRed));
  
  }

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если без масива то можно вот так:

#include <CyberLib.h> //Библиотека в которой мы используем таймер хотя таймер можно использовать и Ваш 
// В зависимости от точности создаем переменную
float P_led1 = 0;
float P_led2 = 0;
float P_led3 = 0;
// Подключаем светодиоды
int ledPin1 = 11;
int ledPin2 = 12;
int ledPin3 = 13;

void setup()
    {
	pinMode(ledPin1, OUTPUT);
	pinMode(ledPin2, OUTPUT);
	pinMode(ledPin3, OUTPUT);
// Создаем таймер, который будет зависимости от точности, 
// в нашем случаи два раза в секунду запускать функцию led()
  	StartTimer1(led, 500000);
    }

void led() //Функция прерывания Таймера
{
  P_led1 = P_led1 + 0.5;
  P_led2 = P_led2 + 0.5;
  P_led3 = P_led3 + 0.5;
}

void loop(){

//Включаем светодиоды каждый через свой период
 if (digitalRead(ledPin1) == LOW)
  {
   if (P_led1 >= 1.5)digitalWrite(ledPin1, HIGH), P_led1=0;//
  }
  
  if (digitalRead(ledPin2) == LOW)
  {
   if (P_led2 >= 2.5)digitalWrite(ledPin2, HIGH), P_led2=0;
  }

   if (digitalRead(ledPin3) == LOW)
  {
   if (P_led3 >= 3.5)digitalWrite(ledPin3, HIGH), P_led3=0;
  }

//Выключаем светодиоды каждый через свой период
 if (digitalRead(ledPin1) == HIGH)
  {
   if (P_led1 >= 1)digitalWrite(ledPin1, LOW), P_led1=0;
  }
  
  if (digitalRead(ledPin2) == HIGH)
  {
   if (P_led2 >= 2)digitalWrite(ledPin2, LOW), P_led2=0;
  }

   if (digitalRead(ledPin3) == HIGH)
  {
   if (P_led3 >= 3)digitalWrite(ledPin3, LOW), P_led3=0;
  }

}