Мигаем светодиодами по таймеру.
- Войдите на сайт для отправки комментариев
Чт, 20/03/2014 - 16:41
Добрый день.
Помогите пожалуйста. Нужно мигать тремя светодиодами А, В, С. Как привязать срабатывание к таймеру, чтоб например диод В мигнул на 2,6 секунде и 3,4 секунде, а диод С на 6 -ой секунде и т.д. Длительность всего цикла до 10 сек.
http://arduino.ru/tutorials/blink
http://arduino.ru/tutorials/BlinkWithoutDelay
подскажите, а прежде чем писать в форум, вы что-нибудь сделали для решения своего вопроса? хоть в яндексе б вопросы задавали?
Это всё я уже по 5 раз перечитал, на этих примерах можно мигать одним светодиодом или несколькими но с заданой последовательностью. Тоесть поставил Мигать А, А, Б, С, и т.д и можешь изменять только интервалы между ними. А задача привязать к таймеру чтоб в зависимости от задачи можно было мигать какими хочешь и для каждого светодиода устанавливать время в которое ему нужно моргнуть.
О! вот теперь проясняется задача! Что мешает во втором примере трижды повторить код, и мигать нужным светодиодом, тогда когда millis() совпадет с заданым значанием?
Хорошо, тогда еще один вопрос.
Я занимаюсь фотографией, мне в процесе былобы проще использовать эту схему, чтоб можно было отталкиваться не от предудущего мигания, а от первого. Может подскажите хоть в какую сторону смотреть
В какую-то глобальную переменную записываете время первого мигания, а потом отталкиваетесь от нее.
Всё равно что-то не то у меня выходит завожу код в функцию кнопки, а у меня диод делает одно действие или вкл или выкл вод код
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 } }Вы более полно задачу опишите. Я, например, никак не могу понять, что вы хотите получить. Нажатие кнопки, мне например, больше по душе обрабатывать прерыванием. И код выкладывайте полностью.
Мне нужно управлять фотоаппаратом, вспышкой , и капельным приводом, это все небольшые импульсы, типа мигания светодиода. Чтоб при нажатии кнопки, проходил цикл из 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 } }А почему не использовать проект фотодуино - там уже всё реализовано.
Схема через
управление интервалами черезdelay () - работает, но я не могу регулировать интервал от первого импульса, получается только по порядку, последовательно, а это меня жутко не устраивает, тяжело камеру настраивать.Первый сигаренту с кофе я выкуриваю сразу после пробуждения.
Вторую - через час после пробуждения.
Третью - через три часа после пробуждения.
Вопрос: сколько времени у меня проходит между первой и второй сигаретой, между второй и третьей? Если я курю по таймеру, то на какие интевалы я должен "заводить таймер"?
Куренье вред !
Куренье вред !
Оппа... никогда никто про это не говорил. Ну теперь буду знать. Спасибо.
Принцип работы я понимаю.
Нужно оттолкнутся от одной переменной и добавлять новое значение после которого вудет выполнятся следующее действие.
Я сейчас застрял на таком моменте, не могу выполнить однократное действие по нажатию кнопки.
#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 выключился
>Принцип работы я понимаю.
Не похоже. Раз вы жалуетесь на что вам "интервалами неудобно" задавать. Если понимаете, то задавать "абсолютное время", и автоматом пересчитывать их в интервалы - не должно вызывать проблем. А если вызывает значит все-таки не до конца понимаете. А раз не до конца, значит вначале нужно разобратся "на пальцах", на примери сигарет (кофе, поглаживаний кошки и т.п.). А потом это понимание реализовать в виде кода.
>Без flag светодиод мигает постоянно, с flag присходит колько включение или выключение.
Вы просто намешали одновременно два подхода. С использованием delay() и без использования. Без использования - сложней. Зато "можно в это время еще чем-то заниматся". В вашем случае (по описанию задачи) можно и "по простому". С помощью delay().
А уже потом, будете заниматся "что-бы срабатывало один раз" и т.п. А то вы с одной задачей не доразобрались, прыгнули на другую...
Здравствуйте ! пример таймера с milis без delay .,где время вкл=время выкл.,а мне нужно например время вкл. 1мин,а выкл. 20сек.,без delay Хотелось бы пример рабочего скетча.
Скетч выкладывайте, который написали. Не пример, а свой.
Это тест на адеквата, иначе на вас и время никто не захочет тратить.
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 минуты }meteorvit, вы не прошли тест на адекватность к советам. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
С delay(600000) он бы не прошел тест на адекватность полюбому.
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // зажигаем светодиод delay(2000); // ждем 2секунды digitalWrite(13,LOW ); // выключаем светодиод delay(5000); // ждем 5секунд }Урезал ,как теперь переписать код без delay?
Урезал ,как теперь переписать код без delay?
Мигаем светодиодом без delay()
В этом примере 1000 мс горит ,1000мс не горит светодиод,а нужно 2000мс горит,5000мс не горит.
В этом примере 1000 мс горит ,1000мс не горит светодиод,а нужно 2000мс горит,5000мс не горит.
Совет - сделайте отдельно включение, отдельно выключение, тогда сможете задать разные интервалы.
Если вы еще не поняли - готовый код не ждите.
Спасибо за совет!
meteorvit . 4 вроде под вашу задачу#2 Я просто задалбываюсь делать одно и тоже. Каждый новичек считает что его задание уникальное.
В этом примере 1000 мс горит ,1000мс не горит светодиод,а нужно 2000мс горит,5000мс не горит.
Клапачка, я надеюсь ты уже поместил ссылку на этот пост в свою любимую тему!
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); } }Самому никак не додумать?
Спасибо! Благодарю за ответ.
Благодарить то за что? Это локальной задаче поможет, а дальше снова вопросы возникнут. Алгоритмы рисуйте, а не методику "тыка" отрабатывайте.