Gроект для аквариума (акваконтроллер для led, temp, time, co2)
- Войдите на сайт для отправки комментариев
Здрасте форумчане. Боюсь сам неосилю свою задумку. Понимаю что будут многие посылать в книжку и всякий фак но все же опишу свою задумку.
Имею Мегу2560, дисплей4-х строчный, всякие термодатчики на ds18b20 и в теромусадке, релюшки (8 канальные).
На сегодня написал не без помощи форумчан (надергал отовсюду понемногу) строчек кода для контроля темпиратур с нескольких датчиков с выводом на экран показаний а также положение релюшек при этом.
Осталось дождаться посылки с АЛИ часов типа Ds3231 AT24C32 IIC для таймеров и вот тут для меня засада.
Нужно включать модули реле с разницей к примеру в 10 минут для удобства. При этом перед включением первого реле нужно задать уровень 0 для выхода на несколько пинов ( вообще нужно 10) для диммирования (чтоб недержать светодиоды постоянно включёнными). Тоесть я плавно зажгу свет в банке (к примеру в течении 5 минут значения будут от 0 до 254) а потом можно и довключить остальные светики. И тоже самое но в обратно порядке для отключения. Всего два цикла в день на утро и вечер. Никаких там молний и прочего в банке неприемлю, прост осчас страдают рыбки от мгновенного включения 10 сборок по 10Вт :(
И самое самое сложное - осуществить возможность устанавливать темпиратуры включения\отключения реле с помощью кнопок (сейчас приходится заливать сктчем) и тоже самое для таймеров.
Кнопки сами будут чисто обычные. стандартно 4 штучки (верх\низ\право\лево). Выручайте братцы. Понимаю что нафиг никому ненадо однако поверьте адептов на аквафоруме будет повторить много. Вот моя темка про LED http://www.aqa.ru/forum/Led-svet-na-530-litrov-ne-Cree-diodyi-s-Ali-vzamen-t5-280537-page1 (вдруг есть аквариумисты :) )
Вот такой скетчик я уже наваял для темпиратуры:
Можете пояснить - вы планируете диммировать 10Вт светодиоды?
Чем?
Данные вводить лучше энкодером.
Вот это еще почитайте
Можете пояснить - вы планируете диммировать 10Вт светодиоды?
Чем?
Данные вводить лучше энкодером.
Диммировал я на своих пробных 10Вт-х сборках драйвером на PT4115, его 8-ая ножка и есть вход. Пробовал просто потенциалом напряжения от 0,5 до 2,5В. так вот при 2,5В и выше он полностью открыт а ниже 0,5В зарыт и света нет.
Так вот я брал стандартный скетч для "Мигаем светодиодом" с delay и без оного и подавал с 10 пина на вход драйвера. Все отлично получалось однако слишком быстро, несмотря на то что делал шаг приращения в 1 .В моем случае нужно "растянуть этот приращение до 10 мин.
Есть у меня такой скетчик, однако пока нет модуля часов опробовать его немогу. Пока мне нужно кнопки вставить в имеющийся уже код для терморегулировки :)
А вот скетч с моего аквафорума, где уже реализовано диммирование по типу закат-рассвет. Мне лиш нужно сделать ДВА таких, для утра и вечера:
Вот это еще почитайте
Для меня это МЕГА-круто но избыточно, морские банки в плане автоматизации нуждаются на несколько порядков выше обычных травников. У нас в основном свет (иногда закат\рассвет с применением красных), подача и контроль СО" и подача УДО. На любителя это автокормушки там и прочее.
Спасибо за сссылку - там товарищ заморочился вообще все с "нуля" практически. Да и сам я несмогу переработать его код под свое (дисплей и кнопки) оборудование.
Кстати с кнопками я погорячился насчёт 4-х штук. Надо минимум 6. Забыл про select и menu :)
Если у кого есть хоть минутка свободная буду рад, хоть копипастом....
///Для меня это МЕГА-круто но избыточно - да. При правильном подходе и Микро хватит, при неправильном - ничё не поможет.
///На любителя это автокормушки там и прочее. - а зря! автоматическая кормушка на случай отпуска не лишнее. Я ещё и УЗ датчик растояния притулить хочу для контроля уровня воды. Чего ему в ящике валятся раз уже куплен ;)
///Кстати с кнопками я погорячился насчёт 4-х штук. Надо минимум 6 - так будет всегда! Кнопок и экрана всегда немного нехватает. Пока не поздно, выкинте эти 4 кнопки напару с 4-х строчным дисплеем, да возьмите LCD дюйма на 3 с тачем. На нем и кнопки нарисуете, сколько нужно и когда нужно. И в корпус совать проще. А за одно и AT24C32 как бы не востребована. С экраном вместе идет ридер для мини SD карты. В либах к ней тоже всё уже есть;) И ещё, похоже Вы забыли одну детальку. ИК приемник для управления всем хозяйством не вставая с дивана. Он к стати и проблему кнопок поможет решить.
А дальше не спеша прогу писать, годика на два хватит :) Степ бай степ, неспешно развивать. Главное, чтоб железо не апгрейдить по ходу.
Кнопок с резисторами хоть 100шт на аналоговый вход (хотя право-лево на 4стр.дисплее????), а с тачем действительно нагляднее.
А зачем для рассвет-закат часы нужны (кроме когда приступить), 2350мС на каждую прибавленную-убавленную единичку - 10 минут получилось.
Кнопок с резисторами хоть 100шт на аналоговый вход (хотя право-лево на 4стр.дисплее????), а с тачем действительно нагляднее.
А зачем для рассвет-закат часы нужны (кроме когда приступить), 2350мС на каждую прибавленную-убавленную единичку - 10 минут получилось.
Вот вот, с этого места можно конкретно (кодом прошу пожалста), чуял что можно при стабильном подключении (пока ардуинка включена постоянно) и без часиков замутить и диммирование и программы таймера. Главное правильно задать точку начала и в это время включить ардуинку а дальше кодом будут выполнены замеры секунд.
Парни выручайте. И по поводу кнопок, много инфы бдет и темпиратура и положения реле и приделаю мольтметр (так чтоб было) смотреть на своих каналах ЛЕДов напряжение. Да и установить время для таймеров, темпиратуру. Или к примеру вручную вкл\выкл расписание таймера и принудительно включить реле.
Блин задумка ессть а реализовать лиш на уровне чегото скетча заменив или убавив чтото.
Докупать сенсорный дисплей непланирую, по большому счёту визуализация постоянная ненужна вообще, лиш на время установки параметров ровно как и пульт и прочее такое :)
Юзайте, на красоту не претендую, вроде все закомменчено, принципы поймете.
На сегодня умеет:
1.Определять и запоминать датчики DS18 2шт, задавать и запоминать температуры и влажность.
2. Включать вентиляторы, для поддержания влажности и усреднения температуры.
3. Включать с равномерным увеличением мощности нагреватели.
4. Аварии и прочие полезности пока не делал.
Если что не понятно, спрашивайте.
Пошла вторая неделя - я воюю с вашим кодом :).
По кнопкам. Я свои собрал по простой последовательной схеме резисторов с подтягиванием к "+". где записывал показания их в массив чтобы потмо сравнивать, что же нажато. Все делал по примерам. Вот посмотреть бы видео с работой вашего кода на примере....
Так-как пока я в ожидании своих часов (ds3231 ) будь повелся на цену копеечную и заказал всё у разных я нашёл ИК-приемник. подключил к нему пульт. Чтобы не кнопки нажимать включая свет а с пульта. Вышло вот такое:
И всё бы ничего да вот есть пара неудобных мест, именно неудобных.
Задумывалось кнопкой POWER_KEY 0x41BEF00F - включать-выключать реле для подачи питания на драйвер Led.
Так как реле инверсное сейчас происходит следующее. Нажимаю POWER_KEY - всё пучком реле срабатывает на дисплее пишется значение сначала 255 (я так понял HI) далее нажимаю снова и только тут включается реле и на дисплее 0 (кстати дисплей неочищается и горит значение 055) как это победить.
Далее если я при выключенном реле нажимаю на увеличение или уменьшение ШИМ то значение на выходе диммера всегда 255 (максимум) .В принципе все нормально питания на нём нет и неважно какой параметр на входе диммирования - но зачем ардуинке зря трудится, как сделать недоступной обработку этих кнопок ( #define KEY5 0x41BE10EF // vol_up и #define KEY6 0x41BE708F // vol_down) пока реле отключено?
Спасибо.
Чисто мой код вам однозначно не подойдет, у него задачи другие. По ИК не скажу, не работал с ним.
Далее, в setup надо инициировать все цифровые выходы (как вам требуется на начальном этапе LOW или HIGH).
Для очистки дисплея lcd.clear или вывести в эти знакоместа пробелы(мне так больше нравится, меньше мерцает) вернуть курсор и снова печатать.
Блокировка кнопок по if-ам в зависимости от требуемой логики.
Я стараюсь в loop-е оставить минимум и все вывести во внешние функции. Далее в loop отрабатываю тайминги+условия и вызываю эти функции по мере надобности. Для отладки намного проще.
Как-то так.
P.S. посмотрел внимательнее, в строках 53,57 добавить условие для реле. Реле лучше на цифровой выход.
Итак, по инициализации цифровых выходов. Мне казалось я их уже указал в
byte analogData1, analogData2 = 0; // значения аналогово выхода
Однако решил setup сделать пока таким:
Релюшка инверсная потому и сразу её в HIGH пришлось
а также перенёс релюшку на цифру, пока туда:
#define OUT1 22 // выхода на relay
Я понимаю что "непонимаю" языка и логически знаю что хочу с чем сравнить а в коде реализовать немогу.
Нужно сначала вкл\выкл - relay и только после этого dimmer
Сейчас dimmer может сразу начать с 255 и далее по 1 единичке в минус.
C печатью похож тоже разобрался (на lsd) по вашему примеру заполнил пробелами, незнаю правильно-ли, однако работает:
Да, я это и имел в виду. Перенести реле на цифру, инициировать как выключено.
По работе с диммерами - Проверяем состояние реле. Если включено - начинаем работу с диммером. Если выключено - ушли. Т.е. сперва if с проверкой реле и в нем if-ы с диммерами. Проверка реле либо через digitalRead(), либо завести переменную. Если непонятно объяснил, уточняйте.
Для аквариума алгоритм наверно такой:
1. Команда на включение (часы)
1.1 Диммер на минимум (лучше это сделать в Setup)
1.2 Реле включить
1.3 В цикле с задержкой увеличиваем диммер до требуемой величины.
2. Команда на выключение (часы)
2.1 В цикле с задержками уменьшаем диммер до минимума(выкл)
2.2 Реле выключить.
3. Хотим убавить увеличить яркость (освещение включено, пульт)
3.1 Проверяем состояние диммера
3.2 Если не минимум(выкл), увеличиваем или убавляем яркость (не забыть огр. мин. и макс., минимум не равен (выкл))
3.3 Если на минимуме(выкл) уходим (для проверки используем переменную диммера)
п.п1.3 и 2.1 лучше отдельными функциями и if-ами. Т.к for() затормозит программу
состояния переменной диммера: минимум(выкл) - выключено, любое другое включено. Ручная регулировка минимума не равна минимуму(выкл).
Ручное управление - как вам удобно(выкл.резко, выкл.с плавным затуханием и т.д.).
Не очень понял назначение реле - драйвер с минимальным значением диммера выдает какое то напряжение?
Спасибо вам за поддержку моей темы. Она получилась ... немного разрозненная, нужно было начать сначала с ТАЙМЕРА, потом отлаживать диммирование, потом терморегуляцию, потом уже ручное управление :). Получилось всё через "Ж", xfs с али едут с огромной задержкой вот и играюсь с тем что есть.
Корпус для всего уже нарезал и склеил из вспененного ПВХ. Счас приходится кнопками вкл\выкл реле коммутировать. И тут попался IR- от старого HE вертолеткиа сына, пульт от телека, скетчик для примера и и вот уже вроде все и работает да немного нетак.
Все ваши пункты счас внимательно вкурю.
С питанием на драйвер и диммированием. У меня свет на COB-сбрках по 10Вт для банки в 530 литров потребовалось минимум ..... 30штук. Драйвер решил использовать методом проб ИБП от ПК. Однако там стабилизируется НАПРЯЖЕНИЕ а нам то нужно ТОК в пределах 0,6-0,9А. Как итог покупка к каждому ЛЕДу своего драйвера и подключать их ПАРАЛЕЛЬНО, Учитываю что БП уже есть и спокойно выдерживает до 45-65А в цепи 12В вопрос был ЭКОНОМИЧЕСКИ расмотрен итого. Один 10Вт ЛЕД стоит около 37руб (1уе на то время) один драывер 63 руб. (2уе). Итого за свет в 300ВТ чистых 6500К (белого почти как солнце света) ушло всего чуть менеее 100уе (2900руб) тоесть менее 3 рублей на литр воды (у нас аквариумистов считают Вт на литр и соответственно руб на литр при затратах.
Так вот я нехочу ПОДАВАТЬ 12В на 10 драйверов (они их в любом случае потребляют, греются немного и прочее, снижая КПД и увеличивая энергозатраты) - для этого сначала подаем на входы всех дрйверов (они разделены у меня на 3 по 10шт линии) а уже потомм диммируем, иммитируя либо закат\рассвет, либо в ручном режиме вечером к примеру просто досвтеку комнаты перед сном :)
Тема про мой свет тут: http://www.aqa.ru/forum/Led-svet-na-530-litrov-ne-Cree-diodyi-s-Ali-vzamen-t5-280537-page1
В общем понятно и ничего страшного нет. Добавляем реле в код, но думаю надо ввести задержку на время переходных процессов в районе секунды - включили реле, пауза, начали работать с диммером.
Начать лучше как раз с диммеров - отработали код плавного включения выключения отдельными функциями, а после начинаем ими управлять по событиям (часы, пульт, кнопки и т.д.). Режте задачу на маленькие самостоятельные блоки.
Попробуйте на бумажке расписать по шагам что и как будет. Тогда и кодить легче.
Я чуток поправил код и вышло вот таке с учетом "резки на блоки", правильно-ли так будет:
И да, процесс охрененно творческий, я зря незаказал сразу парочку (один уже в работе а с другим твориш), я послучаю заказал всеже есчо Nano - имхо для моих задач Mega избыточна и мааленький tft к ней, для креветочника.
У вас опять слились задачи обработки IR, включение и диммирование. Что случится когда вы подключите часы и не дай бог еще и кнопки? Вам придется аналогичный код писать три раза+взаимная путаница. На мой взгляд правильнее по задачам: диммирование, реле, IR.
Включение и выключение вы сделали резким, наверно рыбкам это не понравится. Мне кажется лучше - при наступлении события включения/выключения (часы, кнопка, IR) проверяем состояние диммера, при включеном переходим на блок снижения яркости, снижаем, отключаем реле. При выключеном, включаем реле, переходим на блок увеличения яркости, плавно увеличиваем до заданного значения. Скорость процессов можем регулировать присвоением переменной разных задержек и суммируя их с millis() в блоках яркости.
В планах, насколько я понимаю, измерение температуры+ее поддержание, помпа - постоянно или по критерию, что еще? Маленький tft скушает много памяти и может потребоватся Мега (на мой взгляд LCD проще, хоть и менее красиво). Для остальных задач Atmega328 наверно за глаза.
Я с IR не работал, где то проскакивала инфа, что они c DS18 не очень дружат, попробуйте протестируйте.
Блин затупил, для простоты и удобства вместо реле использовал светодиоды и понимал что логика будет инверсная. Счас подключил реле и ужас. Нажимаю POWER_KEY включа.тся СРАЗУ все линии питания ледов и диммирование если небыло выставлено в "0" то само собой вспышка. Кстати Димиирование у меня будет на одной линии всего. Потому как рассвет будем считать произошёл и даже резкое включение остальных 60% светиков невызывает такого дискомфорта.
Поменял логику работы кнопки POWER_KEY, она теперь НЕМОЖЕТ включать реле сразу. а может их выключать либо сразу либо по одному :) что мне и нужно было (в языке процессинга я пока учусь). А вот диммирование я вообще убрал пока из проверки. Хотя желательно чтобы нажатие POWER_KEY сбрасывало в "0" значение яркости (сечас оно сохраняется до reset). Вобщем я уже максимально близок. Покажите мне явно, кодом -как сделать сброс до "0" значения яркости если нажата кнопка POWER_KEY всё-же.
Вывод на экран пришлось также инвертировать lcd.print(!digitalRead(OUT1)); !-символом НЕРАВНО
ПО поводу Далласов, может у меня код кривовато-длинный (хотя цикла всего пока три, без учета времени и таймеров. Пока чисто IR, termorelay, и вольтметр линии питания светиков :). Так вот мне кажется или всетаки как только я добавляю считываение темпираур и работу с ним несразу срабатывают значения нажатий, не так быстро я бы сказал.
ПО поводу Nano и TFT - стоит смешно мало (170+190 руб) взял исключительно продолжать свое развитие, а потмо засуну это в креветочник.
Вот код на сейчас. Осталось прилепить ЧАСЫ, Закат\Рассвет, Таймер на релюшки для света и Co2. И самое главное - МЕНЮ всего этого чтобы непрошиваться постоянно. EPROM и запись туда для меня звучит очень страшно.
Кстати счас понимаю что надо было покупать компоненты типа http://reefcentral.ru/forum/topic/2016-akva-kontroller-ot-olega/
и непарить мозг "ГУРУ", все равно пришлось бы учится, однако комплект стоит раза в 3-4 моего сейчас
Счас проверил - если включены все три
pinMode(OUT1,OUTPUT);
pinMode(OUT2,OUTPUT);
pinMode(OUT3,OUTPUT);
то POWER_KEY их НЕОТКЛЮЧАЕТ :( С одной стороны это гуд, с другой.... пока на pinMode(OUT4,OUTPUT); есть хоть что то pinMode(OUT1,OUTPUT); - не должен отключаться по POWER_KEY.
И второе - вывод напряжения на Lcd как я понял осуществляется со скоростью процессора - это неесть гуд, как мне БЕЗ delay выводить его (ровно как и темпиратуру)
Парни выручайте. Приедут часы - будут новые грабли - нужно что есть отладить. Кстати пультом ловоче нежели кнопками.
По временным задержкам:
В loop() if (tzad<millis() {на треб.функцию}
В функции()
......Код. tzad=millis()+треб.задержка, возврат.
Соответственно в функцию будем попадать только после требуемого периода времени. Все delay() заменяем на подобную конструкцию.
Между строками 160 и 161 необходима задержка 750мС. В строке 159 вы выбираете конвертацию определенного датчика, можно дать команду для всех
void DallasStartTemp()
{
ds.reset(); //Сброс датчиков
ds.write(0xCC); //Команда инициации
ds.write(0x44); //Команда на конвертирование
}
Считывание после задержки проводить по адресам датчиков. Они кстати по двум или трем проводам у вас подключены?
Супер, delay я в самом начале ОДИН раз использовал когда менял содержимое заставки при включении Lsd. Понял ч то в цикле delay - зло сильное :)
В петле, тоест в loop счас попробую напихать эти пресловутые millis
А датчики у меня по 3-м проводам (паралельно) пока их два. будет много больше, я даже ветку отдельную создавал - как вывести показания при таком подключении (не на отдельные пины а именно на один, помимо GND и VCC
Покажите мне плиз на примере, как правильно добавить millis между 160 и 161 (кстати ранее таv было delay и представьте как все мееедленно работало).
Первые три строки как у меня, и добавить tzad=millis()+750; flag=1;
в loop:
if (flag==0) {DallasStartTemp()}
if (tzad<millis()) {tempDallas()}
в tempDallas() считываем и производим расчет температуры. flag=0;
Чтобы DallasStartTemp не запускался при каждом проходе нужна переменная-флаг, что происходит конвертация. В первой функции его подняли, после считывания сняли. Если флаг поднят DallasStartTemp() не вызываем. Дополнительно лучше ввести задаержку на работу с температурой. Каждую секунду это наверно делать бессмысленно 30сек-минута.
По EEPROM, если числа укладываются в byte, то просто прямая адресация к ячейкам. Другие, либо расчленять самому, либо какую либо прогу типа ciberlib.
с Millis решил разобраться сам, с вашег опримера-ничего епонял и везде ругалось на меня в коде. Итак. Сзади начну. Далласы поравил согласно вашего замечания об опросе всех а не адресно, вышло так:
Далее задал временные интервалы (пока для Темпиратуры и напряжения, позже по аналогии для таймеров и прочего:
И в Loop () вот так:
И всё заработало (опять возможно неоптимально однако...)
Остались мелкие вопросы про ваш кусочек кода
ds.reset(); //Сброс датчиков
ds.write(0xCC); //Команда инициации
ds.write(0x44); //Команда на конвертирование
и про проверку условия digitalWrite(OUT1, HIGH); если (analogData2 != 0)
с Millis решил разобраться сам, с вашег опримера-ничего епонял и везде ругалось на меня в коде. Итак. Сзади начну. Далласы поравил согласно вашего замечания об опросе всех а не адресно, вышло так - но неработает, забито 00,00 значения :( :
Далее задал временные интервалы (пока для Темпиратуры и напряжения, позже по аналогии для таймеров и прочего:
И в Loop () вот так:
И всё заработало (опять возможно неоптимально однако...)
Остались мелкие вопросы про ваш кусочек кода
ds.reset(); //Сброс датчиков
ds.write(0xCC); //Команда инициации
ds.write(0x44); //Команда на конвертирование
и про проверку условия digitalWrite(OUT1, HIGH); если (analogData2 != 0)
В первом коде, после 7 строки опять нет задержки. Датчик температуру отдаст, но ту которая у него сохранилась в памяти. У нас получается до 7 строки первая функция, после вторая функция, только переменную перенесите во вторую функ.
С millis() посмотрите, я возможно синтаксис неправильно вписал или вы переменные не там объявили - нужны глобальные до setup().
Подскажите по кнопкам всё-же. Нужно разрешить диммировнаие (analogData2) если OUT1, HIGH а также не переводить OUT1, LOW если analogData2 !=0
В коде обработки нажатий и положений реле:
добавил строки вида:
if (analogData2 != 0)
digitalWrite(OUT1, HIGH);
однако... теперь первое реле включается пока 0 на диммере и выключается :( когда начинаеш диммировать. Поправьте условие моё. Кстати если поставить ; в конце if (analogData2 != 0) - то стоит сплошной треск и срабатывание через раз.
Вы знаете, я тоже программист еще тот. Поэтому в голове без железа скомпилить не получается. Единственное, что вижу, инверсию на реле я подразумевал только для power_key (была включена - выключить). Вы ее распространили на кучу кнопок, собака скорее всего там и роется. Давайте по порядку: что должно происходить при нажатиях key1,2,3 и power_key, при первом нажатии, при втором и т.д.
Какая максимально допустимая задержка между нажатиями key1,2,3 и power_key?
С IR я не работал, поэтому вопрос - при длительном нажатии на клавишу, он начинает слать одно значение в цикле или как то иначе? Если одно, то нужна защелка т.к. строки с 5 по 18 начнут щелкать релюшками, а для key4,5 делать то, что надо, но по кругу (нет ограничения min и max - переход через 0).
И не понял вопрос про кнопки.
Ок, всё просто с key 1,2,3. Они все должны включать и выключать свои OUT1,2,3. Кнопка power_key может отключать OUT2, 3 (включать неможет). Но есть условие. Первое - power_key может отключать только OUT 2, 3 - с этим я справился. А вот второе условие: включение\отключение OUT1 возможно если analogData2 = 0, если оно > 0 то ни включить ни выключить OUT1 - нельзя.
На пальцах это - сначала подаем 12В на драйвер (OUT1, LOW), потом ШИМ-диммируем. Если на диммере есть хоть что то более "0" (analogData2 > 0), то подать на драйвер 12В - НЕЛЬЗЯ, вдруг диммирование равно 200 (analogData2 = 200) и тп - будет сразу яркий свет. Аналогично выключение - нельзя (OUT1, HIGH) пока (analogData2 != 0), тоже резкое выключение будет.
А по кнопкам - хочу полностью отказаться от обычных нажимных и работать только с пультом, в опервых вся приблуда размещается у меня в радиаторах подсветки это и высоко и далеко, и в овторых раз экранчик не сенсорный а чисто информативный (поменять настройки таймеров и термореле) - то и пультом удобнее, может не так надежно однако счас мне с ним очень нравится работать.
Помоему - получилось, вот так выглядит запись:
if (results.value == KEY1 && analogData2 < 1) digitalWrite(OUT1, !digitalRead(OUT1));
if (results.value == KEY1 && analogData2 != 0) digitalWrite(OUT1, digitalRead(OUT1));
Тяжко незнать языка, получается по собачьи - понимаеш а сказать на Processing не можеш :)
Т.Е key 2 и 3 включают и выключают безусловно, power_key выключает 2 и3 если они включены.
По 1 логическая неувязка - если хочу выключить power_key, должен сперва убавить до 0 (key4,5). Если хочу включить или выключить key1, должен сперва снова убавить до 0. Каким образом убавить, когда оно у нас выключено + не забыть про плавность.
Получается, для 1 - сперва убавлять при помощи (key4,5) до 0 и потом выключать key1 или power_key. Кажется это ущербный путь. Думаю, диммер это должен делать сам плавно по команде key1 или power_key.
Вы не ответили по клмандам с IR.
Диммер у вас значения 0-минимум, 200 максимум? Задержка между командами вкл выкл в 2сек. нормально будет?
Вот аткой код для обработки кнопок (именно обработки и удержаний):
Теперь я в "ручном" режиме могу включать\выключать реле, тем-самым подавая на драйвер питание, после подачи питания - диммировать до 255 и вниз до 0 и после этого отключать питание с OUT1. Остался вопрос - который только что и возник - к запретить обработку KEY2, 3 - пока на OUT1, LOW - тоесть как случайно невключить OUT2, 3 пока невключен OUT1 а то результат новая вспышка светом :)
К вашему посту выше - диммирование пока в "ручном" режиме - потому и добавлен if (results.value != 0xFFFFFFFF){
В автоматическом (таймером) там в меню нужно будет задавать время диммирования (не более 20-30 мин) к примеру, sunSet oн-же.
Я вечером попробую сам эти кусочки нашкодить с условиями которые вам написал.
Все добавки это уже потом. Сейчас важно плавное вкл,выкл. по кнопкам.
Кстати всё чт оя сейчас пишу для пультов (кнопок) несильно усложнит жизнь при обработке кода для таймера, незапутается ли он включая\выключая OUT, ведь у него будет задано время обработки - а тут я уже чт ото переключил руками :(
Таймер на включение срабатывает безусловно в заданное время. Выключене только если еще включено. Остальное руками.
Реле - HIGH это выключено?
А как пишите сейчас, усложнит сильно.
Реле - HIGH это выключено?
А как пишите сейчас, усложнит сильно.
Да HIGH - это ВЫКЛ, оноже инверсное. Вот жеж таки знал что миои кнопки (IR) сейчас так необходимые пока часы едут могут осложнить дальше обработку кода таймерам и предустановкам в меню.
Вот ещё что, как мне сейчас обрабатывать мои KEY1, 2 и тп для к примеру такого СУТОЧНОГО таймера, хочу на нём потренироваться лазать по меню и прочее. Суточный таймер такой: http://arrduinolab.blogspot.ru/2014/10/blog-post.html
Код:
я так понял, мне нужно както заменить:
byte key(){ //// для кнопок ЛСДшилда
int val = analogRead(0);
if (val < 50) return 5;
else if (val < 150) return 3;
else if (val < 350) return 4;
else if (val < 500) return 2;
else if (val < 800) return 1;
else return 0;
}
на мои пультовые:
#define RECV_PIN 11 //IR-приемник
//Key
#define POWER_KEY 0x41BEF00F //exit, коды кнопок пульта
#define KEY1 0x41BED02F //up
#define KEY2 0x41BEC03F //enter
#define KEY3 0x41BE609F //down
#define KEY4 0x41BE10EF //vol_up
#define KEY5 0x41BE708F //vol_down
byte analogData1, analogData2 = 0; //Значения аналоговых выходов dimmer, пока только analogata2
uint32_t val;
IRrecv irrecv(RECV_PIN);
decode_results results;
С кнопками не заморачивайтесь сейчас. Я попробую накидать диммер как я это вижу, дальше в него входить по событию. По логике сразу вылезают key 2,3 - они должны быть включены только при максимальном диммере, иначе изменение яркости будет незаметно. Или параллельное диммирование всех. Здесь вам решать. Для меню скорее всего придется лепить еще одну кнопку, чтобы в него войти или использовать цифровые(тогда только пульт)
Супер, все именно так. (про пульт) кнопок там много я любую приспособлю под вход в меню к примеру и сохранение (оноже ОК).
И я тогда смогу с этим пультом и в дальнейшем лазать по меню (если к примеру добавлю впоследствии таймер ещё один на кормление или замер влажности)?.
Я вот как обработал кнопки key2,3 (это питание НЕдиммируемых светиков). Теперь они ненажимаются пока на OUT1 (это питание диммируемых светиков) нет 1 или реле ВЫКЛЮЧЕНО (HIGH) а так-же НЕвключаются пока уровень диммирования по key1 не превысит критического значения, к примеру 200 (почти максимум). А то могло быть так, что светики по key1 ещё и незажглись а я тут возьми и нажми key2 или 3, снова вспышка.
Вот так описал в коде:
Блин блин счас обнаружил что кнопки key2, 3 не выполняют проверку на analogData2 != 0 и могут свободно включать и выключать свои выходы OUT2, 3 даже если OUT1 = 0. Тоесть я вывел светики в 200 и могу легко вык\вкл кнопками key2, 3 переключаться, надо как то ЗАПРЕТИТЬ диммирование пока OUT1 = 0. пробую так и писать -ругается, видимо нельзя приравнивать к 0
На OUT1 нет 0. Есть HIGH, LOW или TRUE, FALSE
На OUT1 нет 0. Есть HIGH, LOW или TRUE, FALSE
Помойму понял в чём фишка, наверное нельзя сравнивать с OUT1, нужно типа такого при диммировании:
if (analogData2 < 255 && !digitalRead(OUT1) !=0) analogData2++;
и всё, тепреь пока OUT1 = 0 то нельзя приращивать ++, всего то нужно добавить "!" в код :) счас также опишу key2 и 3
Вы меня спасаете коорый раз, респект.
Ура, пока всё работает, и пульт с реле и терморегуляция и напряжометр :) - всё как хотел.
Тепреь МЕНЮ надо освоить, чтобы править время и темпиратуры и прочее без заливки скетчем. Уже особо и нежалею что невзял чейто готовый большой и ДОРОГОЙ проэкт (относительно имеющихся затрат и интриги).
ПО правде меню с кнопками и EPROM - самый для меня сейчас страшный зверь.
В идеале помоему, OUT1 не может выключится пока analogData2 >0. Все таки диммер первичен.
А меню, это не зверь, это гемморой жрущий гору памяти и ресурсов.
В идеале помоему, OUT1 не может выключится пока analogData2 >0. Все таки диммер первичен.
Вот у меня сейчас так и есть. Пока analogData2 <1 только key1 кнопка обрабатывает OUT. Как только key1 нажата analogData2++ и достигнув 200 уже можно обрабатывать нажатие key2, 3
Счас снвоа нашёл косячок пока писал - если при OUT2, LOW или OUT3, LOW значение analogData2 примет менее 200 .......... то кнопки key2,3 уже невозвращают OUT2, 3 HIGH - это ведет к невозможности снять напряжение с НЕДИММИРУЕМЫХ светиков, нужно подниматься до 200 и выше :(