Многоканальный таймер управления освещением с функцией "Закат-рассвет"
- Войдите на сайт для отправки комментариев
Здравствуйте форумчане. В Ардуино технике я новичок, но повторить конструкция мне посилам.
И так требуется помощь в реализации устройства управления освещением в птичнике. Мы с женой дома разводим декоративных птиц. Летом проблем с освещением нет, а вот зимой когда они в птичнике необходимо им включать и выключать освещение в заданное время. В данный момент использую программируемые таймеры-розетки, которые не совсем удобны. Поясняю почему: вечером когда неожиданно (для птиц) выключается освещение - птицы некоторое время прибывают в "панике" (мечатся по клетке ударяясь об сетку), т.к. не успели занять свое спальное место. Поэтому необходимо реализовать плавное выключение освещения (Закат-рассвет). Многоканальный таймер поможет организовать несколько зон.
Вот такая задача! Заранее всем спасибо!!!
Здесь посмотрите.
Здесь есть управлением плавным включением-затуханием света, управление по часам и дням недели.
http://mysku.ru/blog/ebay/21157.html
Большое спасибо!
Реализовал задуманное с помощью ссылки которую вы мне дали.
3 канала управления светодиодным освещением
1 и 2 каналы управляются ШИМ и в заданное время плавно (в течении 4-х минут) меняют яркость (включение или выключение)
3 канал управляются без ШИМ (т.е. включает и выключает освещение в заданное время - сразу)
Время включения и выключения программируется в скетче.
Возникла аналогичная задача только в курятнике у родителей, в схемотехнике я пока не разбираюсь, подскажите какие компоненты .нужны для сборки схемы с мосфетами?
У меня все на работе. Подробно отвечу в понедельник.
Arduino pro mini - 1 шт
Часы DS3231 (можно DS1307) - 1 шт
Преобразователь напряжения - 1 шт
Мосфеты можно включить по упрощенной схеме (как у автора схемы)
Ну а теперь ссылки на "железо"
Преобразователь
https://ru.aliexpress.com/item/10PCS-Mini360-Mini-360-model-step-down-power-module-DC-DC-low-power-module-vehicle-power/32582966445.html?spm=2114.13010608.0.171.Sgpg5H
Ардуина
https://ru.aliexpress.com/item/Free-Shipping-1pcs-lot-ATMEGA328P-Pro-Mini-328-Mini-ATMEGA328-5V-16MHz-for-Arduino/32340811597.html?spm=2114.13010608.0.184.Sgpg5H
Часы
https://ru.aliexpress.com/item/DS3231-AT24C32-IIC-Module-Precision-Clock-Module-DS3231SN-for-Arduino-Memory-module-Free-Shipping/32346088222.html?spm=2114.13010608.0.115.m17sBM
Мосфеты
https://ru.aliexpress.com/item/0-24V-Top-Mosfet-Button-IRF520-MOS-Driver-Module-For-Arduino-MCU-ARM-Raspberry-pi/32683995933.html?spm=2114.30010708.3.107.KfpFow&ws_ab_test=searchweb201556_0,searchweb201602_1_10065_10068_112_10069_110_111_418_10017_109_108_10060_10061_10062_10057_10039_10056_10055_10037_10054_301_10033_10059_10032_10058_10073_10070_10052_10053_10050_10051,searchweb201603_1&btsid=2d5f0fa3-75f9-4db8-ada6-259410c8623d
Я MOSFETы паял сам по схеме выше.
Скетч как у автора схемы (только необходимо отредактировать время включения-выключения под себя).
http://mysku.ru/blog/ebay/21157.html
Только необходимо помнить, что для прошивки Arduino pro mini неодходим преобразователь USB-TTL. Но можно купить не Arduino pro mini а Arduino Nano V3 и понадобится только USB кабель.
https://ru.aliexpress.com/item/Nano-V3-ATmega328-CH340G-Micro-USB-Pin-he...
Большое спасибо, у меня nano
Только я немного доработал это устройство (добавил LCD 16х2 для отображения времени и даты).
Использую два канала ШИМ так: 1-й канал плавно зажигает теплый белый свет (светодиодные модули), а затем 2-й канал плавно добавляет холодного белого света. Закат в обратном порядке. Тем самым время рассвета и заката - 10 минут.
После недели эксплуатации в птичнике - птицы стали понимать, что когда яркость освещения уменьшается они быстренько занимают "вакантные" места для ночлега.
Вот еще нашел таймер м системой закат-рассвет. Собрал на макетке все работает. Позволяет настраивать время рассвета и заката и продолжительность этих событий, есть термометр. Недостаток- 1 канал, 1 программа.
http://aquascape-promotion.com/aquaforum/index.php?/topic/1571-arduino-dlja-avtomatizacii-akvariuma-proekt-aquabox/
Интересный пример если полностью перейти на светодиоды отказавшись от других ламп, но у меня возникло пару вопросов хотя это даже не вопросы а замечание по применению, мне нужно управлять освещением в курятнике и датчик температуры DS18b20 там не нужен т.к. температурный датчик есть в модуле часов DS3231 и второе если питать светодиодную ленту 5м или 2х5м от старой зарядки от мобильника то непотянет нужно отдельно 12в БП и ардуину питать через понижающий модуль. Хотя могу ошибатся из за недостатка знаний.
, мне нужно управлять освещением в курятнике и датчик температуры DS18b20 там не нужен т.к. температурный датчик есть в модуле часов DS3231 .
Если не будете разносить корпуса питания и контроллера раздельно + силовые элементы, реально получите разницу температур помещения и корпуса градусов в 10, птичкам не понравится.
у меня есть DS18b20 обычный без корпуса при желании его можно вынести за корпус не далеко сантиметров на 15-20 и в моём случае это не критично за отопление отвеет другая система, а ардуина будет просто показывать температуру в помещении.
Ребят посоветуйте еще блок питания по мощности какой лучше взять?
Можно датчиком температуры контролировать температуру мощьных светодиодов в освещении и после доработки программы включать вентилятор охлаждения.
[quote=NeAndryxa]
Интересный пример если полностью перейти на светодиоды отказавшись от других ламп, но у меня возникло пару вопросов хотя это даже не вопросы а замечание по применению, мне нужно управлять освещением в курятнике и датчик температуры DS18b20 там не нужен т.к. температурный датчик есть в модуле часов DS3231 и второе если питать светодиодную ленту 5м или 2х5м от старой зарядки от мобильника то непотянет нужно отдельно 12в БП и ардуину питать через понижающий модуль. Хотя могу ошибатся из за недостатка знаний.
[/quote/]
Лента 5 метров (60 светодиодов на 1 метр) потребляет 1,6 А
Лента 5 метров (120 светодиодов на 1 метр) потребляет 3,2 А
БП сотового телефона выдает 5 В и ток до 0,5 А]
Использую в птичнике БП от ПК (12В 20 А). От него питается вся автоматика и освещение.
Для освещения птичника использую LED модули
Лента со временем забивается пылью, а модули покрыты защитным слоем - легче очищать (можно даже мыть IP65).
Покупаю модули с теплым белым и холодным белым цветом. Двадцать таких модулей дадут вам освещение как 100 Вт. лампа, а потреблять будут 20 Вт (если модули по 5 шт 5050 как на картинке).
Можно использовать 10 Вт светодиоды установив их на радиатор (благо в Китае они стоят 12-15 рублей за штуку).
Сделал вот такие светильники - светят как 200-300 Вт лампа.
Интересная конструкция на последней картинке, возьму на вооружение.
С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК тиристорный. У меня перепелки, нужен полумрак.
NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?
NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?
Вместо обычного термометра, пусть показывает температуру
Только я немного доработал это устройство (добавил LCD 16х2 для отображения времени и даты).
Т.е. только отображение? Поменять например время вкл-выкл нельзя?
Да. Нельзя.
С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК тиристорный. У меня перепелки, нужен полумрак.
NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?
Тоже перепелочки, тоже полумрак, но на светодиодах. На фото полная яркость.
Декоративные птацы
"Центр управления"
Вентиляторы на БП не забиваются? Или в другом помещении стоят?
Переодически продуваю сжатым воздухом.
Зачётно! И по птичнику и по станции управления!
Стесняюсь спросить - прибыльное ли это дело? Ведь вложиться нужно ощутимо!
Насчет прибыли трудно сказать. Это как охотник или рыболов - снасти, ружья, лицензии стоят немало а "выхлоп" минимальный.
Птичник, клетки, инкубаторы, автоматика - все делаю сам (с точки зрения экономии).
Скажем так: Перепелов у меня 230 шт. Ценным яйцом и мясом для семьи - обеспечен, Яиц продаю 3500-4000 шт в месяц (по 4 руб. за шт.). Мясо 5-6 кг на продажу в месяц (500р за кг.). Комбикорма съдают 3 мешка в месяц по 40 кг. (800 руб. за мешок).
Еще очень выжен рынок сбыта.
Считайте.
p.s Я не беру в расчет что для всего этого нужно (помещение, клетки, инкубаторы, и.т.д.)
Короче это больше ПОЗЕЗНОЕ хобби!
Прошу прощение за флуд в теме.
С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК тиристорный. У меня перепелки, нужен полумрак.
NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?
Собрал таймер в железе (без макетки) - работает нормально. Кстати о полумраке для перепелок, в этом устройстве регулируется не только время рассвета и заката и их длительность но и мощьность свечения светодиодов в % от 0% до 100%. Можно выставить яркость дневного освещения в % а так же можно выставить ночьную подсветку от 10% до 100% или совсем выключить 0%.
Датчик температуры выведу на улицу. Буду наблюдать за "Забортной" температурой.
Схемой доволен.
Подключали от компьютерного БП с десятиватными светодиодами, ардуине 12В скармливали?
Добавлено спустя.... немного подразобрался все понял, ардуина будет жрать 5В от бп а свтодиоды от 12В но комутировать будут через мосфет irl3705n
Подключали от компьютерного БП с десятиватными светодиодами, ардуине 12В скармливали?
Добавлено спустя.... немного подразобрался все понял, ардуина будет жрать 5В от бп а свтодиоды от 12В но комутировать будут через мосфет irl3705n
Можно и так! Я питаю от 12В всё (как на схеме в коментарии №6). В устройствах устанавливаю импульсный стабилизатор (выставляю 5 В) для питания ардуинки . В свое время их купил много (по 25 руб.).
Зачётно! И по птичнику и по станции управления!
Стесняюсь спросить - прибыльное ли это дело? Ведь вложиться нужно ощутимо!
Немного добавлю к ответу MVN123P. Если живешь в своем доме, то основное вложение сделано. Кроме инкуба, все можно для начала из г-на и палок слепить, я половину хозблока освободил и разместил их в помещении 1,7х2,2м. Сейчас тоже где то 240шт, но возможно на этой площади до 800-900шт (вытяжка нужна хорошая). Полностью кормят себя и оплачивают все коммунальные платежи по дому + немного остается на развитие. Самое сложное действительно сбыт, клиентура весьма медленно набирается.
Решил и я представить свои наработки в этом направлении. Добавил свои функции. Система у меня выполняет следующие действия - подсвечивает комнатные цветы и рассаду в зимнее время года, подсвечивает курятник, имеющий оконные проемы. Может кому пригодится....
Выполняемые функции системы:
- возможность автономной настройки текущего времени и точек включения-выключения;
- определения текущего естественного освещения и включения подсветки при необходимости;
- настройка уровня граничного освещения;
-функция заката и рассвета (дорабатывается возможность длительности эффектов).
Код программы
#include <PWM.h> #include <LiquidCrystal_I2C.h> #include <EEPROM.h> #include <Wire.h> #define DS1307_I2C_ADDRESS 0x68 #define PWM1 9 // канал аппаратного ШИМ LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address of the first lcd to 0x27 //for a 16 chars and 2 line display (измерено) const byte outPin = 13; // выход на реле boolean F_hand, F_svet, F_day, F_evening, F_morning, F_svd; byte OVFcount; byte setMinClockOn; // byte setHorClockOn; byte setMinClockOff; // byte setHorClockOff; byte key(){ //// определение кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 1; else if (val < 150) return 2; else if (val < 350) return 3; else if (val < 550) return 4; else if (val < 700) return 5; else return 0; } /////////// часы .. byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { // noInterrupts(); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); // interrupts(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { // noInterrupts(); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); //interrupts(); } ////// установка часов void setClock(){ //noInterrupts(); byte pos = 1; byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print("set to save"); lcd.setCursor(0, 0); // выводим инфу if (hour < 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.print(" "); if (dayOfMonth < 10) lcd.print("0"); lcd.print(dayOfMonth); lcd.print("/"); if (month < 10) lcd.print("0"); lcd.print(month); lcd.print("/"); if (year < 10) lcd.print("0"); lcd.print(year); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 13) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 1 && KEY == 3) hour++; // крутим значения else if (pos == 1 && KEY == 4) hour--; else if (pos == 4 && KEY == 3) minute++; else if (pos == 4 && KEY == 4) minute--; else if (pos == 7 && KEY == 3) dayOfMonth++; else if (pos == 7 && KEY == 4) dayOfMonth--; else if (pos == 10 && KEY == 3) month++; else if (pos == 10 && KEY == 4) month--; else if (pos == 13 && KEY == 3) year++; else if (pos == 13 && KEY == 4) year--; if (hour > 23) hour = 0; else if (minute > 59) minute = 0; else if (dayOfMonth > 31) dayOfMonth = 0; else if (month > 12) month = 1; else if (year > 99) year = 0; }// конец цикла setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); lcd.noBlink(); lcd.clear(); lcd.print(" Saved"); delay(1500); //interrupts(); }/// void setOnOff(){ byte pos = 0; // noInterrupts(); lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print("set to save"); lcd.setCursor(0, 0); // выводим инфу if (setHorClockOn < 10) lcd.print("0"); lcd.print(setHorClockOn); lcd.print(":"); if (setMinClockOn < 10) lcd.print("0"); lcd.print(setMinClockOn); lcd.print(" "); if (setHorClockOff < 10) lcd.print("0"); lcd.print(setHorClockOff); lcd.print(":"); if (setMinClockOff < 10) lcd.print("0"); lcd.print(setMinClockOff); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 9) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения else if (pos == 0 && KEY == 4) setHorClockOn--; else if (pos == 3 && KEY == 3) setMinClockOn++; else if (pos == 3 && KEY == 4) setMinClockOn--; else if (pos == 6 && KEY == 3) setHorClockOff++; else if (pos == 6 && KEY == 4) setHorClockOff--; else if (pos == 9 && KEY == 3) setMinClockOff++; else if (pos == 9 && KEY == 4) setMinClockOff--; if (setHorClockOn > 23) setHorClockOn = 0; else if (setMinClockOn > 59) setMinClockOn = 0; else if (setHorClockOff > 23) setHorClockOff = 0; else if (setMinClockOff > 59) setMinClockOff = 0; }// конец цикла lcd.noBlink(); lcd.clear(); //запись установленных значений времяни ы ЕЕПРОМ EEPROM.write(0, setMinClockOn); EEPROM.write(1, setHorClockOn); EEPROM.write(3, setMinClockOff); EEPROM.write(4, setHorClockOff); lcd.print(" Saved"); delay(1500); //interrupts(); }/// //стартовое меню void menu(){ lcd.clear(); char menuTxt[2][14] = {"set ON/OFF >>", "set clock >>"}; byte pos = 0; // while(1){ while(key() != 2){ delay(200); byte KEY = key(); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print("."); lcd.print(menuTxt[pos]); if (KEY == 3 && pos != 0) pos--; else if (KEY == 4 && pos < 1) pos++; if (KEY == 5 && pos == 0) setOnOff(); else if (KEY == 5 && pos == 1) setClock(); } lcd.clear(); } void setup(){ pinMode(outPin, OUTPUT); digitalWrite(outPin, LOW); pinMode(PWM1, OUTPUT); // analogWrite(PWM1, 0); InitTimersSafe(); SetPinFrequency(PWM1, 1000); Wire.begin(); //lcd.begin(16, 2); lcd.init(); lcd.backlight(); lcd.clear(); Serial.begin(9600); digitalWrite(outPin, HIGH); F_svet = false; //исходное состояние F_day = false; F_evening = false; F_morning = false; setMinClockOn = EEPROM.read(0); //считывание значений текущего времени setHorClockOn = EEPROM.read(1); setMinClockOff = EEPROM.read(3); setHorClockOff = EEPROM.read(4); OVFcount = 0; } void loop() { // digitalWrite(outPin, LOW); byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //************************ //определяем текущее состояние системы // обработка кнопок if (key() == 1) menu(); // если нажата селект else if (key() == 3){ if (F_svet == false) { F_svet = true; } else { F_svet = false; } } int Sens = analogRead(3);// получение информации с датчика освещенности Sens = constrain(Sens, 300, 1000); byte SensLevel = map (Sens,300, 1000, 0, 255); byte Potenc = analogRead(1)>>2;// получение информации с определителя уровня Serial.println(SensLevel); Serial.println(Potenc); // сравниваем время и определяем граничное состояние (утро-вечер) if (setMinClockOff == minute && setHorClockOff == hour && second == 0 ) { F_evening = true; F_svet = true; OVFcount = 0; } if (setMinClockOn == minute && setHorClockOn == hour && second == 0 ) { F_morning = true; F_svet = true; OVFcount = 0; } // определяем уровень естественного освещения if (SensLevel<=Potenc-20) F_day = false; else F_day = true; //*************** //*************** //стратегия //если определяется как день - выход выключить if (F_day == true) digitalWrite(PWM1,LOW); else if (F_svet == false) digitalWrite(PWM1,LOW); //если определяется как ночь без условий - выход включить else if (F_day == false && F_svet == true && F_evening == false && F_morning == false){ digitalWrite(PWM1, HIGH); } //если наступило установленное утро - плавно увеличиваем яркость до максимума else if (F_day == false && F_svet == true && F_morning == true){ OVFcount++; if (OVFcount<255) pwmWrite(PWM1, OVFcount); else { digitalWrite(PWM1, HIGH); F_morning = false; F_svet = true; } } //если наступил установленный вечер - плавно уменьшаем яркость до нуля else if (F_day == false && F_svet == true && F_evening == true){ OVFcount++; if (OVFcount<255) { pwmWrite(PWM1, (255-OVFcount)); } else { digitalWrite(PWM1,LOW); F_evening = false; F_svet = false ; } } Serial.println(OVFcount); //мигание светодиодом - работаем if (F_svd == true){ digitalWrite(outPin, LOW); F_svd = false; } else { digitalWrite(outPin, HIGH); F_svd = true; } // lcd.clear(); lcd.setCursor(0, 0); if (hour < 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.setCursor(0, 1); if (F_day == true) lcd.print("--DAY--"); else if (F_morning == true && F_day == false) lcd.print("MORNING"); else if (F_evening == true && F_day == false) lcd.print("EVENING"); else if (F_day == false && F_morning == false && F_evening == false) lcd.print("-NIGHT-"); else lcd.print("???????"); // lcd.setCursor(11, 0); if (setHorClockOn < 10) lcd.print("0"); lcd.print(setHorClockOn); lcd.print(":"); if (setMinClockOn < 10) lcd.print("0"); lcd.print(setMinClockOn); lcd.setCursor(11, 1); if (setHorClockOff < 10) lcd.print("0"); lcd.print(setHorClockOff); lcd.print(":"); if (setMinClockOff < 10) lcd.print("0"); lcd.print(setMinClockOff); lcd.setCursor(7, 0); if (F_svet == true) lcd.print("ON-"); else lcd.print("OFF"); delay(500); // нужно для нармальной работы кнопок }Вид получившейся системе.
п.с. Система сформирована в виде двух блоков - система настройки (индикатор и клавиатура) и и сам блок управления. Реализовано для двух целей - 1 - уменьшение габаритов, 2- систему настройки можно использовать для большого числа блоков управления...
Спасибо за информацию! Нужная штуковина. А схему можно набросать?
Попробую сегодня На листке набросать, сфоткать и кинуть. Извиняйте, но в редакторах нет времени рисоать
Схемку накидал.
Не много подправил функционал
- Возможность в меню отключать закат и рассвет (работа с обыкновенным реле или с энергосберегающими или светодиодныи лампами)
- возможность выбора длительности эффектов заката и рассвета.
-Дополнительная кнопка выбора состояния (в случае не подключенного выносного устройства управления...)
Код..
#include <PWM.h> #include <LiquidCrystal_I2C.h> #include <EEPROM.h> #include <Wire.h> #define DS1307_I2C_ADDRESS 0x68 #define PWM1 9 // канал аппаратного ШИМ #define button_pin 8 //#define outPin 13 LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address of the first lcd to 0x27 //for a 16 chars and 2 line display (измерено) const byte outPin = 13; // выход на реле boolean button; boolean F_PWM, F_svet, F_day, F_evening, F_morning, F_svd; unsigned long OVFcount; byte PWMOn; byte setPWMOn; byte setMinClockOn; // byte setHorClockOn; byte setMinClockOff; // byte setHorClockOff; byte key(){ //// определение кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 1; else if (val < 150) return 2; else if (val < 350) return 3; else if (val < 550) return 4; else if (val < 700) return 5; else return 0; } /////////// часы .. byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { // noInterrupts(); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); // interrupts(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { // noInterrupts(); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); //interrupts(); } ////// установка часов void setClock(){ //noInterrupts(); byte pos = 1; byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print("set to save"); lcd.setCursor(0, 0); // выводим инфу if (hour < 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.print(" "); if (dayOfMonth < 10) lcd.print("0"); lcd.print(dayOfMonth); lcd.print("/"); if (month < 10) lcd.print("0"); lcd.print(month); lcd.print("/"); if (year < 10) lcd.print("0"); lcd.print(year); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 13) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 1 && KEY == 3) hour++; // крутим значения else if (pos == 1 && KEY == 4) hour--; else if (pos == 4 && KEY == 3) minute++; else if (pos == 4 && KEY == 4) minute--; else if (pos == 7 && KEY == 3) dayOfMonth++; else if (pos == 7 && KEY == 4) dayOfMonth--; else if (pos == 10 && KEY == 3) month++; else if (pos == 10 && KEY == 4) month--; else if (pos == 13 && KEY == 3) year++; else if (pos == 13 && KEY == 4) year--; if (hour > 23) hour = 0; else if (minute > 59) minute = 0; else if (dayOfMonth > 31) dayOfMonth = 0; else if (month > 12) month = 1; else if (year > 99) year = 0; }// конец цикла setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); lcd.noBlink(); lcd.clear(); lcd.print(" Saved"); delay(1500); //interrupts(); }/// void setOnOff(){ byte pos = 0; // noInterrupts(); lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print("set to save"); lcd.setCursor(0, 0); // выводим инфу if (setHorClockOn < 10) lcd.print("0"); lcd.print(setHorClockOn); lcd.print(":"); if (setMinClockOn < 10) lcd.print("0"); lcd.print(setMinClockOn); lcd.print(" "); if (setHorClockOff < 10) lcd.print("0"); lcd.print(setHorClockOff); lcd.print(":"); if (setMinClockOff < 10) lcd.print("0"); lcd.print(setMinClockOff); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 9) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения else if (pos == 0 && KEY == 4) setHorClockOn--; else if (pos == 3 && KEY == 3) setMinClockOn++; else if (pos == 3 && KEY == 4) setMinClockOn--; else if (pos == 6 && KEY == 3) setHorClockOff++; else if (pos == 6 && KEY == 4) setHorClockOff--; else if (pos == 9 && KEY == 3) setMinClockOff++; else if (pos == 9 && KEY == 4) setMinClockOff--; if (setHorClockOn > 23) setHorClockOn = 0; else if (setMinClockOn > 59) setMinClockOn = 0; else if (setHorClockOff > 23) setHorClockOff = 0; else if (setMinClockOff > 59) setMinClockOff = 0; }// конец цикла lcd.noBlink(); lcd.clear(); //запись установленных значений времяни ы ЕЕПРОМ EEPROM.write(0, setMinClockOn); EEPROM.write(1, setHorClockOn); EEPROM.write(3, setMinClockOff); EEPROM.write(4, setHorClockOff); lcd.print(" Saved"); delay(1500); //interrupts(); }/// void setPWM(){ byte pos = 0; lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print("set PWM-moning"); lcd.setCursor(5, 0); lcd.print("PWM="); lcd.setCursor(0, 0); // выводим инфу if (F_PWM == true) { lcd.print("ON-"); PWMOn = 1; } else { lcd.print("OFF"); PWMOn = 0; } lcd.setCursor(5, 0); lcd.print("PWM="); lcd.print(" "); if (setPWMOn < 10) lcd.print("0"); lcd.print(setPWMOn); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 10) pos += 10; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 10; else if (pos == 0 && KEY == 3) F_PWM = true; else if (pos == 0 && KEY == 4) F_PWM = false; else if (pos == 10 && KEY == 3) setPWMOn++; else if (pos == 10 && KEY == 4) setPWMOn--; if (setPWMOn > 20) setPWMOn = 0; }// конец цикла lcd.noBlink(); lcd.clear(); EEPROM.write(5, setPWMOn); EEPROM.write(6, PWMOn); lcd.print(" Saved"); delay(1500); }/// //стартовое меню void menu(){ lcd.clear(); char menuTxt[3][14] = {"set ON/OFF >>", "set clock >>", "PWM-moning >>"}; byte pos = 0; // while(1){ while(key() != 2){ delay(200); byte KEY = key(); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print("."); lcd.print(menuTxt[pos]); if (KEY == 3 && pos != 0) pos--; else if (KEY == 4 && pos < 2) pos++; if (KEY == 5 && pos == 0) setOnOff(); else if (KEY == 5 && pos == 1) setClock(); else if (KEY == 5 && pos == 2) setPWM(); } lcd.clear(); } void setup(){ pinMode(button_pin, INPUT_PULLUP); pinMode(outPin, OUTPUT); digitalWrite(outPin, LOW); pinMode(PWM1, OUTPUT); // analogWrite(PWM1, 0); InitTimersSafe(); SetPinFrequency(PWM1, 1000); Wire.begin(); //lcd.begin(16, 2); lcd.init(); lcd.backlight(); lcd.clear(); Serial.begin(9600); digitalWrite(outPin, HIGH); F_svet = false; //исходное состояние F_day = false; F_evening = false; F_morning = false; setMinClockOn = EEPROM.read(0); //считывание значений текущего времени setHorClockOn = EEPROM.read(1); setMinClockOff = EEPROM.read(3); setHorClockOff = EEPROM.read(4); setPWMOn = EEPROM.read(5); PWMOn = EEPROM.read(6); if (PWMOn == 0) F_PWM = false; else F_PWM = true; OVFcount = 0; } void loop() { // digitalWrite(outPin, LOW); byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //************************ //определяем текущее состояние системы // обработка кнопок******* if (key() == 1) menu(); // если нажата селект else if (key() == 3){ if (F_svet == false) F_svet = true; else F_svet = false; } button = digitalRead(button_pin); if (!button) { if (F_svet == false) F_svet = true; else F_svet = false; } //********* int Sens = analogRead(3);// получение информации с датчика освещенности Sens = constrain(Sens, 300, 1000); byte SensLevel = map (Sens,300, 1000, 0, 255); byte Potenc = analogRead(1)>>2;// получение информации с определителя уровня Serial.println(SensLevel); Serial.println(Potenc); // сравниваем время и определяем граничное состояние (утро-вечер) if (setMinClockOff == minute && setHorClockOff == hour && second == 0 ) { F_evening = true; F_svet = true; OVFcount = 0; } if (setMinClockOn == minute && setHorClockOn == hour && second == 0 ) { F_morning = true; F_svet = true; OVFcount = 0; } // определяем уровень естественного освещения if (SensLevel<=Potenc-20) F_day = false; else F_day = true; //*************** //*************** //стратегия //если определяется как день - выход выключить if (F_day == true) digitalWrite(PWM1,LOW); else if (F_svet == false) digitalWrite(PWM1,LOW); //если определяется как ночь без условий - выход включить else if (F_day == false && F_svet == true && F_evening == false && F_morning == false){ digitalWrite(PWM1, HIGH); } if (F_PWM == true){ //если наступило установленное утро - плавно увеличиваем яркость до максимума if (F_day == false && F_svet == true && F_morning == true){ OVFcount = OVFcount + (50 * setPWMOn); if (OVFcount<64000) pwmWriteHR(PWM1, (OVFcount)); else { digitalWrite(PWM1, HIGH); F_morning = false; F_svet = true; } } //если наступил установленный вечер - плавно уменьшаем яркость до нуля else if (F_day == false && F_svet == true && F_evening == true){ OVFcount = OVFcount + (50 * setPWMOn); if (OVFcount<64000) { pwmWriteHR(PWM1, (65000-OVFcount)); } else { digitalWrite(PWM1,LOW); F_evening = false; F_svet = false ; } } } else { if (F_day == false && F_svet == true && F_morning == true){ digitalWrite(PWM1, HIGH); F_morning = false; F_svet = true; } //если наступил установленный вечер - плавно уменьшаем яркость до нуля else if (F_day == false && F_svet == true && F_evening == true){ digitalWrite(PWM1,LOW); F_evening = false; F_svet = false ; } } Serial.println(OVFcount); //мигание светодиодом - работаем if (F_svd == true){ digitalWrite(outPin, LOW); F_svd = false; } else { digitalWrite(outPin, HIGH); F_svd = true; } // lcd.clear(); lcd.setCursor(0, 0); if (hour < 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.setCursor(0, 1); if (F_day == true) lcd.print("--DAY--"); else if (F_morning == true && F_day == false) lcd.print("MORNING"); else if (F_evening == true && F_day == false) lcd.print("EVENING"); else if (F_day == false && F_morning == false && F_evening == false) lcd.print("-NIGHT-"); else lcd.print("???????"); // lcd.setCursor(11, 0); if (setHorClockOn < 10) lcd.print("0"); lcd.print(setHorClockOn); lcd.print(":"); if (setMinClockOn < 10) lcd.print("0"); lcd.print(setMinClockOn); lcd.setCursor(11, 1); if (setHorClockOff < 10) lcd.print("0"); lcd.print(setHorClockOff); lcd.print(":"); if (setMinClockOff < 10) lcd.print("0"); lcd.print(setMinClockOff); lcd.setCursor(7, 0); if (F_svet == true) lcd.print("ON-"); else lcd.print("OFF"); delay(500); // нужно для нармальной работы кнопок }Схемка маленькая и не увеличивается. Есле можно немного крупнее.
Сначала собрал такую автоматику http://pikabu.ru/story/prostoe_upravlenie_osveshcheniem_kuryatnika_na_ar... из за того что был ограничен в деталях, потом собрал с экранчиком как для аквариума и в принципе все устраивает, закат-рассвет есть но не хватает в этой схеме функции настройки часов кнопками чтобы поделка стала самодостаточным изделием.
И еще заметил такую нехорошую вещ при тестировании, если сделать короткое откоючение питания то освещение виснет и начинает работать только при начатии на кнопку ресет на самой ардуине, не замечали?
С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК тиристорный. У меня перепелки, нужен полумрак.
NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?
Собрал таймер в железе (без макетки) - работает нормально. Кстати о полумраке для перепелок, в этом устройстве регулируется не только время рассвета и заката и их длительность но и мощьность свечения светодиодов в % от 0% до 100%. Можно выставить яркость дневного освещения в % а так же можно выставить ночьную подсветку от 10% до 100% или совсем выключить 0%.
Датчик температуры выведу на улицу. Буду наблюдать за "Забортной" температурой.
Схемой доволен.
Какое время включения и выключения вам нужно?
Здравствуйте , включение (рассвет) 6:00 утро выключение 8:00 утро---------------включение вечер 17:00 закат до 21:00 и выключение. Длительность рассвета и заката нужно для кур думаю 30 мин. нормально будет. Думаю сформулировал понятно,заранее благодарю.
https://yadi.sk/d/s8VKVqHV3WcuQ6
Исправлен таймер №1 под выше время. В 6:00 включается 30 минут , 8:00 выключается 3 минуты, в 17:00 включается 3 минуты , в 21:00 выключается 30 минут. Каналы 2 и 3 не прописаны.
P.s. Когда будете прошивать незабудьте в скетче раскоментировать строку и выставить дату и время
На данный момент пользуюсь другой схемой (без плавного гашения), но более гибкий. Есть канал термостата + три канала управления по 3 программы на каждый канал. Кстати делал этими тремя каналами "псевдо" диммирование, просто загорались с интервалом 2 минуты дотолнительные светильники. Программируется кнопками в отличии от этого.
http://sxem.org/2-vse-stati/22-tajmery/96-nedelnyj-tajmer-s-displeem-nok...
Спасибо Вам за ваш отклик, но я хотел реализовать другой проект ,вот ссылка: https://cloud.mail.ru/public/4AbA/3RtmS71fa
Спасибо Вам за ваш отклик, но я хотел реализовать другой проект ,вот ссылка: https://cloud.mail.ru/public/4AbA/3RtmS71fa
А что в этом проекте не получается?
Так же раскоментируйте и измените строку
Вам нужен многоканальный таймер на 49 суток? Их есть у меня. :-)
Непонимаю что к чему настраивать ! Например часы не могу настроить!
так в аквабоксе часы настраиваются отдельно т.е. при проверке часов можно с компа установить время и аквабокс потом с ними, настройки через меню нет.
Непонимаю что к чему настраивать ! Например часы не могу настроить!
В этом проекте часы выставляются в момент прошивки ардуино. Раскомментируйте строку которая показана в посте 45. На момент заливки ардуино выставите дату и время в этой строке и залейте скейтч. Не забывайте что при каждой прошивке необходимо корректировать эту строку. Или при последующих прошивках закомментировать эту строку.
так в аквабоксе часы настраиваются отдельно т.е. при проверке часов можно с компа установить время и аквабокс потом с ними, настройки через меню нет.
Так точно.