Светофор
- Войдите на сайт для отправки комментариев
Ср, 15/06/2011 - 08:02
Народ , нужна ваша помощь.
Встала задача сделать светофор и семафор для детского автодрома.
Два трехцветных светофора должны последовательно включать и выключать цвета .
Семафор должен 5 минут работать , 5 неработать , при том , в режиме работы
он должен мигать с частотой примерно 10Гц ,т.е. 5 минут мигает ,5 минут негорит.
Светофор и семафор должны быть независимыми друг от друга.
Вот в этом то вся проблема .
Мои попытки сделать на таймере ни к чему не привели.
Может у кого есть примеры подходящих таймеров ?
Железо:
фридуино
светодиодные кластеры
БП от компа
Микросхема ULN2003
...ну и мелочь
со светофорами все просто...
fritzing.org/projects/digital-inputoutput-traffic-light/
fritzing.org/projects/arduino-variable-cycle-traffic-lights-wpush-button/
fritzing.org/projects/the-weirdest-traffic-light/
(скетчи и схемы по ссылкам)
семафор думаю тоже не проблема, подцепить его через серву и по таймеру вертеть...
ЗЫ: семафор лучше связать со светофорами, а то будет ситуация как в жизни, то все едут, то всё стоит...
ну это конечно зависит от развяски дороги :)
Спасибо буду пробовать.
Под семафором я имел в виду жедезнодорожный светофор.
К сожалению не то .
Мне таймеры нужны.
в скетче прописать временные интервалы и усё...
или таймеры - цифровые индикаторы с обратным отсчетом?
это www.youtube.com/watch видео, как моргает светофор собраный по схеме fritzing.org/projects/the-weirdest-traffic-light/
временные интервалы и амплитуду думаю исправить не проблема...
на всякий случай скетч...
"Таймеры " это вместо delay.
Что бы программа не останавливалась в моменты задержек.
Вэтой программе присутствует паразитный delay ,который помешает работе семафора .
есть на форуме пример, про мигающий светодиод без приостановки всей программы написан с использованием millis() . Сравниваются 2 числа таймера и если оно равно времени задержки то загорается/тухнет. Пины если задаёшь значение 1 то оно так и держиться единицей пока не задашь новое значение)
Если вы это имели в виду , то с тремя цветами светофора оно не работает.
а почему нет? Сделайте 2 функции:
1я светофора
2я семафора
в loop()
будет идти проверки по интервалам и за поминании состояния в глобальную переменную
а дальше если да то функции семафора передали старт, так как это такие простые задачи для микроконтроллера то это всё будет происходить молниеносно и без каких либо задержек.
Далее еще можно внедрить DigitalWriteFast для ускорения вывода, но сомневаюсь что в нём будет нужда.
Давайте схему подключений помогу с программой) Что к какому пину и схему переключений цветов по времени, событиям
Буду очень юлагодарен если поможете с программой.
Схема простейшая , к выходам МК подключена ULN2003 (транзисторная сборка) через нее запитываем нагрузку -
светодиодные кластеры.
Девять пинов на два светофора, три пина на семафор (два горят попеременно , один постоянно).
Алгоритм :
Зеленый первого светофора горит 25с потом 5с моргает , в это время красный второго горит.
Зеленый гаснет , желтый включается , горит 10с , красный второго горит.
Желтый гаснет , включается красный 40с , красный второго гаснет включается зеленый второго.
Потом повторяется то же самое , только наоборот.
Вот программа для двух светофоров , которую я сделал на delay , а надо на таймерах , что бы семафор
работал независимо от двух светофоров.
Семафор :
Два пина работают попеременно 5минут (один работает 1с гаснет включается второй 1с и т.д.)
В течении этих же пять минут горит третий пин ( не моргает) , потом все гаснет на 5минут.
Таймеры нужны мне также для того что бы "Онлайн" опрашивать АЦП , для регулировки временной задержки
вкл/выкл семафора , с помощью переменных резисторов.
ОК,я всё ваше понял, ничего сложного не вижу
Adessit
Если честно , то я не умею работать с дополнительными функциями и прерываниями (просто не было необходимости в них),
но учиться нужно . Может дадите толковую ссылку (для чайников) , а то я что то не очень "впитал" статью про функции с этого сайта.
А как вызвать эту функцию ?
Как , вообще , будет выглядеть программа ?
константы
пины
переменные
все дополнительные функции
setup()
loop()
миллион проверок "Если" масса промежуточных значений, думал будет проще, но уже самому интересно;) код большой будет но всё коментирую на русском
Вызвать новую фнкцию просто, в loop гдето в коде просто пишешь svetoforOne(x,y,z) где х,y,z могут принимать или 1 или 0, что включает или выключает соответствующий цвет.x-красный, y-желтый, z-красный.
Но код обещает быть быстрым;)
Вот так оно даже компилироваться не хочет
void loop()
{
svetoforOne( g, y, r)
}
А напиши вместо g, y, r - (1,0,1)
Так как написал ты можно если ты в Loop даш тип данным и запишешь каждой букве значение от нуля до единицы
int g=0;
in r=1;
int y=0;
и этот код лишь одной функции - малая часть программы;)
а не проще ввести одну переменную и увеличивать ее на еденицу
всем сигналам присвоить константные значения и сравнивать с переменной
при достижение равенства (событие) плюс много связанных событий со сменой знака
Ну задача одновременно чтоб работали 2 светофора и один семафор, чтоб переключения зависили только от времени, "паралельно" всё работало.
Ваш код? А то не много не понял вас. Если про секундный счетчик то я понял, я так и думаю сделать, учет вести не в милисекундах а в секундах
ААА я нашел)))))))))))))))))
Опечатка в программе!!!! Некоторые коментарии нужно перепроверить
Вот ниже будет полный код на 2 светофора:
По удалял свои все сообщения которые были тут в процессе поиска бага
Огромное вам спасибо.
А как сделать так чтобы задержки семафора регулировалис через потенциометры ?
Т.е. куда вставить переменную значения полученую с АЦП ?
ну хорошо что разобрались а я все равно чего то не понял наверно просто не вникну никак в задачу
вы мне так для интереса скажите вот светофоры 2 штуки они значения разные показывают или просто дублируют друг друга ?
А вы посмотрите на обычный перекресток и все поймете.
Перекресток - это пересечение двух дорог , два светофора регулируют движение на каждой из них.
Они работают , так сказать , в противофазе , когда на одном зеленый - на другом красный .
Развести паралельно один светофор от другого нельзя т.к. не совпадут временные задержки.
Если бы все цвета горели одинаковое время , скажем , минуту то тогда можно было бы развести паралельно хоть 10 светофоров.
ну тоесть я прав это по сути один светофор только когда в одном зажигается красные диоды в другом зеленые
и упровлять можно одним светофором только подобрать противоположные значения в другом так ?
если это перекресток то оба зелеными быть не могут ?
Нет , не так.
Время горения красного равно времени горения зеленого +желтого.
Если развести все от противоположных цветов то : когда на первом включается желтый на втором включиться зеленый ,
а должен быть красный .
В общем пока на одном горит зеленый +желтый , на другом будет красный и наоборот.
Я сделал задержки зеленый 30с , желтый 10с , красный 40с.
Тут семафора еще нет, не успел дописать. По конкретнее какую величину в семафоре надо крутить?
Обе величины .
От 0 до 10 минут.
Тоесть время работы семафора от 0 до 10 и время когда весь семафор выключен от 0 до 10? Регулировать одновременно одним переменником сразу две величниы? или 2 переменника, по конкретнее
Два переменника.
Одним регулируется время работы , другим время не работы.
По хорошему , еще нужно сделать ИК управление , но это я сам (опыт есть).
Алгоритм такой : по команде с пульта производится инвертация ноги (скажем 13)
потом потом оператор if проверяет условие , если 13 нога HIGH то идет работа только с пультом (инвертация (вкл/выкл) цветов)
а если 13 нога LOW то идет автоматическая работа (ваша программа).
Можно ли так сделать ?
Можно ли просто заключить вашу программу в скобки оператора else , что бы она работала только когда включается оператор
else ?
я добью семафор остальное вы уже сами) Всё можно, всю программу в одну проверку запихнуть,а можно и спрерываниями играться.
Зачем прерывания если можно так ?
мы друг друга не понимаем. ИК пультом что собираетесь делать? По очереди включать каждый из 9ти цветов? И моргать тоже пультом? Понимаю пультом просто вкл/выкл всего и регулировать секунды переключений) Вот в последнем случае нужны прерывания
Пульт нужен для вкл/выкл 6 цветов (двух светофоров).
Например на пульте 7 кнопок , 1 отключает автоматическую программу и переходит в ожидание следующих команд с пульта.
Остальные инвертируют (вкл/выкл) шести цветов .
Т.е. я подаю с пульта комаанду - автоматическая программа отключается , затем нажимаю другую кнопку -
включается зеленый и горит пока я не нажму эту же кнопку еще раз , то же самое и с другими цветами.
Сесафор не затрагивается (работает независимо от светофоров).
Можно сделать и более сложный алгоритм .
Мне главное понять как включать и отключать автоматическую программу .
Мне кажется , идеальным решением будет конструкция if/else .
adessit , я тут пытаюсь в ваш код вмонтировать управление с ИК пульта (два режима , ручной и автоматический)
Но что то не получается.
Сбиваются таймеры.
Может подскажете как лучше сделать.
delay(500); - вот где ваша ошибка. Вы от них отказывались, а тут вставили, это пол-секунды, а если постоянно - то выйдет много задержки.
Прошу прощения что не могу закончить ваш код. Нереально много работы на работе.
Спасибо за подсказку.
Но делай там нужен для фильтрации "дребезга".
Значит буду искать другой фильтр.
ну попробуйте опять же через таймера чтение, через millis
Попробовал без delay. То же самое.
Выложите код без delay()
Абсолютно то же самое только без delay.
Там некоторые коменты не соответствуют действительности.
Фильтровать "дребезг "я буду позже.
Сначала нужно сделать нормальный переход между ручным и автоматическим режимами.
Эврика , господа !!!
Делал часы , получился светофор.
Код получился : легкий , быстрый , без задержек , интуитивно понятный и главное не мешающий выполнению других програмных блоков.
Принцип простой как табуретка , но к этой табуретке я шел месяц (или больше ?).
Программа довольно "сырая" (главное донести принцип) , но если "причесать" - будет вообще хорошо.
Запускаем таймер , который отбивает секунды , и закладывает их кол-во в переменную.
Ну а дальше включаем/выключаем пины при определенных значениях этой переменной.
В конце цикла двух светофоров обнуляем переменную.