Программа мигания светодиодами. Вопрос по таймерам и функции прерывания.
- Войдите на сайт для отправки комментариев
Чт, 04/12/2014 - 14:00
Доброго всем!
Имеется задача: 1. Разработать программу управления 5-ю светодиодными индикаторами (СД) с помощью двух кнопок, по следующему алгоритму: при нажатии на первую кнопку («Старт») (через каждые 5 сек) зажигаются СД, при этом каждый предыдущий СД не гаснет при включении последующего. Гашение СД происходит одновременно через 5 сек после того как будут гореть все 5 СД. Прекращение работы происходит только после нажатия на кнопку («Стоп»).
Я подключил к цифровым выводам с 5-9 диоды, на pin 2,3 кнопки.
int x=1;
void setup()
{
pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT);
attachInterrupt(0, blink, CHANGE); // привязываем 0-е прерывание к функции blink(). Это будет кнопка стоп pin 2
}
void loop() {
if (x==1)
{
digitalWrite(5, HIGH);
delay(5000);
digitalWrite(6, HIGH)
delay(5000);
digitalWrite(7, HIGH);
delay(5000);
digitalWrite(8, HIGH);
delay(5000);
digitalWrite(9, HIGH);
}
else
{
digitalWrite(5,LOW);
digitalWrite(6, LOW)
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
}
void blink()
{
x = 0; // Должно выключить все диоды
}
Этот кусок программы работает, но не по заданию. При нажатии на кнопку х=о, но пока цикл загорания всех светодиодов не завершится они не тухнут.
Знакомый предложил сделать таймер не через delay, а просто создать какой-то цикл и подсчитать время одного цикла тогда программа будет при каждом цикле проверять условие if (x==1) и при его не выполнении сразу же выключать все диоды.
А подскажите, может как-то более точно можно реализовать это или есть еще какие-то внутренние таймеры. Заранее благодарен за помощь. Просто даже нет мыслей в каком направлении смотреть.
как только нажата кнопка старт поочередно начинают загоратся светодиоды, в любой момент принажатии стоп все светодиоды гаснут
Спасибо. Буду разбираться, что тут написано. может пойму.
Для понимания упростил и добавил комментарии, поищите в нете что такое RS триггер и таймер с задержкой включения.
спасибо!
Здравствуйте, Вовчик!
Я не могу реализовать программу по управлению машинкой с использованием эхолокационного дальномера.
Думаю, что дело в delay. Если встретит препятствие, то должно повернуть.
Не могли бы вы мне сделать набросок программы?
Модет сначало распиновку, какие девайсы задействованы и вашу програмку.
vov4ik, может быть сможете подсказать по моей программе. Программа управления двумя светодиодными индикаторами (СД1 и СД2)с помощью 2х кнопок, по следующему алгоритму: Кнопка нажата – СД1 и СД2 переключаются попеременно через 20 сек, отпускание кнопки не приводит к прекращению работы СД. СД гаснут только при нажатии второй кнопки.
У меня получилось написать программу, время между диодами заменил на 5сек. Первый вариант программы получился таким, используется вн.таймер, при нажатии на кнопку старт есть пауза в 5 секунд потом загораются свеодиоды. При нажатии на кнопку стоп все диоды тухнут.
Теперь есть одна проблема, хотел сделать так чтоб при нажатии на кнопку Старт, диод начал гореть 5 секунд без всяких пауз. Добавил в цикл условие, если y==1 оно выполнится один раз после нажатия на кнопку и далее будет отсчитвыться 5 секунд и менять состояние диодов на противоположное. Сейчас ни как не могу понять, почему из этого цика не выходится ни как. при нажатии на кн. стоп программа не останавливается.
Вот код с добавленным условием
Вот нравится вам кидать программу туда сюда, ведь написал как работает RS триггер
if
( (digitalRead (2))) Q_RS = 1;
// проверяем состояние кнопки пин 2
if
( (digitalRead (3))) Q_RS = 0;
// проверяем состояние кнопки пин 3
сдесь всё просто приоритет у кнопки 3, в вашем случае при нажатии одновременно двух кнопок что будет выполнено button1() или button2()
простая мигалка
в вашем случае мигалку поставить под истинность Q_RS, digitalWrite(13,v3); заменить на digitalWrite(10,v3); с инверсией digitalWrite(9,!v3); 500 заменить на ваши 20000
Спасибо, я разобрасля) у меня вылетел провод от кнопки и я случайно воткнул его не туда и данные с кнопки давали имели случайный характер. отладил прогу с помощью консоли.