Мигаем светодиодами по таймеру.

Taller
Offline
Зарегистрирован: 25.02.2014

Добрый день.

Помогите пожалуйста. Нужно мигать тремя светодиодами А, В, С. Как привязать срабатывание к таймеру, чтоб например диод В мигнул на 2,6 секунде и 3,4 секунде, а диод С на  6 -ой секунде и т.д. Длительность всего цикла до 10 сек.

 

 

AS
Offline
Зарегистрирован: 12.03.2014

http://arduino.ru/tutorials/blink

http://arduino.ru/tutorials/BlinkWithoutDelay

подскажите, а прежде чем писать в форум, вы что-нибудь сделали для решения своего вопроса? хоть в яндексе б вопросы задавали?

Taller
Offline
Зарегистрирован: 25.02.2014

Это всё я уже по 5 раз перечитал, на этих примерах можно мигать одним светодиодом или несколькими но с заданой последовательностью. Тоесть поставил Мигать А, А, Б, С, и т.д и можешь изменять только интервалы между ними. А задача привязать к таймеру чтоб в зависимости от задачи можно было  мигать какими хочешь и для каждого светодиода устанавливать время в которое ему нужно моргнуть. 

AS
Offline
Зарегистрирован: 12.03.2014

О! вот теперь проясняется задача! Что мешает во втором примере трижды повторить код, и мигать нужным светодиодом, тогда когда millis() совпадет с заданым значанием?

Taller
Offline
Зарегистрирован: 25.02.2014

Хорошо, тогда еще один вопрос.

Я занимаюсь фотографией, мне в процесе былобы проще использовать эту схему, чтоб можно было отталкиваться не от предудущего мигания, а от первого.  Может подскажите хоть в какую сторону смотреть

AS
Offline
Зарегистрирован: 12.03.2014

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

Taller
Offline
Зарегистрирован: 25.02.2014

Всё равно что-то не то у меня выходит завожу код в функцию кнопки, а у меня диод делает одно действие или вкл или выкл вод код

if(digitalRead(03)==HIGH&&flag==0)//если кнопка нажата   
     {
     delay (200);                                               // небольшая пауза, защита от дребезга
    
     unsigned long currentMillis = millis();
                                                          
  if(currentMillis - previousMillisPrivod > intervalFlash)      //проверяем не прошел ли нужный интервал, если прошел то
  {       
     previousMillisPrivod = currentMillis;                      // сохраняем время последнего переключения
     if (PrivodState == LOW)                                    // если светодиод не горит, то зажигаем, и наоборот
      PrivodState = HIGH;
    else
      PrivodState = LOW;
    digitalWrite(PrivodPin, PrivodState);                       // устанавливаем состояния выхода, чтобы включить или выключить светодиод
  }
       flag=1;
            }
      if(digitalRead(03)==LOW&&flag==1)//если кнопка НЕ нажата
          {
    flag=0;//обнуляем переменную flag
          }

}

 

AS
Offline
Зарегистрирован: 12.03.2014

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

Taller
Offline
Зарегистрирован: 25.02.2014

Мне нужно управлять фотоаппаратом, вспышкой , и капельным приводом, это все небольшые импульсы, типа мигания светодиода. Чтоб при нажатии кнопки, проходил цикл из 3 - 6 импульсов.

Привод: от одного до трех импульсов,

камера: один импульс,

вспышка один импульс.

Регулировка интервалов между всеми импульсами должна быть от первого события, тоесть от первого импульса на приводе. 

Схема через  управление интервалами через delay () - работает, но я не могу регулировать интервал от первого импульса, получается только по порядку, последовательно, а  это меня жутко не устраивает, тяжело камеру настраивать.

Вот весь код который работает с  delay (200) , я в место него хочу заставить срабатывать оборудование по таймеру от первого события. Весь цикл будет занимать до 10 сек.

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int flag=0;

const int CameraPin = 13;   // пин на камеру
const int PrivodPin = 11;   // пин на привод
const int FlashPin = 12;    // пин на вспышку

int m=0;            // переменные для меню
int CamT=0;        // переменная для интервала камеры
int PrivT1=100;      // для импульса 2
int PrivT2=0;      // для импульса 2
int PrivT3=0;      // для импульса 3
int PrivT4=0;
int FlashT=0;


