как Включить на некоторое время?
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые форумчане!
Я только совсем начал пробовать ардуино, посмотрел азы всё такое, диодиками моргал, сейчас встала реальная задача, и я зашел в тупик.
В общем у меня подключен насос к ардуино, и мне необходимо чтобы он через 3 минуты включался на 10 секунд... я пока что использовал delay, но дело в том, что у меня еще кучка вещей которые должны подключиться к ардуино, и мне нужно чтобы выполнение программы нетормозилось... я хотел использовать прерывания по таймеру, нагуглил пример про диод который включается на секунду и через секунду выключается... а мне надо маленькое иное... и у меня нехватает мозга переделать код в свою пользу... помогите пожалуйса, просто это очень важный момент и мне еще нужно будет многое устроеть по аналогичному принципу работы... заранаие спасибо.
В общем как то так - здесь независимо управляется двумя выводами:
проверить не пока не начем. По аналогии делаете сколько нужно таких таймеров.
я вам очень благодарен... завтра попробую, время просто уже оч много спать охото.
Выдает ошибку в 4ой строке
error: expected unqualified-id before numeric constant
А еще в разделе программирование есть пример
"Мигаем светодиодом без delay"
А еще в разделе программирование есть пример
"Мигаем светодиодом без delay"
читал я его... но я же писал что там он скоко горит стоко и негорит... малех разное...
если вам пошагово нужно разжевывать, почему оно работает так, и как сделать чтоб оно работало иначе, то что тут можно сказать... как вы остальное то добавлять будете...
кстати, пример кода приведённый во втором посте рабочий, по крайней мере 13й пин мигал точно по заказанным интервалам. попробуйте не перепечатывать код, а скопировать и вставить.
проверял... на 3ей строке выдает туже ошибку.... незнаю в чем причина
Версия IDE какая?
Вы что нибудь в коде меняете?
Попробовал - у меня сей скетч компилируется без проблемм.
Это еще может из-за бажных библиотек быть. Попробуйте, у вас пустой скетч. с пустыми setup и loop компилируется?
А..... я догадался :)
Вы как скетс с форума копируете? Выделили и скопировали?
Тогда еще номера строк захватываются. И их нужно руками удалять.
Но есть "хитрость". наводим мышку на код и смотрим в верхний правый угол. Там появится иконки - посмотреть код без нумерации, или сразу скопировать его чистым в клип-боард.
спасибо! вот оно реальное решение вопроса))) меня еще удивило, сначало ошибка в 4ой строке, потом в 3ей.... теперь всё верно... спасибо большое всем, по коду мне впринципе все понятно... я код понимаю токо писать сам еще неособо могу, токо начинаю... нюансов много.
Ну тогда, на всяк случай, прочитайте еще как правильно вставлять код, вдруг понадобится :)
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Обясните пожалуйста подробней этот кусок кода:
Меня беспокоит 32 строчка - millis(), такое ощющение что это сработает только 1 раз, т.к. millis() нигде не обнуляется и пойдет дальше. Или я ошибаюсь? + millis() насколько я понимаю умеет хранить значение от 0 до 4294967295. Это около 50 дней. После обнуления этот код нормально себя будит вести?
Задача включать 1 свето диод каждые 2 дня на 30 секунд. И второй каждые 3 дня на 40 секунд.
Задача включать 1 свето диод каждые 2 дня на 30 секунд. И второй каждые 3 дня на 40 секунд.
millis() нельзя обнулить ("обычными средствами"), прочитайте внимательно описание этой функции, эта функция только возвращает текущее значение счетчика с запуска МК.
В вашем случае лучше использовать таймер реального времени - RTC, например, DS1307.
Тоесть насколько я понимаю в вашем примере new_millis_svet с каждым включением\выключением увеличивается, так?
В таком случае может случится такое? - Допустим new_millis_svet после долгово времени у нас стал 4294967200 в какое-то время millis() становится больше, включается свет и в new_millis_svet присваивается еще + 180000 получается уже 4295147290.
Но в millis() ведь есть придел на хранение данных и допустим при 4294967295 он обнулился и начал считать с нуля. Заметьте new_millis_svet у нас стало больше чем максимальное число в millis() таким образом больше не включится свет. Так получается?
Если вы не заметили, то new_millis_svet тоже имеет тип unsigned long, который так же может принимать значения от 0 до 4294967295, поэтому стать больше эта переменная не может, а при переполнении тот остаток, который "не влезет" в переменную будет записан в нее после ее обнуления, так что все будет в порядке.
Не совсем так.
Рассмотрим проблему на примере байта (0...255). При счете от 0 с шагом 10 (TIME_OFF_SVET/TIME_ON_SVET=10) вплоть до 250 все будет в порядке. Но затем:
new_millis_svet = millis() + TIME_OFF_SVET => 250+10 => 300 -> 4
И с этого момента условие
будет исполняться при каждом прохождении цикла до тех пор, пока счетчик millis не достигнет значения 255 (мы ведь и его до byte укоротили), не произойдет переполнение и он не обнулится. После этого сумасшествие закончится. Вплоть до нового подхода к опасной границе.
Крах идеи? Вовсе нет. Просто условие следует переписать:
И тогда для случая, когда old_millis_svet=250, а millis()<=255 (пусть будет 254), имеем:
254-250=4 < 10 - все нормально
После того, как счетчик перевалит через 255 и снова начнет считать с 0:
0-250=-250 => 6 < 10 - все нормально
Ну и далее - вплоть до millis()=5:
5-250=-245 => 11 > 10 - условие выполнилось, переходим к миганию диодами.
PS: old_millis_svet, как вы понимаете - момент последнего мигания. В противоположность моменту следующего мигания (переменной new_millis_svet).
Спасибо. Разобрался.
Ну да, раз в 50 дней жди прикола ))) на несколько минут.
Ну да, раз в 50 дней жди прикола ))) на несколько минут.
Да нет. Если использовать подход step962, и смотреть разницу "сколько прошло", а не заранее вычислять время "когда нужно будет выключить", то и через 50-дней прикола не будет.
Кстати сам долгое время именно "вычислял", как-то оно "интуитивней/человечней" (и не понимал зачем в туториалах через разницу делают). Потом как-то наткнулся на переполнение, вначале написал через if-фы сравнивал кто больше, кто меньше и разную логику вычисления делал... заработало. Начал сокращать и пришел к тому что в обоих случаях код одинаковый. Не понял "как это".... начал думать, как раз используя прием step962 взяв для примера 0...255. И дошло. При переполнении у нас разница выходит отрицательная, происходит "переполнение в обратную сторону" и .... все хорошо. millis()-eventTime всегда дает правильный интервал если пользоватся беззнаковыми типами.
Правда если во время "Ожидания" дважды уложится 49 дней.... вот тут уже нужно будет что-нибудь хитрить.
Этот способ просто удобнее (вычислять заранее), да и не так часто делается устойство, которое будет работать без перезагрузки более 50 дней, поэтому тоже имеет место быть.
Этот способ просто удобнее (вычислять заранее), да и не так часто делается устойство, которое будет работать без перезагрузки более 50 дней, поэтому тоже имеет место быть.
compot, создавший эту тему, наверняка рассчитывает держать включенным arduino постоянно. :)
И я бы был осторожней с выражениями о том что мало у кого arduino работает более 50 дней. В моем городе есть маленькая фирмачка, которая занимается так называемыми "Умными домами". К моему удивлению они в большинстве проектов сейчас используют именно arduino - который следит за температурой в доме, светом. Как вы понимаете он должен быть включен постоянно.
>>Как вы понимаете он должен быть включен постоянно.<<
Не обязательно. МК вполне можно сбрасывать , скажем раз в сутки. Чтоб не обнулились значения нужных переменных можно писать их в ипром перед сбросом.
Я как то делал светодиодную вывеску. Программка не сложная , но вывеска должна была работать без выключения - постоянно.
Я просто включил релюшку в разрыв питания МК , включение релюшки с ноги МК. МК дергал эту релюшку раз в пять суток. Вот так и работает до сих пор. Уже около года без фактического отключения всей вывески.
compot, создавший эту тему, наверняка рассчитывает держать включенным arduino постоянно. :)
Ну я за него рад ) как говорится "дареному коню...", надо будет сам исправит.
>>Как вы понимаете он должен быть включен постоянно.<<
Не обязательно. МК вполне можно сбрасывать , скажем раз в сутки. Чтоб не обнулились значения нужных переменных можно писать их в ипром перед сбросом.
Я как то делал светодиодную вывеску. Программка не сложная , но вывеска должна была работать без выключения - постоянно.
Я просто включил релюшку в разрыв питания МК , включение релюшки с ноги МК. МК дергал эту релюшку раз в пять суток. Вот так и работает до сих пор. Уже около года без фактического отключения всей вывески.
Так можно было просто дергать ресет соседней ногой.
>>Так можно было просто дергать ресет соседней ногой.<<
Не получится. При запуске МК дергает всеми ногами. Он просто войдет в состояние бесконечного резета. А на релюшке нехилый кондер стоял. Короткого импульса не хватало а вот удержания напруги в течении нескольких секунд вполне.
Да ну ладно вам, вы сами это проверяли? Все нормально, бут дергает только 13 вывод (у меня Duemilanove).
Проверьте, вот вам блинк с ресетом, 12 ногу на ресет.
Да и даже если и так, то поставили бы кондер на ногу и через диод на ресет, я не критикую, просто реле это как-то грамоздко.
>>Так можно было просто дергать ресет соседней ногой.<<
Не получится. При запуске МК дергает всеми ногами. Он просто войдет в состояние бесконечного резета. А на релюшке нехилый кондер стоял. Короткого импульса не хватало а вот удержания напруги в течении нескольких секунд вполне.
А ресет дергать через RC цепочку?
А вообще конечно "с ума сойти". Вместо поменять логику - добавлять деталь. Но... вы знаете, как ни странно вызывает восхищение способность "получить результат".
Мне кажется вы живая иллюстрация к статье Легкий способ бросить писать идеальный код
>>Вместо поменять логику - добавлять деталь.<<
В смысле. Я резетил МК не для каких то конкретных целей а просто для профилактики. Т.к. я не знаю как поведет себя прогрмма через год. Так вот и пусть себе резетится раз в пять суток.
maksim, действительно! Я почему то свято верил в то чтоМК дергает всеми ногами.
Где то была такая тема, что у кого то МК при запуске дергает всеми ногами, и кстати, а может и дергает, но логическая 1 не сбросит МК, а наоборот.
>>Вместо поменять логику - добавлять деталь.<<
В смысле. Я резетил МК не для каких то конкретных целей а просто для профилактики. Т.к. я не знаю как поведет себя прогрмма через год. Так вот и пусть себе резетится раз в пять суток.
Честно говоря я бы больше верил год работающему контроллеру, которому не требуется смазка и тех.обслуживание, чем внешней детали (особенно если использовали реле механическое). Да вообще "не может сломатся деталь которой нет". Даже дорожка от ноги к ресету и то... дополнительные шансы на отказ.
Хотя, возможно, во мне програмер говорит. Давно заметил что кто пришел из "радио-кружков" что можно предпочитают решить "аппаратно", я, всегда, если что-то возможно сделать "програмно" - буду делать програмно. Фильтры, антидребезг и т.п.
В данном случае я бы скорее использовал watchdog.
Не думаю что какой-то из этих подходов является "истинно верным" (програмно/аппаратно), всегда должен быть "баланс". Но все мы люди. Поэтому "перекос" - всегда неизбежен. Просто перекос в "чужую сторону" - вызывает умиление, а в свою - гордость (в запущенном случае ;) или просто не заметен.
Давно заметил что кто пришел из "радио-кружков" что можно предпочитают решить "аппаратно"
Кстати, обратите внимание. Когда обсуждали жучки. То вы выбрали EEPROM решение, а мне больше импонировало "лишняя дорожка которую нужно перерезать" . Каждый выбрал то что дальше от его привычного мышления. То есть интуитивно такой жучок казался "более скрытным" ;)
Ипром был выбран по тому что в программе испльзовался блок для работы с ипромом. Я просто присоседил жука к нему.
Подскажите новичку. У меня похожая задача как у топикстартера. Но включаться должно на 0,2с до 1 с. Выключаться соответсвенно на 0,8с до 0с.
В голове вырисовался такой алгоритм. В конце общего цикла включать. В начале запоминать значение millis. Тогда исполнять остальную часть программы. В конце вычислять по новому значению millis сколько еще держать включенным. Тогда выключать на определенное время. А тогда в конце опять включить и на начало.
Вопрос. Хватить ли времени (около 0,2с) для выполнения основной части программы (считывание около10-15 датчиков, управление около 10-15 нагрузок по простым алгоритмам, вывод информации на экран)?
Не проходите мимо!
Вопрос. Хватить ли времени (около 0,2с) для выполнения основной части программы (считывание около10-15 датчиков, управление около 10-15 нагрузок по простым алгоритмам, вывод информации на экран)?
А как на этот вопрос может ответить кто-то кроме вас? Сделайте serial.println("Before:");println(millis()); до основной части и serial.println("After:");println(millis()); после.
Ну и узнаете сколько он у вас выполняется.
Если "слишком долго" - будете думать как улучшить. всякие delay(), pulseIn(), stepper(), while(ЧТО_НИБУДЬ_ЖДЕМ){} будете выкидывать.
>>Не проходите мимо<<
Cоздайте новую тему и распишите алгоритм по пунктам.
Помогите программно реализовать следующий алгоритм:
DC двигатель вращается в одном направлении в течении X минут,
останавливается и стоит Y мин,
DC двигатель вращается в ОБРАТНОМ направлении теже X мин,
останавливается и стоит теже Y минут.
Двигатель подключен с помощью шилда на L298n микросхеме.
можно поподробнее про пример step962 ?
Максимальное значение millis 4294967295, если мне надо задержку (время включения) в 1 секунду то мне надо записать TIME_ON_SVET = 1000;, а в old_millis_svet значение (4294967295-new_millis_svet), а new_millis_svet = millis() + TIME_ON_SVET
итого получаем последнюю строчку
или я что то напутал?