Многоканальный таймер управления освещением с функцией "Закат-рассвет"

MVN123P
Offline
Зарегистрирован: 29.07.2016

Здравствуйте форумчане. В Ардуино технике я новичок, но повторить конструкция мне посилам. 

И так требуется помощь в реализации устройства управления освещением в птичнике. Мы с женой дома разводим декоративных птиц. Летом проблем с освещением нет, а вот зимой когда они в птичнике необходимо им включать и выключать освещение в заданное время. В данный момент использую программируемые таймеры-розетки, которые не совсем удобны. Поясняю почему: вечером когда неожиданно (для птиц) выключается освещение - птицы некоторое время прибывают в "панике" (мечатся по клетке ударяясь об сетку), т.к. не успели занять свое спальное место. Поэтому необходимо реализовать плавное выключение освещения (Закат-рассвет). Многоканальный таймер поможет организовать несколько зон.

Вот такая задача! Заранее всем спасибо!!!

bwn
Offline
Зарегистрирован: 25.08.2014

Здесь посмотрите.

yucan
Offline
Зарегистрирован: 20.04.2015

Здесь есть управлением плавным включением-затуханием света, управление по часам и дням недели.

http://mysku.ru/blog/ebay/21157.html

MVN123P
Offline
Зарегистрирован: 29.07.2016

Большое спасибо! 

Реализовал задуманное с помощью ссылки которую вы мне дали.

Схема MOSFETов

3 канала управления светодиодным освещением

1 и 2 каналы управляются ШИМ и в заданное время плавно (в течении 4-х минут) меняют яркость (включение или выключение)

3 канал управляются без ШИМ (т.е. включает и выключает освещение в заданное время - сразу)

Время включения и выключения программируется в скетче.

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Возникла аналогичная задача только в курятнике у родителей, в схемотехнике я пока не разбираюсь, подскажите какие компоненты .нужны для сборки схемы с мосфетами?

MVN123P
Offline
Зарегистрирован: 29.07.2016

У меня все на работе. Подробно отвечу в понедельник.

MVN123P
Offline
Зарегистрирован: 29.07.2016

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...

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Большое спасибо, у меня nano

MVN123P
Offline
Зарегистрирован: 29.07.2016

Только я немного доработал это устройство (добавил LCD 16х2 для отображения времени и даты).

Использую два канала ШИМ так: 1-й канал плавно зажигает теплый белый свет (светодиодные модули), а затем 2-й канал плавно добавляет холодного белого света. Закат в обратном порядке. Тем самым время рассвета и заката - 10 минут.

После недели эксплуатации в птичнике - птицы стали понимать, что когда яркость освещения уменьшается они быстренько занимают "вакантные" места для ночлега.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Вот еще нашел таймер м системой закат-рассвет. Собрал на макетке все работает. Позволяет настраивать время рассвета и заката и продолжительность этих событий, есть термометр. Недостаток- 1 канал, 1 программа.

http://aquascape-promotion.com/aquaforum/index.php?/topic/1571-arduino-dlja-avtomatizacii-akvariuma-proekt-aquabox/

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Интересный пример если полностью перейти на светодиоды отказавшись от других ламп, но у меня возникло пару вопросов хотя это даже не вопросы а замечание по применению, мне нужно управлять освещением в курятнике и датчик температуры DS18b20 там не нужен т.к. температурный датчик есть в модуле часов DS3231 и второе если питать светодиодную ленту 5м или 2х5м от старой зарядки от мобильника то непотянет нужно отдельно 12в БП и ардуину питать через понижающий модуль. Хотя могу ошибатся из за недостатка знаний.

 

bwn
Offline
Зарегистрирован: 25.08.2014

NeAndryxa пишет:

, мне нужно управлять освещением в курятнике и датчик температуры DS18b20 там не нужен т.к. температурный датчик есть в модуле часов DS3231 .

Если не будете разносить корпуса питания и контроллера раздельно + силовые элементы, реально получите разницу температур помещения и корпуса градусов в 10, птичкам не понравится.

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

у меня есть DS18b20 обычный без корпуса при желании его можно вынести за корпус не далеко сантиметров на 15-20 и в моём случае это не критично за отопление отвеет другая система, а ардуина будет просто показывать температуру в помещении.

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Ребят посоветуйте еще блок питания по мощности какой лучше взять?

