Как помигать светодиодами?
- Войдите на сайт для отправки комментариев
Втр, 24/02/2015 - 01:36
Вот есть такой код на таймере и массиве значений.Светодиоды загораются через обозначенный промежуток времени и продолжают гореть.Как можно потушить их ,через нужный промежуток времени используя данный код?
#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);
}
}
добавить вначале
int led1state=0;
int led2state=0;
int led3state=0;
и в цикле для каждого диода
ledXstate = 1 - ledXstate;
digitalWrite (led_pinX, ledXstate);
Спасибо,буду пробовать.А как выставить время через сколько светик потухнет?То есть откуда и как он это значение получит?
Например, для каждого светика хранить массив структур, где каждая структура хранит время и состояние. Соответственно для каждого массива хранить индекс. Начинать с 0. Проверять 0 структуру пока она не сработает, тогда перейти к следующей структуре. В конце массива стоп или закольцевать.
Таймеры можно привязать к светикам или массивам, либо автоматически выбирать свободный.
вы забыли указать таймер через сколько выключить и функцию выключения
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)); }Если без масива то можно вот так:
#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; } }