byte key(){
 int val = analogRead(0);
  if (val < 50) return 5;        // в право 
  else if (val < 150) return 3;  // в верх  // Meny
  else if (val < 350) return 4;  // в низ   // Meny 
  else if (val < 500) return 2;  // в лево 
  else if (val < 800) return 1;  // select
  else return 0;  
}
// --- конец функции кнопок
void setup() {
 
  pinMode(CameraPin, OUTPUT);        // затвор камеры выход
  pinMode(PrivodPin, OUTPUT);        // реле привода выход
  pinMode(FlashPin, OUTPUT);         // реле вспышки выход
 
  lcd.begin(16, 2);                  // инициализация экрана
  lcd.clear ();
  }

  
 
void loop(){
    

  if (key() == 3) m--; // если нажата назад
  else if (key() == 4) m++;  // если нажата вперед  
  if (m > 4) m = 0; // проверка дабы не вылезти за меню
  if (m < 0) m = 4;     
    
 if (m==0)   
 
  lcd.clear();                         
  lcd.setCursor(0, 0);      
  lcd.print("1.Camera"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:");        
  lcd.print(CamT/10);            // переменная Интервал камеры 
  lcd.setCursor(7, 1); 
  lcd.print("msec");
  if(key()==5)CamT+=50;       // управление переменной кнопка 5 + 5мсек
  if(key()==2)CamT-=50;       // управление переменной кнопка 3 - 5мсек
  if(CamT < 0)CamT=9950;
  if(CamT > 9950)CamT=0;
 
 else if (m==1)            
  {
  lcd.clear();    
  lcd.setCursor(0, 0);      
  lcd.print("2.*Impuls-2"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:");        
  lcd.print(PrivT2/10);
  lcd.setCursor(7, 1); 
  lcd.print(" msec");  
  if(key()==5)PrivT2+=50;       // управление переменной кнопка 5 + 5мсек
  if(key()==2)PrivT2-=50;       // управление переменной кнопка 3 - 5мсек
  if(PrivT2 < 0)PrivT2=2950;
  if(PrivT2 > 2950)PrivT2=0;  
  }
 else if (m==2)            
  {
  lcd.clear();    
  lcd.setCursor(0, 0);      
  lcd.print("3.*Impuls-3"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:");        
  lcd.print(PrivT3/10);
  lcd.setCursor(7, 1); 
  lcd.print("msec"); 
  if(key()==5)PrivT3+=50;       // управление переменной кнопка 5 + 5мсек
  if(key()==2)PrivT3-=50;       // управление переменной кнопка 3 - 5мсек
  if(PrivT3 < 0)PrivT3=2950;
  if(PrivT3 > 2950)PrivT3=0;    
  }
 else if (m==3)             
  {
  lcd.clear();    
  lcd.setCursor(0, 0);      
  lcd.print("4.*Impuls-4"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:");        
  lcd.print(PrivT4/10);
  lcd.setCursor(7, 1); 
  lcd.print("msec");        
  if(key()==5)PrivT4+=50;       // управление переменной кнопка 5 + 5мсек
  if(key()==2)PrivT4-=50;       // управление переменной кнопка 3 - 5мсек
  if(PrivT4 < 0)PrivT3=2950;
  if(PrivT4 > 2950)PrivT3=0;
  }
 else if (m==4)             
  {
  lcd.clear();    
  lcd.setCursor(0, 0);      
  lcd.print("5.***Flash***"); 
  lcd.setCursor(0, 1);      
  lcd.print("Tm:");        
  lcd.print(FlashT);
  lcd.setCursor(7, 1); 
  lcd.print("msec");        
  if(key()==5)FlashT+=5;       // управление переменной кнопка 5 + 5мсек
  if(key()==2)FlashT-=5;       // управление переменной кнопка 3 - 5мсек
  if(FlashT < 0)FlashT=950;
  if(FlashT > 950)FlashT=0;
  }
   delay(200);
 


if(digitalRead(03)==HIGH&&flag==0)//если кнопка нажата   
     {
     delay (500);
     digitalWrite(11, HIGH);  //вкл
     delay (50);
     digitalWrite(11,  LOW);   // выкл
     delay (PrivT2);
     digitalWrite(11, HIGH);
     delay (50);
     digitalWrite(11, LOW);
     delay (PrivT3);
     digitalWrite(11, HIGH);
     delay (50);
     digitalWrite(11, LOW);
     delay (PrivT4);
     digitalWrite(11, HIGH);
     delay (50);
     digitalWrite(11, LOW);
     delay (CamT);
     digitalWrite(13, HIGH);
     delay (50);
     digitalWrite(13, LOW);
       flag=1;
            }
      if(digitalRead(03)==LOW&&flag==1)//если кнопка НЕ нажата
          {
    flag=0;//обнуляем переменную flag
          }



}
  



  

 

 

vvadim
Offline
Зарегистрирован: 23.05.2012

А почему не использовать проект фотодуино - там уже всё реализовано.

leshak
Offline
Зарегистрирован: 29.09.2011

Taller пишет:

Схема через  управление интервалами через delay () - работает, но я не могу регулировать интервал от первого импульса, получается только по порядку, последовательно, а  это меня жутко не устраивает, тяжело камеру настраивать.

Первый сигаренту с кофе я выкуриваю сразу после пробуждения.
Вторую - через час после пробуждения.
Третью - через три часа после пробуждения.

Вопрос: сколько времени у меня проходит между первой и второй сигаретой, между второй и третьей? Если я курю по таймеру, то на какие интевалы я должен "заводить таймер"?

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

Куренье вред !

leshak
Offline
Зарегистрирован: 29.09.2011

brokly пишет:

Куренье вред !

Оппа... никогда никто про это не говорил. Ну теперь буду знать. Спасибо.

Taller
Offline
Зарегистрирован: 25.02.2014

Принцип работы я понимаю.

Нужно оттолкнутся от одной переменной и добавлять новое значение после которого вудет выполнятся следующее действие.

Я сейчас застрял на таком моменте, не могу выполнить однократное действие по нажатию кнопки. 

#define LED_PIN  12      // номер выхода,подключенного к светодиод
#define  BLINK_INTERVAL  1000UL  // интервал между включение/выключением светодиода (5 секунд)
int flag=0; 

void setup()    
{ 
     pinMode(12, OUTPUT);         
} 

void loop() 

{
  blinkLed(BLINK_INTERVAL);  // мигаем
}

// мигает диодом с периодичностью interval
void blinkLed(unsigned long interval )
{
  if(digitalRead(03)==HIGH&&flag==0)//если кнопка нажата     и перемення flag равна 0 , то ... 
      { 
        delay(100);
        static unsigned long prevTime =0; // время когда последний раз переключали диод
        if(millis() - prevTime > interval ) 
        {
          prevTime = millis();  // 
          digitalWrite(LED_PIN,!digitalRead(LED_PIN)); 
        }
          flag=1;  
      }
        if(digitalRead(03)==LOW&&flag==1)//если кнопка НЕ нажата и переменная flag равна - 1 ,то ... 
        { 
        flag=0;//обнуляем переменную flag 
        } 
} 

Без flag светодиод мигает постоянно, с flag присходит колько включение или выключение. Я не могу понять куда запихивать этот flag чтоб светодиод включился и через  INTERVAL выключился 

leshak
Offline
Зарегистрирован: 29.09.2011

>Принцип работы я понимаю.

Не похоже. Раз вы жалуетесь на что вам "интервалами неудобно" задавать. Если понимаете, то задавать "абсолютное время", и автоматом пересчитывать их в интервалы - не должно вызывать проблем. А если вызывает значит все-таки не до конца понимаете. А раз не до конца, значит вначале нужно разобратся "на пальцах", на примери сигарет (кофе, поглаживаний кошки и т.п.). А потом это понимание реализовать в виде кода.

>Без flag светодиод мигает постоянно, с flag присходит колько включение или выключение.

Вы просто намешали одновременно два подхода. С использованием delay() и без использования. Без использования - сложней. Зато "можно в это время еще чем-то заниматся". В вашем случае (по описанию задачи) можно и "по простому". С помощью delay().

delay(interval1);
digitalWrite(PIN1,HIGH);
delay(ON_INTERVAL);
digitalWrite(PIN1,LOW);

delay(interval2);
digitalWrite(PIN2,HIGH);
delay(ON_INTERVAL);
digitalWrite(PIN2,LOW);
........


А уже потом, будете заниматся "что-бы срабатывало один раз" и т.п. А то вы с одной задачей не доразобрались, прыгнули на другую...

meteorvit
Offline
Зарегистрирован: 10.09.2017

Здравствуйте ! пример таймера с milis без delay .,где время вкл=время выкл.,а мне нужно например время вкл. 1мин,а выкл. 20сек.,без delay Хотелось бы пример рабочего скетча.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Скетч выкладывайте, который написали. Не пример, а свой.

Это тест на адеквата, иначе на вас и время никто не захочет тратить.

meteorvit
Offline
Зарегистрирован: 10.09.2017

void setup() {               

  // Инициализируем цифровой вход/выход в режиме выхода.
  // Выход 13 на большинстве плат Arduino подключен к светодиоду на плате.
  pinMode(13, OUTPUT);   
}
 
void loop() {
  digitalWrite(13, LOW);    // выключаем светодиод
  delay(600000);              // ждем  10минут
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(5000);              // ждем 5секунд
  digitalWrite(13,LOW );    // выключаем светодиод
  delay(240000);              // ждем 4минуты
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(4000);              // ждем 4секунды
  digitalWrite(13,LOW );    // выключаем светодиод
  delay(240000);              // ждем 3 минуты
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(3000);              // ждем 4секунды
  digitalWrite(13,LOW );    // выключаем светодиод
  delay(240000);              // ждем 3 минуты
}
 
 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

meteorvit, вы не прошли тест на адекватность к советам. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

С delay(600000) он бы не прошел тест на адекватность полюбому.

meteorvit
Offline
Зарегистрирован: 10.09.2017


void setup() {               
  pinMode(13, OUTPUT);   
}
 void loop() {
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(2000);              // ждем 2секунды
  digitalWrite(13,LOW );    // выключаем светодиод
  delay(5000);              // ждем 5секунд
}

Урезал ,как  теперь переписать код без delay?

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

meteorvit пишет:

Урезал ,как  теперь переписать код без delay?

Мигаем светодиодом без delay()

meteorvit
Offline
Зарегистрирован: 10.09.2017

В этом примере 1000 мс горит ,1000мс не горит светодиод,а нужно 2000мс горит,5000мс не горит.

b707
Онлайн
Зарегистрирован: 26.05.2017

meteorvit пишет:

В этом примере 1000 мс горит ,1000мс не горит светодиод,а нужно 2000мс горит,5000мс не горит.

Совет - сделайте отдельно включение, отдельно выключение, тогда сможете задать разные интервалы.

Если вы еще не поняли - готовый код не ждите.

meteorvit
Offline
Зарегистрирован: 10.09.2017

 Спасибо за совет!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

meteorvit . 4 вроде под вашу задачу#2    Я просто задалбываюсь делать одно и тоже. Каждый новичек считает что его задание уникальное.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

meteorvit пишет:

В этом примере 1000 мс горит ,1000мс не горит светодиод,а нужно 2000мс горит,5000мс не горит.

Клапачка, я надеюсь ты уже поместил ссылку на этот пост в свою любимую тему!

bwn
Offline
Зарегистрирован: 25.08.2014

meteorvit пишет:



void setup() {               
  pinMode(13, OUTPUT);   
}
 void loop() {
  digitalWrite(13, HIGH);   // зажигаем светодиод
  delay(2000);              // ждем 2секунды
  digitalWrite(13,LOW );    // выключаем светодиод
  delay(5000);              // ждем 5секунд
}

Урезал ,как  теперь переписать код без delay?

Например так:

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */
 
const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
 
long interval = 2000;           // интервал между включение/выключением светодиода (1 секунда)
 
void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);     
}
 
void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW) {
      ledState = HIGH;
      interval = 2000;}
    else {
      ledState = LOW;
      interval = 5000;}
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}

Самому никак не додумать?

 

meteorvit
Offline
Зарегистрирован: 10.09.2017

Спасибо! Благодарю за ответ.

bwn
Offline
Зарегистрирован: 25.08.2014

Благодарить то за что? Это локальной задаче поможет, а дальше снова вопросы возникнут. Алгоритмы рисуйте, а не методику "тыка" отрабатывайте.