Скетч светофора без delay.
- Войдите на сайт для отправки комментариев
Пт, 27/03/2015 - 21:35
Прошу помощи,я уже писал в нескольких темах о своей проблеме.Ардуино только начал осваивать,буду рад любым замечаниям и комментариям.Собственно стоит задача реализовать светофор с включением от удержания кнопки 5 сек. c начала работы программы не менее 2с,хотя последнее условие не обязательно выполнять.Написал скетч,опять же как мог,а он не работает.Заранее спасибо за помощь.
int pedYellow = 12; //желтый
int pedRed = 13; //Красный
int pedGreen = 8; //Зеленый
int button = 2; //Контакт кнопки
int crossTime = 5000; //Время ожидания
unsigned long changeTime; //Время с начала работы программы
void setup() {
// Контакты на выход
pinMode(pedYellow, OUTPUT); // Светодиод желтый
pinMode(pedRed, OUTPUT); //светодиод красный
pinMode(pedGreen, OUTPUT);
//Контакт на вход (кнопка)
pinMode(button, INPUT);}
//Кнопка
void loop() {
//Нажать кнопку
int state = digitalRead(button); //Получаем статус кнопки
delay(5000);
int state2 = digitalRead(button);
//Если кнопка нажата и время с начала работы программы минус changeTime больше 2 сек, то
if (state == state2) {
if (state == HIGH && (millis() - changeTime) > 2000) {
//1. Действие
digitalWrite(pedYellow, HIGH); // Включаем желтый
delay(2000); // Ждем 2 сек
//2. Действие
digitalWrite(pedYellow, LOW); // Выключаем желтый
digitalWrite(pedRed, HIGH); // Включаем красный
delay(1000); // Ждем 1 сек
//3. Действие
digitalWrite(pedRed, LOW); // Выключаем красный
digitalWrite(pedGreen, HIGH); // Включаем зеленый
delay(crossTime); // Ждем 5 сек
// Мигаем зеленым для пешеходов 5 раз
for (int x = 0; x < 5; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
}changeTime = millis(); //changeTime равно время с начала работы программы
}
готов помочь в свободное время ( и дети подключатся ) , только алгоритм нужен поточнее-поподробнее....
....да , видел вас :)
Написал скетч,опять же как мог,а он не работает.
фиг !!!!! он работает ! как вы и написали код..... только результат работы кода - не как вы хотели......
...не пеняйте на ардуину ! :)-
Спасибо большое за ответ!!!!Опыта в написании программ практически нет,до этого писал на delay,собирал схему на макетной плате,все работало(т.е. светодиоды мигали в заданном режиме и времени).После осознания ошибки выбранного пути,вернее подсказки,накидал скетч светофора без delay-в итоге после удержания кнопки 5,и соответственно прошествии 2 сек. работы программы светодиоды не оживают,хотя скетч проходит проверку в программной среде.На ардуино не пиняю ни в коем случае,пиняю на кривые руки и недоразвитый мозг:-)Если не трудно,какой результат то хоть получился?
Спасибо большое за ответ!!!!Опыта в написании программ практически нет,до этого писал на delay,собирал схему на макетной плате,все работало(т.е. светодиоды мигали в заданном режиме и времени).После осознания ошибки выбранного пути,вернее подсказки,накидал скетч светофора без delay-в итоге после удержания кнопки 5,и соответственно прошествии 2 сек. работы программы светодиоды не оживают,хотя скетч проходит проверку в программной среде.На ардуино не пиняю ни в коем случае,пиняю на кривые руки и недоразвитый мозг:-)Если не трудно,какой результат то хоть получился?
подумай пока над тем что :
- все операторы в секции сетап выполняются сверху до низу ОДИН раз пр запуске
- все операторы в секции луп выполняются сверху до низу в цикле !
и опять - сверху до низу
и опять - сверху до низу
Если совсем без delay(), то так
понадобится эта библиотека.
https://yadi.sk/d/hGQy8xu1fZNks
класс DI считывает входы клавиш и фильтрует дребезг. Кнопки должны быть подключены как здесь:
http://wiki.amperka.ru/конспект-arduino:миксер
класс Meander - для меандра мигания
класс Timer_P - для формирования задержки после нажатия на кнопку и для основного цикла светофора. (два таймера)
http://youtu.be/zbuOzEBgoVI
что-то я не понял тз, как-то невнятно оно написано
Временной профиль в массиве, его длина 120 т. о. по полсекунды на кадр. Мигает 3 раза, и это можно подредактировать. 0 - всё выключено, 1 - красный, 2 - жёлтый, 3 - оба, 4 - зелёный (что видно из свитча). Жать кнопку на D2 долго (5 сек или больше) - включится, нажать долго или кратко, но минимум через 2 сек после включения - отключится. Из питания можно исключить линейный стабилизатор, тогда в выключенном режиме ест микроамперы (то есть кнопка и будет служить выключателем). Кнопка от D2 к Gnd.
Донатить на ЯД 410011919696337 :)
Спасибо большое всем тем,кто откликнулся!!!Действительно,я,наверное,не правильно,вернее туманно обрисовал ТЗ.Просто сам пытаюсь,с малого,поэтому не все написал.насчет без delay- предыдущий скетч не работал,вернее кнопка,так как delay ее блокировал.Насчет вариантов решений-они бесспорно очень хороши!к сожалению я медленно отвечал,поэтому исправляюсь!Итак:1.Светофор.Три индикатора обозначают цвета.2.Кнопка-короткое нажатие-не более 2 сек.-перевод в дежурный режим(мигающий желтый)3.кнопка-долгое нажатие - не более 3 сек.-отключение нагрузки.И самое интересное для меня,даже не знаю как реализовать 4.Предусмотреть подключение нагрузки с потребляемым током до 2.5ампер на канал.Просьба,большая,обойтись малой кровью-без меандров и массивов,если это возможно,потому как разбираться надо с азов,а до них я еще не скоро доберусь-допустим мой скетч в шапке темы не годится вообще,или я сделал ошибку в нем?Уважаемый STD,вы поставили меня в неловкое положение,я сам виноват,конечно,ТЗ довольно туманно обрисовал,Вы сделали работу,не жалко было бы и задонатить,чем можно,но она оказалась бесполезна для меня.1-Пока не разбираюсь так глубоко,как Вы в этом коде,для меня разобраться и повторить при необходимости важно2.-немного не попали в ТЗ.
ув. Пельмень, я лишь предлагаю :)
Разные режимы работы кнопки приведут к некоторым квестам (понадобится делать прерывание CHANGE, и ловить также время отпускания, чтобы понять длительность), так что лучше две. На D2 или D3 (прерывания) - выключатель питания, на ещё каком-нибудь входе - переключатель светофор/мигать жёлтым.
Чтобы коммутировать 2.5 А, достаточно почти любого транзистора с low-ultralow Rds(on), главное чтобы управлялся лог. уровнями (Vgt = 4 В или ниже). Это к коду не относится, для тех кто в танке.
Исходный скетч принципиально рабочий, но хуже воспринимается лично вами. Пишите код, который проще понять. Всегда.
Лехко. Написано же,
"тз" все-таки какое-то мутное. пока четко не сформулируете что вам нужно вряд ли кто-то толково поможет.
какие есть режимы работы? я так понял режима три:
1."выключено" (ничего не горит)
2."дежурный" (мигает желтый)
3."рабочий" (красный-желтый-зеленый по очереди)
какой режим устанавливается при старте системы?
Переключать режимы разной длительностью нажатия клавиши - геморрой еще тот. Гораздо проще циклически переключать режимы одержанием клавиши в течение, скажем, 1сек.
Вешать клавишу на прерывание без аппаратной фильтрации на триггере Шмитта - плохая идея. Будете ловить каждый дребезг.
Организовать задержку срабатывания с использованием прерывания - геморрой, равнозначный использованию delay().
Организация меандра сигнала - самый простой способ сформировать мигающий сигнал без delay().
Ув. STD Вы правы,проще,наверное поставить две кнопки-меньше проблем,тем более,как уже отмечалось,что ТЗ довольно неоднозначно звучит.Одна включение-выключение,другая переключение режимами работы.Про транзистор на ток 2.5 А даже не подумал,что реализовать можно схемно,спасибо за подсказку.
Ув. KVadik согласен,ТЗ звучит очень неоднозначно.Думаю проще будет сделать как предлагал ув.STD.
Благодарю за подсказки!Думаю мне не стоит так глубоко лезть пока...Воспользуюсь советами форумчан.
Ув. KVadik согласен,ТЗ звучит очень неоднозначно.Думаю проще будет сделать как предлагал ув.STD.
С точки зрения разработки, вариант std для Вас будет, пожалуй, самый "сложный", т.к. Вам придется работать с прерываниями. С точки зрения юзабилити самый "сложный" вариант Ваш. Проще всего сделать как X-Dron предложил. Ну или несколько кнопок, как предложил std, но обойтись без прерываний.
Так пойдет?
http://youtu.be/LBmVHV8NmH4
если да - выложу код. Управление одной клавишей с удержанием в секунду.
Для мигающей нагрузки с большими токами крайне рекомендуется использование SSR(Solid State Relay) - твердотельных реле.
Не сочтите рекламой :) Может вам пригодится моя реализация светофора? Там есть простой вариант, а есть вариант с кнопкой/экраном/пищалкой.
Ув. X-Dron видео не открывается...Спасибо,что не безучастны в моей теме.ПИшет пользователь заблокировал доступ:-)
Благодарю за ответ!!!!Тут маленько не так,проблемы я так понял с работой кнопки-как я понял ТЗ-Состояние светофора включается сразу,затем удержанием копки 2 сек. включается дежурный режим-мигает желтый...Затем при включении этой же кнопки 3 секунды и более светофор выключается.В любом случае,спаибо за ответ!
Попробуйте сейчас. Ссылка та же.
Ув. X-Dron,ссылка работает,видео очень интересно для меня!В принципе как я понял ТЗ,это то,что Вы и реализовали.Один вопрос- Вы одной кнопкой режимы переключали и выключали светофор?Просто на видео две кнопки.
Только вот по секундам не распознял я,2 сек-желтый вроде,а ывключение 3?И еще вопрос-если шилд подключать,как мне здесь советовали,нужно под него отдельный код писать и библиотеку искать?
код
Управляется одной клавишей с задержкой переключения режимов 2 сек.
вот здесь в проекте (там внизу исходники) сделано не только без delay но еще и все на прерываниях, МК все время спит
правда это чисто Си, а не ардуиновский С++, но там разница с ардуино минимальна
http://radiokot.ru/circuit/digital/game/41
огромная благодарность в помощи!!!!код поа не пробовал,постараюсь в ближайшее время.Не подскажите еще,как правильно подключать кнопку на макетной плате,интересует не принцип,а практически.
огромная благодарность в помощи!!!!код поа не пробовал,постараюсь в ближайшее время.Не подскажите еще,как правильно подключать кнопку на макетной плате,интересует не принцип,а практически.
кнопкаКонтакт_1 = земля , кнопкаКонтакт_2 = пин , включить внутреннюю подтяжку пина к VCC....
...нажатие кнопки = if(digitalRead(пин)==LOW))
кнопкаКонтакт_1 = VCC , кнопкаКонтакт_2 = пин , пин через резистор 10 kOm на GND.....
...нажатие кнопки = if(digitalRead(пин)==HIGH))
первый вариант - не нужен внешний резистор, второй - нужен.... код обработки - разный....
...оба варианта подключения - равноправны
Ув.SU-27-16 я больше спрашивал о практической части...куда какой провод подключается к кнопке,если нужно использовать 10КОм,то получается на кнопку идут 2 провода,как реалиовать это на макетной схеме?
И один на вход к конпке,конечно же
странно... в #27 всё описано до тонкостей....
в #5 написано как подключать кнопки, если используете мой код
Ув.SU-27-16 я больше спрашивал о практической части...куда какой провод подключается к кнопке,если нужно использовать 10КОм,то получается на кнопку идут 2 провода,как реалиовать это на макетной схеме?
http://arduino.ru/tutorials/button
в #5 написано как подключать кнопки, если используете мой код
извини, но я там не нашёл такого.... как подключить....
...не все по коду понимают - как ЕЁ подключить :(
Кнопки должны быть подключены как здесь:
http://wiki.amperka.ru/конспект-arduino:миксер
http://arduino.ru/tutorials/button
это один из вариантов.... в моём посте - номер 2
Кнопки должны быть подключены как здесь:
http://wiki.amperka.ru/конспект-arduino:миксер
это вариант 1 :)
Ещё можно добавить вариант 3 ;)
Ещё можно добавить вариант 3 ;)
добавьте-просвятите.... с одновременной отправкой заявки на на Нобелевскую премию....
....шутка, канечно же :)
Да я подключение нескольких кнопок к аналоговому входу.
Благодарю,этот вариант наиболее понятен для моего восприятия как шаблон.уже думал навесным монтажом паять.
Да я подключение нескольких кнопок к аналоговому входу.
это частный вариант.... моя ждал чего-то.... которое с ног на голову перевернёт МК :)-
В ходе работы назрело еще несколько вопросов,если они не новые,прошу отправить к первоисточнику.Ув.X-Dron ситуация в следующем-код работает на ура,но с одной оговоркой-режимы переключаются только тогда,когда вытаскиваешь из макетной платы провод с разъема 3 платы,а затем нажимаешь кнопку.Без этих действий режим вообще не переключается...Может собрал схему не так,но я по шаблону старался делать.Второй вопрос-каким параметром в таймере задается время мигания светодиодов?Третий-библиотека,которой Вы поделились здесь написана Вами,или есть в свободном доступе?
Прошу прощения,в первом вопросе разобрался-не к тем контактам подключил провод с платы под номером 3.
Период цикла светофора задается в
Cycle.TimerV(!Cycle.Q0() && mode==0, false, 2, 15000);
Т.е. каждые 15сек он пересбрасывается и начинает считать заново. Время до очередного пересброса записывается в пеерменную Remains
Сравнения с Remains определяют гореть или не гореть светодиоду. Начало цикла синхронизовано с включением красного светодиода
digitalWrite(LedRed, Remains >8000); говорит, что красный горит, 7 секунд с 15000 до 8000 по Remains
digitalWrite(LedYellow, Remains <10000 && Remains >8000); желтый с 2 секунды с 10000 до 8000 по Remains, т.е. гаснет одновременно с красным.
digitalWrite(LedGreen, (Remains <8000 && Remains >3000) || (Remains <3000 && P_1s.Q0())); горит 5 секунд с 8000 до 3000 по Remains, если меньше 3000, то мигает
Не просвятите,как образовалась библиотека скетча?она универсальная,что описывает,если не трудно?
Библиотека моя, естественно находится в свободном доступе, раз дал ссылку. Основной зеркало на github
https://github.com/X-Dron/X-Dron_lib
на ЯндексДиске - актуальная копия с которой работаю сам.
Библиотека универсальна.
пошло с этого
http://arduino.ru/forum/programmirovanie/taimery-i-programmnyi-antidrebe...
http://forum.amperka.ru/threads/%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%...
Я польщен вниманием Вашим вниманием!16 лет программирования промышленной автоматики!!!!Еще раз огромная благодарность Вам и Вашим учителям!
Библиотека моя, естественно находится в свободном доступе, раз дал ссылку. Основной зеркало на github
https://github.com/X-Dron/X-Dron_lib
на ЯндексДиске - актуальная копия с которой работаю сам.
Библиотека универсальна.
пошло с этого
http://arduino.ru/forum/programmirovanie/taimery-i-programmnyi-antidrebe...
http://forum.amperka.ru/threads/%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%...
Как Вы считаете,с функцией delay возможно реализовать то же самое?
Имеется в ввиду,те же функции кнопки,и работу диодов?
Народ, я ни одного кода ещё не написал на ардуино, но уже собрался светофор делать в детсад обучать детей. Напишите, пожалуйста, скетч с пояснениями. Буду очень благодарен за подробное описание, так как не хочу останавливаться на этом.
Тех задание такое:
При подаче питания моргает жёлтый по 1 сек. Светофор управляться будет 4мя кнопками с радио пульта подключенного на аналоговые пины A2, A3, A4, A5 (удобно плату приёмника подключить сюда). Лампочки запитаю через реле (т.к. будет потребление большое) в те пины куда скажете (мне нравятся цифровые 7, 6, 5, 4).
A2 - вкл/выкл режима светофора (50 сек зелёный, зелёный мигает 3 раза по 1 сек, жёлтый 3 сек, красный 50 сек, красный с жёлтым 3 сек)
A3 - зелёный
A4 - жёлтый
A5 - красный