Таймер и ШИМ
- Войдите на сайт для отправки комментариев
Пнд, 14/09/2015 - 15:22
Подскажите пожалуйста кусочком кода.
Есть 20 каналов с ШИМ, ардуина и часы реального времени на ds1307
как привязать ШИМ ко времени, чтобы каналы плавно разждигались по очереди в определенное время и поочередно гасли в определенное время.
Дисплеев и кнопочек в устройстве не будет, просто определенное заданное время начала "рассвета" , длительность "рассвета", начала "заката", длительности "заката" и так по 20ти каналам.
Шим скольки разрядный?
Шим_макс - (Шим_макс-Шим_мин)*время_прошедшее/время_заката
Аналогично и для рассвета. Код самый обычный - нарисуйте блок-схему, код по ней написать уже будет оч. легко.
Шим будет на pca9685, от "0" до "4095".
"Код самый обычный" и есть для меня загадка.
(I==0, I<=4095, I++) это я освоил, но это, если без delay происходит быстро и не получается привязать ко времени от часов.
Вы мою формулу даже не прочитали. Сколько бы раз вы ее не выполнили результат будет зависеть от прошедшего времени. delay тут ни при чем.
Читал я вашу формулу.
Но как на програмном языке выглядит "Шим_макс - (Шим_макс-Шим_мин)*время_прошедшее/время_заката"?
Ни кто не может/не хочет подсказать новичку как привязать шим к часам реального времени?
if (шим) {часы};
При рассвете в 8:00 что то типа
if(analog.write(9)100){time.hour(8)} ?
задержка = длительность рассвета / 4096
если наступило время рассвета
{
for(i=0; i<=4095; i++)
{
вывод значения i в ШИМ первого канала
delay( задержка );
}
for(i=0; i<=4095; i++)
{
вывод значения i в ШИМ второго канала
delay( задержка );
}
и т.д. для остальных каналов
}
Аналогично для заката.
Спасибо реально за отклик, но именно от этих delay я и пытаюсь избавиться для вклинивания других функций контролеру аквариума.
Началось у меня с подобного кода тут "http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-novichku-1"
Сейчас я пытаюсь уйти от внешнего таймера, задающего сухим контактом режим день/ночь.
Планирую добавить канал на ультрафиолет, добавить 2 датчика температуры, по ним крутить 2 вентилятора.
А еще в планах прикрутить автоматическую подмену воды. В общем все это заствляет избавляться от delay.
Кстати, еще ( наверно глупый) вопрос.
В функции for второй аргумент - это потолок яркости канала, верно?
Там максимальное значение канала ШИМ.
Переведу на русский:
Перебирать значение i от 0 до 4095 с шагом 1, i содержит значение яркости свечения (0 - полная тьма, 4095 - яркое солнце, максимум)
Перед переходом на следующее значение задержаться на ... миллисекунд.
Честно, советую сначала прочитать базу из http://arduino.ru/Reference после чего многое встанет на свои места.
Как уйти от делай:
Это для рассвета. Как видите никаких делай. Только запись шима нужно будет по вашему делать. В сетапе или при ините переменных должны быть присвоены стартовые значения.
Пока код в процессе написания, уперся в проблемку:
На Arduino Pro Micro код работает, на Arduino Mega2560 не работает (в сериал ни чего не шлет)
Хотя со стандартных примеров мега в сериал шлет нормально.
В чем может быть загвоздка?
А вы на меге2560 как смотрите сериал порт? Учтите что порты I2C будут на разных ногах контроллеров.
Разобрался я с портом.
Питания Меге не хватало от ЮСБ, подключил внешний блок питания 12в и все заработало.
Осталась проблема с привязкой "
ledDriver2.writeLED(0, 1023, 1023 ); //белый, центр
" и т.д. к часам реального времени.Не вижу переменных на время восхода/заката и их длительность.
"vremya" - переменная, для заката/рассвета.
А на длительность я не знаю как прописать.
В строках 80-85 прописал.
Не так?
http://arduino.ru/forum/apparatnye-voprosy/kontroller-svetodiodnogo-svetilnika-dlya-morskogo-akvariuma-tlc5940-arduino
Вы не одно и то же делаете?
Человек на tlc 5940 делает. К ней есть очень удобная библиотека. pca9685 навороченней, дороже и от того менее разжеванна на просторах ее тема.
Но не нашел я в свое время платы с tlc 5940 и теперь мучительно строю на том, что купил.
Вообще он очень похожее строит, спасибо за ссылочку. Правда многое в его коде я так и не понял.
Есть 20 каналов с ШИМ, ардуина и часы реального времени на ds1307
как привязать ШИМ ко времени, чтобы каналы плавно разждигались по очереди в определенное время и поочередно гасли в определенное время.
Посмотрите по ссылке мое 14 сообщение. Код проще некуда. Там код для генерации мощности освещения для определенного времени суток.
А уж как вы это значение запихнете в шим это тело ваше.
Но для кого проще некуда, а для кого и не все понятно. Раскоментируйте пожалуйста, если Вас не затруднит.
Большое спасибо, теперь многое понятнее. Буду сегодня ломать голову над тем как это пристроить к моему.
Верно ли я понимаю,что при условии, что PCA9685 - PWM 12 bit, в строках 48,51,55,58 заменяем 1024 на 4096.
Так-же я добавил "Serial.println(seconds);" а оно почему-то ведет обратный отсчет, это нормально?
Верно, у вас будет 4096. Или нужно переключить в 10 битный режим.
А если выводить Serial.println(time.sec); ? Тоже обратный отсчет?
Нет.
Значения мощности будут от MIN_POWER до array[i].power.
Применяйте map или по формуле пропорционально.
На 1024 я умножаю потому что мы имеем дело с целыми числами, и без *1024 при делении мы будем получать значение в диапазоне 0,000-1,000
Она отказывается компилировать Serial.println(time.sec);
Ругается Arduino: 1.6.5 (Windows 7), Плата"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Про seconds не понял. Какие значение у вас выводятся?
Я же написал, что это не готовый код, а заготовка
http://playground.arduino.cc/code/time
time.seconds()
Вы оставили объявление часов в сетапе? И на ногах А0 и А1?
Лучше положите код который пробуете чтобы не гадать на кофейной гуще. Только свернуть не забудьте.
Потому что переменная long int, а выводится int.
Возьмите получение времени из вашего кода.
Я этими часами не пользовался.
какой тип данных seconds? Добавьте при объявлении спереди unsigned.
У меня код в #36 отображается разметкой страницы. Ничего не понятно.
строка 40, сделал по совету "nevkon"
тип данных unsigned и все пошло в правильном направлении
unsigned int от 0 до 65535
А в сутках 24*3600 86400 секунд.
И еще, заполняйте так
Не нужно будет вычислять
Значит можно unsigned long, но как сделать, чтобы она от начала текущих суток считала?
Она так и считает от начала суток.
Вот так видимо нужно использовать
dec2bcd(tm.Hour) * 3600 + dec2bcd(tm.Minute) * 60 + dec2bcd(tm.Second)
не работает
dec2bcd - надо декларировать?
Победило проблему.
О, такой же, как и я )))
Спасибо местным гуру...
Знак инверсии нужен для инвертирования ШИМ-сигнала. Т.к. разные драйвера воспринимают в точности до наоборот. Какой то драйвер открыт при ШИМ=0, какой то открыт при ШИМ=4095. Чтоб не ломать скетч и есть инвертор, который ставит ШИМ сигнал зеркально.
sinnpriest
свои наработки не покажешь?
А я ... блин после PCA90685 на DLL350H оптопарами инвертирую.
И для ТС: я вот тут пытаюсь изложить для аквариумистов как повторить то, что я делаю... http://reefcentral.ru/forum/topic/20560-prostoj-kontroller/
Первый сектч в вышеприведенной теме работает на 100%, но там ШИМ- 8 бит.
Правда, последний скетч правно рассветает и правно закарывается только при условии, что время заката и рассвета меньше пяти минут. На десяти минутах какие то глюки...