MVN123P
Offline
Зарегистрирован: 29.07.2016

Можно датчиком температуры контролировать температуру мощьных светодиодов в освещении и после доработки программы включать вентилятор охлаждения.

 

MVN123P
Offline
Зарегистрирован: 29.07.2016

[quote=NeAndryxa]

Интересный пример если полностью перейти на светодиоды отказавшись от других ламп, но у меня возникло пару вопросов хотя это даже не вопросы а замечание по применению, мне нужно управлять освещением в курятнике и датчик температуры DS18b20 там не нужен т.к. температурный датчик есть в модуле часов DS3231 и второе если питать светодиодную ленту 5м или 2х5м от старой зарядки от мобильника то непотянет нужно отдельно 12в БП и ардуину питать через понижающий модуль. Хотя могу ошибатся из за недостатка знаний.

 

[/quote/]

Лента 5 метров (60 светодиодов на 1 метр) потребляет 1,6 А

Лента 5 метров (120 светодиодов на 1 метр) потребляет 3,2 А

БП сотового телефона выдает 5 В и ток до 0,5 А]

MVN123P
Offline
Зарегистрирован: 29.07.2016

Использую в птичнике БП от ПК (12В 20 А). От него питается вся автоматика и освещение.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Для освещения птичника использую LED модули

Лента со временем забивается пылью, а модули покрыты защитным слоем - легче очищать (можно даже мыть IP65).

Покупаю модули с теплым белым и холодным белым цветом. Двадцать таких модулей дадут вам освещение как 100 Вт. лампа, а потреблять будут 20 Вт (если модули по 5 шт 5050 как на картинке).

Можно использовать 10 Вт светодиоды установив их на радиатор (благо в Китае они стоят 12-15 рублей за штуку).

Сделал вот такие светильники - светят как 200-300 Вт лампа.

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Интересная конструкция на последней картинке, возьму на вооружение.

bwn
Offline
Зарегистрирован: 25.08.2014

С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК  тиристорный. У меня перепелки, нужен полумрак.

NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

bwn пишет:

NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?

Вместо обычного термометра, пусть показывает температуру

yucan
Offline
Зарегистрирован: 20.04.2015

MVN123P пишет:

Только я немного доработал это устройство (добавил LCD 16х2 для отображения времени и даты).

Т.е. только отображение? Поменять например время вкл-выкл нельзя?

MVN123P
Offline
Зарегистрирован: 29.07.2016

Да. Нельзя.

MVN123P
Offline
Зарегистрирован: 29.07.2016

bwn пишет:

С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК  тиристорный. У меня перепелки, нужен полумрак.

NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?

Тоже перепелочки, тоже полумрак, но на светодиодах. На фото полная яркость.

Декоративные птацы

"Центр управления"

bwn
Offline
Зарегистрирован: 25.08.2014

Вентиляторы на БП не забиваются? Или в другом помещении стоят?

MVN123P
Offline
Зарегистрирован: 29.07.2016

Переодически продуваю сжатым воздухом.

yucan
Offline
Зарегистрирован: 20.04.2015

Зачётно! И по птичнику и по станции управления!

Стесняюсь спросить - прибыльное ли это дело? Ведь вложиться нужно ощутимо!

MVN123P
Offline
Зарегистрирован: 29.07.2016

Насчет прибыли трудно сказать. Это как охотник или рыболов - снасти, ружья, лицензии стоят немало а "выхлоп" минимальный.

Птичник, клетки, инкубаторы, автоматика - все делаю сам (с точки зрения экономии).

Скажем так: Перепелов у меня 230 шт. Ценным яйцом и мясом для семьи - обеспечен, Яиц продаю 3500-4000 шт в месяц (по 4 руб. за шт.). Мясо 5-6 кг на продажу в месяц (500р за кг.). Комбикорма съдают 3 мешка в месяц по 40 кг. (800 руб. за мешок).

Еще очень выжен рынок сбыта.

Считайте.

p.s Я не беру в расчет что для всего этого нужно (помещение, клетки, инкубаторы, и.т.д.)

Короче это больше ПОЗЕЗНОЕ хобби!

Прошу прощение за флуд в теме.

MVN123P
Offline
Зарегистрирован: 29.07.2016

bwn пишет:

С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК  тиристорный. У меня перепелки, нужен полумрак.

NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?

