Как Blink встроить в таймер
- Войдите на сайт для отправки комментариев
Пт, 07/07/2017 - 11:35
Подскажите, пожалуйста, знатоки как встроить цикл Blink в таймер. Нужно чтобы Blink начинал работать утром и заканчивал вечером. Что нужно добавить к этому коду. Можно пристроить любые часы реального времени или как-то по-другому? Возможно такой или похожий код подскажете...
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(500); digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); delay(1500); digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); delay(30000); }
Спасибо. Буду пробовать додумать.
Думаю примерно так...
Да, навскидку верно. И ещё надо будет один раз задать отдельным скетчем время в RTC, а потом уже смело можно его читать вашим скетчем.
Да, понял сейчас допишу и буду собирать, пробовать...
Не прошло
Ошибка
expected ')' before '{' token
Начт, надо ) перед { постаить в if. И поплывет.
Куда только не тыкал эту скобку...! Спасибо. Но весь скетч не работает. Наверное часы прога не видит. Конструкцию if - else убираю, тогда работает блинк. Наверное часы надо сюда прикрутить. Часы отдельно работают, в своем скетче.
Код работает и выдает время на монитор. Только вторая часть (Blink) не работает, стоит High.
Попробуйте так
Так еще хуже. Часы тоже не рабо
Все перезагрузил снова залил предложеный вариант. Заработало также как мой вариант: часы работают, а blink - нет
А как же blink without delay? http://arduino.ru/tutorials/BlinkWithoutDelay
А как же blink without delay? http://arduino.ru/tutorials/BlinkWithoutDelay
я запретил.
отныне - так:
blink without delay конечно хорошо, но эти delay разные... Эта страница не существует? http://arduino.ru/tutorials/BlinkWithoutDelay
Эта страница не существует?
Существует. Пробел в конце адреса уберите.
millis - это когда одинаковые промежутки, наверное, а мне надо все время разные. Видимо еще и массивы понадобятся. Я в программировании полный ноль, все это будет не по зубам.
Да еще напишу для чего проектируется моя ПВО. Это отпугиватель скворцов от черешни и вишни. Шуршащий звук выдается в две очереди. Первый короткий для привлечения внимания птицы, а второй подлиннее отпугнет. Промежутки между очередями тоже разные, чтобы не выглядело примитивным циклом. Сейчас у меня работает один отпугиватель, но он громоздкий и на двух приборах: недельный таймер выдает время работы, чтобы ночью не крутить, а очередь выдается другим прибором... Хочется заменить все это маленьким устройством на "ардуино про мини", часах 1307 или подобных и блоке реле, исполнительное устройсво уже сделано и работает хорошо на моторчике от детской игрушки.
ПС: Бедные скворцы , всю черешню теперь будет есть ...Ардуина.
Спасибо, qwone, код крутой. Но пока скворцам ничего не грозит. Скетч попросил еще одну скобку [
if
( (now.hour() >= 5 ) && ( (now.hour() <= 21 ))) Tak.
loop
();]
, после добавления залился, но не подает признаков жизни, а поскольку код для меня сложноватый... Может я не к тем входам-выходам цепляюсь?Ну вот создал тему. Может так станет проще понимать. http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
Попробовал мигание из новой темы - работает. Выход на 13 ногу. А в моем случае не работает на 13 ноге. Часы на монитор тоже не работают.
переставьте на другую ногу. 13 пин вроде используется при обмене данных Ардуино с часами.
ПС: просто поменяйте цифру на свободную ногу
Поменял на 12 - не работает.
Посмотрите так
Могу побыть "матерью Терезой", если другие не станут вмешиваться в процесс.
1. Нарисуйте или, если не умеете рисавать, подробно пишите схему подключений. В виде: контакт такой-то на этакой плате соединен проводом с котактом №666 на плате вот-этой-вот.
2. какая версия ИДЕ на кокой платформе (Винда 7, Линух, что-то-еще) используется для програмирования.
3. какая Ардуина и какой модуль часов?
4. Сфотографируйте все это хозяйство, чтобы были видны подключения. Отмазки - не принимаются ;), фото есть в любом телефоне.
5. Запустите примеры блинк и тест модуля часов из примеров библиотек. Если на этом месте непонятно, то в следующем этапе сделаем.
====================
Коллеги! Прошу не вмешиваться с советами. Если не затруднит - не путайте новичка. Ни классами, ни умничаньем. Мы спокойно решим его задачу так, что он сам потом сможет решать подобные.
ок. сейчас мне отъехать нужно. скажите, какая библиотека для RTC? чтобы я мог давать вам наводки и примеры точно по вашему софту и железу.
Поскольку у нас есть много времени, то опишите подробнее про"шуршащие звуки" и как вы видите идеальную последовательность. Как звук включается, какие и где вы хотите паузы и какой график работы?
давайте начнем "плясать" от вашей последовательности звуков. Пока вы не ответили, примем ту, что в титульном сообщении темы.
таким образом у системы есть 6 состояний:
1. ожидание включения.
2. включение1
3. пауза1
4. включение2
5. пауза2
6. включение3.
--------------------
так?
У всех состояний фиксирована длительность, кроме ожидания - оно длится бесконечно, до включения так? или что-то нужно добавить?
В эту схему состоний впишем таймер, который может командовать системой: "включить", "выключить", так или еще что-то?
---------------------
Когда ответите - продолжим, пока нам сам контроллер не нужен. Сперва програмируем голову, а потом уже "бездушное железо". ;) ;) ;)
1. ожидание включения от вечера (21 час) до утра (4 часа) это работа таймера.
Далее работа БЛИНКа, который будет давать сигнал HIGH на реле включающего моторчик весь день.
2. включение1 - длительность 0.5 sec
3. пауза1 1 sec
4. включение2 - длительность 2 sec
5. пауза2 10 sec
6. включение3 - длительность 1 sec
7. пауза 1sec
8. включение4 - длительность 0.5 sec
9. пауза1 1 sec
10. включение5 - длительность 2 sec
... и БЛИНК с начала, цикл повторяется от пункта 2 до пункта 10 до конца дня (до 21 часа)
В 21 час таймер выключает БЛИНК и ожидает утро....
Завтра сниму и опубликую кино-ролик о работе устройства которое сейчас трудится, и не первый год.
ОК!
Вечер - у меня время самогончика... так что завтра продолжим, с Б..жей помощью.
Для уточнения: Блинком вы называете всю эту конструкцию включений отпугивателя?
======================
Да! И вы не уточнили библиотеку часов, их легион на просторах сети, какая у вас?
Да, БЛИНК это конструкция включений отпугивателя.
Библиотека DS1307 такая:
Сейчас пытаюсь запустить скетч с часами и маленьким дисплеем типа OLED128x64. Может будет не хуже, если кантролировать время, не сбилось ли, соотвествует ли...
Доброе утро! В первопрестольной дождь... даже с псами гулять не пошел...
С экраном - очень хорошо. Погоняйте примеры. Потом втроим экран. Через час, примерно, продолжим.
Сейчас времени нет. Тестя надо с рынка привести.
Я поправлю, как нужно, все состояния нашего автомата, будем постепенно привыкать к правильной терминологии.
Итак:
1. ожидание.
2. включение1 - длительность 0.5 sec
3. пауза1 1 sec
4. включение2 - длительность 2 sec
5. пауза2 10 sec
6. включение3 - длительность 1 sec
7. пауза3 1sec
8. включение4 - длительность 0.5 sec
9. пауза4 1 sec
10. включение5 - длительность 2 sec
11. пауза5 - длительность 30 сек.; переход к 1.
============================================
Теперь разберемся с сигналами перехода из одного состояния в другое.
Сигналом в состоянии ожидания, для перехода в состояние 1, является сингал часов(время > 04-00): назовем его СТАРТ.
В состоянии 11 мы проверяем наличие сигнала СТОП (время > 21-00);
в остальных состояниях сигналом перехода на ледующее является истечение длительности, как кухонный ТАЙМЕР.
============================================
Теперь важный момент(Sic!!!!) Понимаете ли вы, как работает loop()? Ясно ли, что вызов лууп зациклен? Что после завершения команд лууп, он вызывается снова и снова?
Дальше читаем только если понятно написанное.
==========================================
Теперь нужно понять, что, если лууп проходится быстро, нигде не задерживаясь на delay(), то есть возможность реагировать на любые события.
Увидел событие (СИГНАЛ), переключил состояние, взвел нужный ТАЙМЕР, сформировал уровни на выходных пинах, в соответствие с состоянием и снова готов ожидать новых событий.
==========================================
Таким образом мы уже готовы описать нашу программу на русском языке.
Это самый важный и тяжелый для понимания момент. Если не поняли - будем уточнять, пока не станет все абсолютно прозрачно.
Буду писать курсивом, по строкам.
1. Прочитать текущее время от часов.
2. Прочитать текущее значение внутреннего счетчика миллисекунд.
3. Отобразить время на экране (этот момент мы потом уточним).
4. сравнить время часов с "утро" и "вечер", если нужно включить сигнал СТАРТ или СТОП.
5. сравнить текущее значение миллисекунд с взведенным таймером (если взведен), если время пребывания в соответствующем СОСТОЯНИИ прошло - включить сигнал ТАЙМЕР.
6. ПЕРЕКЛЮЧАТЕЛЬ ДЕЙСТВИЙ, в зависимости от текущего СОСТОЯНИЯ:
состояние 1: если СИГНАЛ - СТАРТ - перейти в 2+взводим таймер(*)+включаем пин реле, иначе - сохраняем состояние 1.
состояние 2: если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 2.
состояние 3:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 3.
состояние 4: если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 4.
состояние 5:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 5.
состояние 6:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 6.
состояние 7: если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 7.
состояние 8:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 8.
состояние 9:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+включаем пин реле, иначе - сохраняем состояние 9.
состояние 10:если СИГНАЛ ТАЙМЕР - перейти в 3+взводим таймер+выключаем пин реле, иначе - сохраняем состояние 10
состояние 11: если СИГНАЛ ТАЙМЕР - перейти в 2+взводим таймер+включаем пин реле, иначе -
если СИГНАЛ СТОП - переходим в состояние 1, иначе - сохраняем состояние 11.
=========================================
(*)Для коллег - пока ничего не оптимизируем, для лучшего понимания.
Теперь мяч на вашей стороне. как разберетесь или не разберетесь - пишите.
Сегодня день пропащий. Подключил часы , подключил OLED дисплей, пристроил скетч и часы заработали на дисплей. Все шло хорошо. А потом дисплей OLED128x64 перестал работать. И все...
Достал из коробки другой LCD 1602 и до конца дня пытался его запустить, не запустил....
А так хорошо все начиналось...
Перечитал прошедший топик. Первая половина не вызвала затруднений, а вот вторая ... завтра еще посмотрю
Ролик на мою ПВО которая теперь работает (защита 100%) https://youtu.be/6PdQHkz1K9U
Ролик с упралением (суточный таймер, прибор отработки цакла 3сек через 25сек пауза) https://youtu.be/9D9g1PWywqM
Поскольку мои средства вывода (OLED, LCD) ничего не показывают, наверное порты А4, А5 на плате ушли!
Вопрос чайника знатокам:
1. Как проверить порты?
2. Можно ли задать другие порты, для работы кода, и как?
1. проверить тестером или светодиодом, используя, как цифровые, с именами A4 и A5.
2. есть програмный I2C, но вам сдишком сложно будет его использовать. сперва проверьте порты.
Хорошо, если есть осцилограф или логанализатор. Тестером только ножки проверим, а не работу I2C.
Спасибо, qwone, код крутой. Но пока скворцам ничего не грозит. Скетч попросил еще одну скобку [
if
( (now.hour() >= 5 ) && ( (now.hour() <= 21 ))) Tak.
loop
();]
, после добавления залился, но не подает признаков жизни, а поскольку код для меня сложноватый... Может я не к тем входам-выходам цепляюсь?Зачем здесь круглые скобки??? Вроде так должно быть:
И все-таки скобки нужны
IDE выдает ошибку: invalid use of member function (did you forget the '()' ?)
Скобки у now.hour() обязательны, потому что в данном случае hour это не публичное свойство класса часовой библиотеки, а функция-геттер, мы вызываем функцию, а не просто считываем свойство.
Порты работают, а вот дисплеи не работают. Один поработал немного и ... Сдох, другой вообще не заработал. Часы реального времени есть RTC1307, 1302, 3132 - все трое работают.
Если часы работают, то значит все с I2C нормально. С чем вас и поздравляю!
Давайте разбираться с дисплеями. Начнем с 1602, он проще.
1. сфотографируйте его нижнюю сторону, откуда провода идут, крупным планом.
2. Кто паял модуль I2С, вы, самостоятельно, или так купили?
С этого начнем.
С проводами у 1602 все в порядке. Она у меня с адаптером, проводов всего 4. Хотя распаять наверное надо, определить кто виноват адаптер и сама 1602.
про пайку: я имел ввиду - кто припаивал I2C модуль (черный) к дисплею? Я уже понял, что не вы.
1.напишите по цветам - как вы подключаете дисплей.
2. надеюсь, что правильно, тогда покрутите отверткой потенциометр (синий). должна меняться яркость. Правильно - если первая строка заполнена квадратиками.
Я сам припаивал. Можете поверить пайка идеальная. Я всю жизнь паяю.
С проводами тоже ошибки нет. На фото хорошо видно. Подключал не один раз. Сейчас припаял к дисплею провода и буду пробовать подключить без модуля.
Подключился напрямую к дисплею. Квадратики светятся, потенциометром меняется контраст, пример залит "Hello, World" , но ничего не выводится.
1- LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 или 0x3F
2 lcd.begin(); или lcd.init();
3 библиотеки LiquidCrystal_I2C одинаковые по названию и разные по содержанию.
И как определить какой вариант нужен? Завтра и это проверю.
И как определить какой вариант нужен? Завтра и это проверю.
Посмотрите в примере из библиотеки.
Если решили подключить дисплей напрямую, без I2C модуля, используемая сейчас библиотека работать не будет (она только для I2C).
Корректность подключения по I2C проверьте "I2C сканером". В случае с часами 1307 и LCD1602 должно быть что то вроде: 0x68 (это часы), 0х?? (на модуле часов часто память распаяна, адрес не помню) и 0х27/0х3F (это PCF8574 в модуле I2C для LCD). Последние значения наиболее часто встречающиеся, но могут быть иные (PCF позволяет менять адреса).
Подключение через I2C
Проверил сканером LCD: 0х38
Проверил сканером часы: 0х68
И где это должно соотвествовать?
LiquidCrystal_I2C lcd(0x38, 16, 2); // 0x27 или 0x3F
Если подключали LCD отдельно от RTC, то так.
UPD: если подключали модули с фотографии на DS1307 или DS3231, кроме 0х68 должен был определитиься еще один адрес, от EEPROM на борту, Вы его почему то не указываете. Третьего модуля у меня не было, там не знаю.
Спасибо. С вами пошло как-то веселей. Уже есть результат: по одной букве в каждой строке
Посмотрите по форуму, обсуждалась такая проблема, сам не сталкивался, не помню как лечится.