Собрал таймер в железе (без макетки) - работает нормально. Кстати о полумраке для перепелок, в этом устройстве регулируется не только время рассвета и заката и их длительность но и мощьность свечения светодиодов в % от 0% до 100%. Можно выставить яркость дневного освещения в % а так же можно выставить ночьную подсветку от 10% до 100% или совсем выключить 0%.

Датчик температуры выведу на улицу. Буду наблюдать за "Забортной" температурой.

Схемой доволен.

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Подключали от компьютерного БП с десятиватными светодиодами, ардуине 12В скармливали?

Добавлено спустя.... немного подразобрался все понял, ардуина будет жрать 5В от бп а свтодиоды от 12В но комутировать будут через мосфет irl3705n

MVN123P
Offline
Зарегистрирован: 29.07.2016

MVN123P
Offline
Зарегистрирован: 29.07.2016

NeAndryxa пишет:

Подключали от компьютерного БП с десятиватными светодиодами, ардуине 12В скармливали?

Добавлено спустя.... немного подразобрался все понял, ардуина будет жрать 5В от бп а свтодиоды от 12В но комутировать будут через мосфет irl3705n

Можно и так! Я питаю от 12В всё (как на схеме в коментарии №6). В устройствах устанавливаю импульсный стабилизатор (выставляю 5 В) для питания ардуинки . В свое время их купил много (по 25 руб.).

bwn
Offline
Зарегистрирован: 25.08.2014

yucan пишет:

Зачётно! И по птичнику и по станции управления!

Стесняюсь спросить - прибыльное ли это дело? Ведь вложиться нужно ощутимо!

Немного добавлю к ответу MVN123P. Если живешь в своем доме, то основное вложение сделано. Кроме инкуба, все можно для начала из г-на и палок слепить, я половину хозблока освободил и разместил их в помещении 1,7х2,2м. Сейчас тоже где то 240шт, но возможно на этой площади до 800-900шт (вытяжка нужна хорошая). Полностью кормят себя и оплачивают все коммунальные платежи по дому + немного остается на развитие. Самое сложное действительно сбыт, клиентура весьма медленно набирается.

isaev0302
Offline
Зарегистрирован: 28.06.2016

Решил и я представить свои наработки в этом направлении. Добавил свои функции. Система у меня выполняет следующие действия - подсвечивает комнатные цветы и рассаду в зимнее время года, подсвечивает курятник, имеющий оконные проемы. Может кому пригодится....

Выполняемые функции системы:

- возможность автономной настройки текущего времени и точек включения-выключения;

- определения текущего естественного освещения и включения подсветки при необходимости;

- настройка уровня граничного освещения;

-функция заката и  рассвета (дорабатывается возможность длительности эффектов).

Код программы 

#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- систему настройки можно использовать для большого числа блоков управления...

MVN123P
Offline
Зарегистрирован: 29.07.2016

Спасибо за информацию! Нужная штуковина. А схему можно набросать?

isaev0302
Offline
Зарегистрирован: 28.06.2016

Попробую сегодня На листке набросать, сфоткать и кинуть. Извиняйте, но в редакторах нет времени рисоать

isaev0302
Offline
Зарегистрирован: 28.06.2016

Схемку накидал.

Не много подправил функционал

- Возможность в меню отключать закат и рассвет (работа с обыкновенным реле или с энергосберегающими или светодиодныи лампами)

- возможность выбора длительности эффектов заката и рассвета.

-Дополнительная кнопка выбора состояния (в случае не подключенного выносного устройства управления...)

Код..

#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); // нужно для нармальной работы кнопок
}

 

MVN123P
Offline
Зарегистрирован: 29.07.2016

Схемка маленькая и не увеличивается. Есле можно немного крупнее.

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

Сначала собрал такую автоматику http://pikabu.ru/story/prostoe_upravlenie_osveshcheniem_kuryatnika_na_ar... из за того что был ограничен в деталях, потом собрал с экранчиком как для аквариума и в принципе все устраивает, закат-рассвет есть но не хватает в этой схеме функции настройки часов кнопками чтобы поделка стала самодостаточным изделием. 

И еще заметил такую нехорошую вещ при тестировании, если сделать короткое откоючение питания то освещение виснет и начинает работать только при начатии на кнопку ресет на самой ардуине, не замечали?

ivan1984
Offline
Зарегистрирован: 04.12.2017

MVN123P пишет:

bwn пишет:

С ледами одна проблема - нужен мощный БП. Для себя остановился на 4х40Вт лампы накаливания в обычных плафонах + диммер от МК  тиристорный. У меня перепелки, нужен полумрак.

NeAndryxa, если за температуру другой блок отвечает, зачем вообще огород с термометрами городить?

Собрал таймер в железе (без макетки) - работает нормально. Кстати о полумраке для перепелок, в этом устройстве регулируется не только время рассвета и заката и их длительность но и мощьность свечения светодиодов в % от 0% до 100%. Можно выставить яркость дневного освещения в % а так же можно выставить ночьную подсветку от 10% до 100% или совсем выключить 0%.

Датчик температуры выведу на улицу. Буду наблюдать за "Забортной" температурой.

Схемой доволен.

Поделитесь пожалуйста скетчем (уже настроеным) если не жалко ,а то у меня не получается настроить всё это хозяйство.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Какое время включения и выключения вам нужно?

ivan1984
Offline
Зарегистрирован: 04.12.2017

Здравствуйте , включение (рассвет) 6:00 утро выключение 8:00 утро---------------включение  вечер 17:00 закат до 21:00 и выключение. Длительность  рассвета и заката нужно для кур думаю 30 мин. нормально будет. Думаю сформулировал понятно,заранее благодарю.

MVN123P
Offline
Зарегистрирован: 29.07.2016

https://yadi.sk/d/s8VKVqHV3WcuQ6

Исправлен таймер №1 под выше время. В 6:00 включается 30 минут , 8:00 выключается 3 минуты, в 17:00 включается 3 минуты , в 21:00 выключается 30 минут. Каналы 2 и 3 не прописаны.

P.s. Когда будете прошивать незабудьте в скетче раскоментировать строку и выставить дату и время

setDateDs3231(14, 56, 16, 2, 10, 12, 13); //second, minute, hour, dayOfWeek, dayOfMonth, month, year
  

 

MVN123P
Offline
Зарегистрирован: 29.07.2016

На данный момент пользуюсь другой схемой (без плавного гашения), но более гибкий. Есть канал термостата + три канала управления по 3 программы на каждый канал. Кстати делал этими тремя каналами "псевдо" диммирование, просто загорались с интервалом 2 минуты дотолнительные светильники. Программируется кнопками в отличии от этого. 

http://sxem.org/2-vse-stati/22-tajmery/96-nedelnyj-tajmer-s-displeem-nok...

ivan1984
Offline
Зарегистрирован: 04.12.2017

Спасибо Вам за ваш отклик, но я хотел реализовать другой проект ,вот ссылка:  https://cloud.mail.ru/public/4AbA/3RtmS71fa

MVN123P
Offline
Зарегистрирован: 29.07.2016

ivan1984 пишет:

Спасибо Вам за ваш отклик, но я хотел реализовать другой проект ,вот ссылка:  https://cloud.mail.ru/public/4AbA/3RtmS71fa

А что в этом проекте не получается?

Так же раскоментируйте и измените  строку 

RTC.adjust(DateTime(2014, 7, 12, 22, 48, 1)); 

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Вам нужен многоканальный таймер на 49 суток? Их есть у меня. :-)

ivan1984
Offline
Зарегистрирован: 04.12.2017

Непонимаю что к чему настраивать ! Например часы не могу настроить!

NeAndryxa
Offline
Зарегистрирован: 17.09.2016

так в аквабоксе часы настраиваются отдельно т.е. при проверке часов можно с компа установить время и аквабокс потом с ними, настройки через меню нет.

MVN123P
Offline
Зарегистрирован: 29.07.2016

ivan1984 пишет:

Непонимаю что к чему настраивать ! Например часы не могу настроить!

В этом проекте часы выставляются в момент прошивки ардуино. Раскомментируйте строку которая показана в посте 45. На момент заливки ардуино выставите дату и время в этой строке и залейте скейтч. Не забывайте что при каждой прошивке необходимо корректировать эту строку. Или при последующих прошивках закомментировать эту строку.

MVN123P
Offline
Зарегистрирован: 29.07.2016

NeAndryxa пишет:

так в аквабоксе часы настраиваются отдельно т.е. при проверке часов можно с компа установить время и аквабокс потом с ними, настройки через меню нет.

Так точно.