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

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

DetSimen пишет:

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

Хотелось бы взглянуть.

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

Спасибо часы настроил,осталось всё остальное)))

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

ivan1984 пишет:

Спасибо часы настроил,осталось всё остальное)))

Остальное это что?

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

Остальное это время и длительность восхода - заката ,термометр на экране ноли показывает. Буду пробовать. Спасибо вам если что обращусь к вам,если вы не против.

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

ivan1984 пишет:

Остальное это время и длительность восхода - заката ,термометр на экране ноли показывает. Буду пробовать. Спасибо вам если что обращусь к вам,если вы не против.

Рад что помог. Обрасщайтесь 

p.s. Есть хорошие проекты инкубаторов, брудеров (если интересно?)

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

Помогите разобратся с этим чёртовым кодом, как настороить время и длительность восхода и заката ,а то я походу сам не разберусь в этой хрени! Что куда вставлять подменять,для меня эти константы и подобное космос. Спасибо.

#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC

#include <OneWire.h>
#include <DallasTemperature.h>

#include "RTClib.h" //Подключаем библиотеку для использования модуля часов реального времени RTC
 
#include <EEPROM.h>

OneWire oneWire(A3);
DallasTemperature ds(&oneWire);

#include <LiquidCrystal_I2C.h> // библиотека экрана
LiquidCrystal_I2C lcd(0x3F,20,4);

int PWM_LW_MIN = 0; //Если необходим ток покоя на LED - изменить эту константу
int PWM_LW_MAX = 250; //Если необходимо ограничить максимальную яркость - уменьшить значение
#define PWM_LW_PIN 3 //Пин порта, где будет ШИМ LW

#define mn 60UL //Дополнительные константы для удобства
#define hr 3600UL //Отражают соответствующие количества секунд
#define d 86400UL

RTC_DS1307 RTC;

int  RH = 0;
int  RM = 0;
int  RD = 0;
int  ZH = 0;
int  ZM = 0;
int  ZD = 0;
int  PS = 0;
int  ScD = 250;
int  ScN = 50;

const int buttonPin = 2;
int buttonState = 0;
const int buttonPin2 = 4;
int buttonState2 = 0;
const int buttonPin3 = 5;
int buttonState3 = 0;    
int pos = 1;

//********************************************************************************************

void setup(){
 
Serial.begin(9600);
Wire.begin(); //Инициируем I2C интерфейс

RH = EEPROM.read(0);
RM = EEPROM.read(1);
RD = EEPROM.read(2);
ZH = EEPROM.read(3);
ZM = EEPROM.read(4);
ZD = EEPROM.read(5);

ds.begin();  

RTC.begin(); //Инициирум RTC модуль

pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
      
 

lcd.init(); // запускаем библиотеку экрана
lcd.backlight();

if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(2018, 5, 28, 21, 07, 1));
}
RTC.adjust(DateTime(2018, 5, 28, 21, 07, 1));
RTC.adjust(DateTime(__DATE__, __TIME__));
} // КОНЕЦ ИНИЦИАЛИЗАЦИИ

//********************************************************************************************

void loop() // ПРОГРАММЫй безусловный ЦИКЛ
{
 

   
long sunrise_start = RH*hr+RM*mn; //Начало восхода в 9 - 45
long sunrise_duration = RD*mn; //Длительность восхода 30 минут
long sunset_start = ZH*hr+ZM*mn; //начало заката в 21-15
long sunset_duration = ZD*mn; //Длительность заката 30 минут

long pwm_LW;
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла
long Day_time = myTime.unixtime() % 86400; //сохраняем в переменную - время в формате UNIX
if ((Day_time<sunrise_start) || //Если с начала суток меньше чем начало восхода
(Day_time>=sunset_start+sunset_duration)) { //Или больше чем начало заката + длительность
pwm_LW = PWM_LW_MIN; //Величина для записи в порт равна минимуму

//*********************************************************************************************
// обработка интервала восхода
//*********************************************************************************************
}else if ((Day_time>=sunrise_start) && //Если с начала суток больше чем начало восхода
(Day_time<sunrise_start+sunrise_duration)){ //И меньше чем начало восхода + длительность

pwm_LW = ((Day_time - sunrise_start)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration; //Вычисляем для рассвета величину для записи в порт ШИМ

//*********************************************************************************************
// обработка интервала заката
//*********************************************************************************************
}else if ((Day_time>=sunset_start) && //Если начала суток больше чем начало заката и меньше чем
(Day_time<sunset_start+sunset_duration)){ //начало заката плюс длительность

pwm_LW = ((sunset_start+sunset_duration - Day_time)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration; //Вычисляем для заката величину для записи в порт ШИМ

//********************************************************************************************
// обработка интервала от конца рассвета и до начала заката,
// когда свет должен быть включен на максимальную яркость
//********************************************************************************************
}else {
pwm_LW = PWM_LW_MAX; //Устанавливаем максимальную величину для записи в порт ШИМ

}

analogWrite(PWM_LW_PIN, pwm_LW); //Пишем в порт вычисленное значение

if (Day_time>=sunrise_start && Day_time<=sunset_start ){
  analogWrite(11, ScD);
}
  else {
 analogWrite(11, ScN);
}
 

 
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
  pos++;
  lcd.clear();
  delay (250);
  }

if (pos == 11 || pos > 11){
  lcd.clear();
  pos=1;
    }

switch (pos){
case 1:
      ds.requestTemperatures();
      //lcd.clear();
      lcd.setCursor(8,1);
      lcd.print("t ");
      lcd.print(ds.getTempCByIndex(0));
      lcd.print("C");
      lcd.setCursor(0,0);
      lcd.print("AQUA");
      lcd.setCursor(6,0);
      if (myTime.day() < 10) lcd.print("0");
      lcd.print(myTime.day(),DEC);
      lcd.print("/");
      if (myTime.month() < 10) lcd.print("0");
      lcd.print(myTime.month(),DEC);
      lcd.print("/");
      lcd.print(myTime.year(),DEC);
      lcd.setCursor(0,1);
      if (myTime.hour() < 10) lcd.print("0");
      lcd.print(myTime.hour(),DEC);
      lcd.print(":");
      if (myTime.minute() < 10) lcd.print("0");
      lcd.print(myTime.minute(),DEC);
      break;
      
case 2:
       
      lcd.setCursor(1,0);
      lcd.print("RASSVET START");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
        RH++;
   
        delay(100);
        }
      if (RH >= 24)  {
        RH = 0;
        }
        buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        RM++;
 
        delay(100);  
        }
      if (RM >= 60)  {
        RM = 0;
        }
      lcd.setCursor(5,1);
      if ( RH < 10) lcd.print("0");
      
      lcd.print(RH);
      lcd.print(":");
      if ( RM < 10) lcd.print("0");
        
      lcd.print(RM);
      break;
      
case 3:
     
      lcd.setCursor(2,0);
      lcd.print("RASSVET LONG");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
        RD--;
        delay(100);
        }
      if (RD > 60)  {
        RD = 0;
        }
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        RD++;
        delay(100);
        }
      if (RD < 0)  {
        RD = 60;  
        }
      lcd.setCursor(7,1);
      if ( RD < 10) lcd.print("0");  
      lcd.print(RD);
      break;
case 4:
      
      lcd.setCursor(3,0);
      lcd.print("ZAKAT START");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
        ZH++;
        delay(100);
        }
      if (ZH >= 24)  {
        ZH = 0;
        }
        buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        ZM++;
        delay(100);
        }
      if (ZM >= 60)  {
        ZM = 0;
        }
      lcd.setCursor(6,1);
      if ( ZH < 10) lcd.print("0");  
      lcd.print(ZH);
      lcd.print(":");
      if ( ZM < 10) lcd.print("0");  
      lcd.print(ZM);
      break;
     
case 5:
       
      lcd.setCursor(3,0);
      lcd.print("ZAKAT LONG");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
        ZD--;
        delay(100);
        }
      if (ZD > 60)  {
        ZD = 0;
        }
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        ZD++;
        delay(100);
        }
      if (ZD < 0)  {
        ZD = 60;  
        }
      lcd.setCursor(7,1);
      if ( ZD < 10) lcd.print("0");  
      lcd.print(ZD);
      break;
     
case 6:
     
      lcd.setCursor(0,0);
      lcd.print("POWER LAMP");
      lcd.print(" ");
      PS = PWM_LW_MAX / 2.5;
      lcd.print(PS);
      lcd.print(" ");
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        PWM_LW_MAX = PWM_LW_MAX + 25;
         
         delay(150);
         lcd.clear();
        }
      if (PWM_LW_MAX > 250)  {
        PWM_LW_MAX = 250;
         
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
       PWM_LW_MAX = PWM_LW_MAX - 25;
         
        delay(150);
        lcd.clear();
        }
      if (PWM_LW_MAX < 0)  {
        PWM_LW_MAX = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) {
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) {
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) {
        lcd.print("***");
        }
        if (PS >=40 && PS <50 ) {
        lcd.print("****");
        }
        if (PS >=50 && PS <60 ) {
        lcd.print("*****");
        }
        if (PS >=60 && PS <70 ) {
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) {
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) {
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) {
        lcd.print("*********");
        }
        if (PS >=100) {
        lcd.print("**********");
        }
      break;
      
case 7:
     
      lcd.setCursor(0,0);
      lcd.print("NIGHT POWER");
      lcd.print(" ");
      PS = PWM_LW_MIN / 2.5;
      lcd.print(PS);
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        PWM_LW_MIN = PWM_LW_MIN + 25;
         
         delay(150);
         lcd.clear();
        }
      if (PWM_LW_MIN > 250)  {
        PWM_LW_MIN = 250;
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
       PWM_LW_MIN = PWM_LW_MIN - 25;
        
        delay(150);
        lcd.clear();
        }
      if (PWM_LW_MIN < 0)  {
        PWM_LW_MIN = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) {
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) {
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) {
        lcd.print("***");
        }
        if (PS >=40 && PS <50 ) {
        lcd.print("****");
        }
        if (PS >=50 && PS <60 ) {
        lcd.print("*****");
        }
        if (PS >=60 && PS <70 ) {
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) {
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) {
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) {
        lcd.print("*********");
        }
        if (PS >=100) {
        lcd.print("**********");
        }
      break;

case 8:
     
      lcd.setCursor(1,0);
      lcd.print("DISP DAY");
      lcd.print(" ");
      PS = ScD / 2.5;
      lcd.print(PS);
      lcd.print(" ");
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
        ScD = ScD + 25;
         
         delay(150);
         lcd.clear();
        }
      if (ScD > 250)  {
        ScD = 250;
         
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
       ScD = ScD - 25;
         
        delay(150);
        lcd.clear();
        }
      if (ScD < 0)  {
        ScD = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) {
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) {
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) {
        lcd.print("***");
        }
        if (PS >=40 && PS <50 ) {
        lcd.print("****");
        }
        if (PS >=50 && PS <60 ) {
        lcd.print("*****");
        }
        if (PS >=60 && PS <70 ) {
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) {
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) {
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) {
        lcd.print("*********");
        }
        if (PS >=100) {
        lcd.print("**********");
        }
      break;

case 9:
     
      lcd.setCursor(0,0);
      lcd.print("DISP NIGHT");
      lcd.print(" ");
      PS = ScN / 2.5;
      lcd.print(PS);
      lcd.print(" ");
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
       ScN = ScN + 25;
         
         delay(150);
         lcd.clear();
        }
      if (ScN > 250)  {
        ScN = 250;
         
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
       ScN = ScN - 25;
         
        delay(150);
        lcd.clear();
        }
      if (ScN < 0)  {
        ScN = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) {
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) {
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) {
        lcd.print("***");
        }
        if (PS >=40 && PS <50 ) {
        lcd.print("****");
        }
        if (PS >=50 && PS <60 ) {
        lcd.print("*****");
        }
        if (PS >=60 && PS <70 ) {
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) {
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) {
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) {
        lcd.print("*********");
        }
        if (PS >=100) {
        lcd.print("**********");
        }
      break;
      
case 10:
      
      lcd.setCursor(1,0);
      lcd.print("SAVE TO MEMORY");
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
      lcd.clear();  
      lcd.setCursor(4,0);
      lcd.print("SAVE GO");
      delay(500);
      for (int thisChar = 0; thisChar < 16; thisChar++) {
      lcd.setCursor(thisChar, 1);
      lcd.print("*");
      delay(50);
      }
      EEPROM.write(0, RH);
      EEPROM.write(1, RM);
      EEPROM.write(2, RD);
      EEPROM.write(3, ZH);
      EEPROM.write(4, ZM);
      EEPROM.write(5, ZD);
      lcd.clear();
      pos = 1;
      }
      break;
      }
 //delay (100);
}

 

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

ivan1984 пишет:

Помогите разобратся с этим чёртовым кодом, как настороить время и длительность восхода и заката ,а то я походу сам не разберусь в этой хрени! Что куда вставлять подменять,для меня эти константы и подобное космос. Спасибо.

 

В программе выставляется только дата и время 1 раз во время прошивки (в строке как в 45 посту).

у тебя в этой строке написано так:

//RTC.adjust(DateTime(2018, 5, 28, 21, 07, 1));

установи так

RTC.adjust(DateTime(2018, 5, 28, 21, 07, 1));

Остальные похожие строки должны начинаться с  //

Время восхода, длительность восхода, время заката, длительность заката и т.д. выставляется кнопками на экране LCD

MVN123P
Offline
Зарегистрирован: 29.07.2016
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(2018, 5, 28, 21, 07, 1));
}
//RTC.adjust(DateTime(2018, 5, 28, 21, 07, 1));
//RTC.adjust(DateTime(__DATE__, __TIME__));

 

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

Просто после того как на экране выставил все параметры доходишь до меню SAVE TO MEMORY нужно нажать ОК (среднюю кнопку) на экране пробегут звездочки******** и данные запишутся в память.

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

Меню на экране LCD

RASSVET START - время рассвета (ЧЧ:ММ)

RASSVET LONG - Длительность рассвета (ММ)

ZAKAT START - время заката  (ЧЧ:ММ)

ZAKAT LONG - длительность заката (ММ)

POWER LAMP - яркость ламп %

NIGHT POWER - ночная яркость % (если нужно чтобы ночью осталось свечение 100-10%, если нет 0%)

DISP NIGHT - подсветка дисплея %

SAVE TO MEMORY - записать выбранные параметры в память

 

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

Проблема в том что две кнопки которые должны делать настройки ,не работают,  работает только которая переберает режимы РАССВЕТ СТАРТ  ЗАКАТ СТАРТ ну и т.д  а две никак не реагируют. Не понимаю почему,либо из за того что у меня собрано все на Pro Mini либо эта Про Мини бракованая.

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

ivan1984 пишет:

Проблема в том что две кнопки которые должны делать настройки ,не работают,  работает только которая переберает режимы РАССВЕТ СТАРТ  ЗАКАТ СТАРТ ну и т.д  а две никак не реагируют. Не понимаю почему,либо из за того что у меня собрано все на Pro Mini либо эта Про Мини бракованая.

про резисторы 10кОм на входы (к кнопкам) не забыл? Кнопки к выводам 2,4,5

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

Та не всё на месте, походу ардуинка бракованая. А кнопки можна припаять на другие порты?

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

ivan1984 пишет:

Та не всё на месте, походу ардуинка бракованая. А кнопки можна припаять на другие порты?

Да. Только в скетче переправить.

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

Вот видео как всё происходит:  https://youtu.be/oCLk6lwjPc0

b707
Offline
Зарегистрирован: 26.05.2017

ivan1984, видео вряд ли кому-то интересно... если бы вывместо этого  скетч нормально вставили - можно было бы подсказать вам, в какие строки вставить значения рассвета и заката без вских кнопок.

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

MVN123P пишет:

DetSimen пишет:

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

Хотелось бы взглянуть.

https://github.com/DetSimen/Arduino-

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

DetSimen пишет:

MVN123P пишет:

DetSimen пишет:

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

Хотелось бы взглянуть.

https://github.com/DetSimen/Arduino-

Что это?

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

ivan1984 пишет:

Вот видео как всё происходит:  https://youtu.be/oCLk6lwjPc0

Из видео такое ощущение что идет наводка на провода, для начала укаратить провода покороче или с резисторами что то не так (не правильно подключены). Я бы для проверки подключил бы без кнопки просто провода с резисторами прямо к ардуинке и проверил (зачастую сами кнопки с "приветом"). 

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

MVN123P пишет:

DetSimen пишет:

MVN123P пишет:

DetSimen пишет:

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

Хотелось бы взглянуть.

https://github.com/DetSimen/Arduino-

Что это?

Программный таймер на 8/12/16 независимых каналов.  От 1 миллисекунды до 49+ суток. 

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

Хотя, нет, для Вас это неактуально. 

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

А как это нормально скетч вставить, я ж его вставил постами высше.

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

Подскажите  как правильно вставить скетч.

ivan1984
Offline
Зарегистрирован: 04.12.2017
[code]
#include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 


#include <OneWire.h>
#include <DallasTemperature.h>

#include "RTClib.h" //Подключаем библиотеку для использования модуля часов реального времени RTC
 
#include <EEPROM.h>


OneWire oneWire(A3);
DallasTemperature ds(&oneWire); 

#include <LiquidCrystal_I2C.h> // библиотека экрана
LiquidCrystal_I2C lcd(0x27,20,4);



int PWM_LW_MIN = 0; //Если необходим ток покоя на LED - изменить эту константу 
int PWM_LW_MAX = 250; //Если необходимо ограничить максимальную яркость - уменьшить значение 
#define PWM_LW_PIN 3 //Пин порта, где будет ШИМ LW 

#define mn 60UL //Дополнительные константы для удобства 
#define hr 3600UL //Отражают соответствующие количества секунд 
#define d 86400UL 

RTC_DS1307 RTC; 

int  RH = 0;
int  RM = 0;
int  RD = 0;
int  ZH = 0;
int  ZM = 0;
int  ZD = 0;
int  PS = 0;
int  ScD = 250;
int  ScN = 50; 


const int buttonPin = 2;
int buttonState = 0;
const int buttonPin2 = 4;
int buttonState2 = 0; 
const int buttonPin3 = 5;
int buttonState3 = 0;    
int pos = 1; 



//******************************************************************************************** 



void setup(){ 
 
Serial.begin(9600);
Wire.begin(); //Инициируем I2C интерфейс 

RH = EEPROM.read(0);
RM = EEPROM.read(1);
RD = EEPROM.read(2);
ZH = EEPROM.read(3);
ZM = EEPROM.read(4);
ZD = EEPROM.read(5);

ds.begin();  

RTC.begin(); //Инициирум RTC модуль 


pinMode(buttonPin, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
      
  

lcd.init(); // запускаем библиотеку экрана 
lcd.backlight();

if (! RTC.isrunning()) { 
Serial.println("RTC is NOT running!"); 
RTC.adjust(DateTime(2014, 7, 12, 22, 48, 1)); 
} 
//RTC.adjust(DateTime(2012, 7, 31, 21, 53, 1)); 
//RTC.adjust(DateTime(__DATE__, __TIME__)); 
} // КОНЕЦ ИНИЦИАЛИЗАЦИИ 

//******************************************************************************************** 



void loop() // ПРОГРАММЫй безусловный ЦИКЛ 
{
  

   
long sunrise_start = RH*hr+RM*mn; //Начало восхода в 9 - 45 
long sunrise_duration = RD*mn; //Длительность восхода 30 минут 
long sunset_start = ZH*hr+ZM*mn; //начало заката в 21-15 
long sunset_duration = ZD*mn; //Длительность заката 30 минут 

long pwm_LW; 
DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла 
long Day_time = myTime.unixtime() % 86400; //сохраняем в переменную - время в формате UNIX 
if ((Day_time<sunrise_start) || //Если с начала суток меньше чем начало восхода 
(Day_time>=sunset_start+sunset_duration)) { //Или больше чем начало заката + длительность 
pwm_LW = PWM_LW_MIN; //Величина для записи в порт равна минимуму 


//********************************************************************************************* 
// обработка интервала восхода 
//********************************************************************************************* 
}else if ((Day_time>=sunrise_start) && //Если с начала суток больше чем начало восхода 
(Day_time<sunrise_start+sunrise_duration)){ //И меньше чем начало восхода + длительность 

pwm_LW = ((Day_time - sunrise_start)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration; //Вычисляем для рассвета величину для записи в порт ШИМ 


//********************************************************************************************* 
// обработка интервала заката 
//********************************************************************************************* 
}else if ((Day_time>=sunset_start) && //Если начала суток больше чем начало заката и меньше чем 
(Day_time<sunset_start+sunset_duration)){ //начало заката плюс длительность 

pwm_LW = ((sunset_start+sunset_duration - Day_time)*(PWM_LW_MAX-PWM_LW_MIN)) / sunrise_duration; //Вычисляем для заката величину для записи в порт ШИМ 


//******************************************************************************************** 
// обработка интервала от конца рассвета и до начала заката, 
// когда свет должен быть включен на максимальную яркость 
//******************************************************************************************** 
}else { 
pwm_LW = PWM_LW_MAX; //Устанавливаем максимальную величину для записи в порт ШИМ 

} 

analogWrite(PWM_LW_PIN, pwm_LW); //Пишем в порт вычисленное значение 



if (Day_time>=sunrise_start && Day_time<=sunset_start ){
  analogWrite(11, ScD);
}
  else {
 analogWrite(11, ScN);
}
  

  
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) { 
  pos++;
  lcd.clear();
  delay (250); 
  }


if (pos == 11 || pos > 11){
  lcd.clear();
  pos=1;
    }

switch (pos){
case 1:
      ds.requestTemperatures();
      //lcd.clear();
      lcd.setCursor(8,1); 
      lcd.print("t "); 
      lcd.print(ds.getTempCByIndex(0)); 
      lcd.print("C");
      lcd.setCursor(0,0); 
      lcd.print("AQUA"); 
      lcd.setCursor(6,0); 
      if (myTime.day() < 10) lcd.print("0"); 
      lcd.print(myTime.day(),DEC); 
      lcd.print("/"); 
      if (myTime.month() < 10) lcd.print("0"); 
      lcd.print(myTime.month(),DEC); 
      lcd.print("/"); 
      lcd.print(myTime.year(),DEC); 
      lcd.setCursor(0,1); 
      if (myTime.hour() < 10) lcd.print("0"); 
      lcd.print(myTime.hour(),DEC); 
      lcd.print(":"); 
      if (myTime.minute() < 10) lcd.print("0"); 
      lcd.print(myTime.minute(),DEC);
      break;
      
case 2:
       
      lcd.setCursor(1,0); 
      lcd.print("RASSVET START");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
        RH++;
   
        delay(100); 
        }
      if (RH >= 24)  {
        RH = 0; 
        }
        buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        RM++;
  
        delay(100);  
        }
      if (RM >= 60)  {
        RM = 0; 
        }
      lcd.setCursor(5,1);
      if ( RH < 10) lcd.print("0");
      
      lcd.print(RH);
      lcd.print(":");
      if ( RM < 10) lcd.print("0");
        
      lcd.print(RM);
      break;
      
case 3:
     
      lcd.setCursor(2,0); 
      lcd.print("RASSVET LONG");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
        RD--;
        delay(100); 
        }
      if (RD > 60)  {
        RD = 0; 
        }
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        RD++;
        delay(100); 
        }
      if (RD < 0)  {
        RD = 60;  
        }
      lcd.setCursor(7,1);
      if ( RD < 10) lcd.print("0");  
      lcd.print(RD); 
      break;
case 4:
      
      lcd.setCursor(3,0); 
      lcd.print("ZAKAT START");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) {
        ZH++;
        delay(100);
        }
      if (ZH >= 24)  {
        ZH = 0; 
        }
        buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        ZM++;
        delay(100);
        }
      if (ZM >= 60)  {
        ZM = 0; 
        }
      lcd.setCursor(6,1);
      if ( ZH < 10) lcd.print("0");  
      lcd.print(ZH);
      lcd.print(":");
      if ( ZM < 10) lcd.print("0");  
      lcd.print(ZM);
      break;
     
case 5:
       
      lcd.setCursor(3,0); 
      lcd.print("ZAKAT LONG");
      buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
        ZD--;
        delay(100); 
        }
      if (ZD > 60)  {
        ZD = 0; 
        }
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        ZD++;
        delay(100); 
        }
      if (ZD < 0)  {
        ZD = 60;  
        }
      lcd.setCursor(7,1);
      if ( ZD < 10) lcd.print("0");  
      lcd.print(ZD); 
      break;
     
case 6:
     
      lcd.setCursor(0,0); 
      lcd.print("POWER LAMP");
      lcd.print(" ");
      PS = PWM_LW_MAX / 2.5;
      lcd.print(PS);
      lcd.print(" ");
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        PWM_LW_MAX = PWM_LW_MAX + 25;
         
         delay(150); 
         lcd.clear();
        }
      if (PWM_LW_MAX > 250)  {
        PWM_LW_MAX = 250;
         
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
       PWM_LW_MAX = PWM_LW_MAX - 25;
         
        delay(150);
        lcd.clear();
        }
      if (PWM_LW_MAX < 0)  {
        PWM_LW_MAX = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) { 
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) { 
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) { 
        lcd.print("***");
        } 
        if (PS >=40 && PS <50 ) { 
        lcd.print("****");
        } 
        if (PS >=50 && PS <60 ) { 
        lcd.print("*****");
        } 
        if (PS >=60 && PS <70 ) { 
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) { 
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) { 
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) { 
        lcd.print("*********");
        }
        if (PS >=100) { 
        lcd.print("**********");
        }
      break;
      
case 7:
     
      lcd.setCursor(0,0); 
      lcd.print("NIGHT POWER");
      lcd.print(" ");
      PS = PWM_LW_MIN / 2.5;
      lcd.print(PS);
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        PWM_LW_MIN = PWM_LW_MIN + 25;
         
         delay(150);
         lcd.clear(); 
        }
      if (PWM_LW_MIN > 250)  {
        PWM_LW_MIN = 250; 
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
       PWM_LW_MIN = PWM_LW_MIN - 25;
        
        delay(150);
        lcd.clear(); 
        }
      if (PWM_LW_MIN < 0)  {
        PWM_LW_MIN = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) { 
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) { 
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) { 
        lcd.print("***");
        } 
        if (PS >=40 && PS <50 ) { 
        lcd.print("****");
        } 
        if (PS >=50 && PS <60 ) { 
        lcd.print("*****");
        } 
        if (PS >=60 && PS <70 ) { 
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) { 
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) { 
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) { 
        lcd.print("*********");
        }
        if (PS >=100) { 
        lcd.print("**********");
        }
      break;

case 8:
     
      lcd.setCursor(1,0); 
      lcd.print("DISP DAY");
      lcd.print(" ");
      PS = ScD / 2.5;
      lcd.print(PS);
      lcd.print(" ");
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
        ScD = ScD + 25;
         
         delay(150); 
         lcd.clear();
        }
      if (ScD > 250)  {
        ScD = 250;
         
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
       ScD = ScD - 25;
         
        delay(150);
        lcd.clear();
        }
      if (ScD < 0)  {
        ScD = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) { 
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) { 
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) { 
        lcd.print("***");
        } 
        if (PS >=40 && PS <50 ) { 
        lcd.print("****");
        } 
        if (PS >=50 && PS <60 ) { 
        lcd.print("*****");
        } 
        if (PS >=60 && PS <70 ) { 
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) { 
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) { 
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) { 
        lcd.print("*********");
        }
        if (PS >=100) { 
        lcd.print("**********");
        }
      break;

case 9:
     
      lcd.setCursor(0,0); 
      lcd.print("DISP NIGHT");
      lcd.print(" ");
      PS = ScN / 2.5;
      lcd.print(PS);
      lcd.print(" ");
      lcd.print("%");     
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) { 
       ScN = ScN + 25;
         
         delay(150); 
         lcd.clear();
        }
      if (ScN > 250)  {
        ScN = 250;
         
        }
       buttonState2 = digitalRead(buttonPin2);
      if (buttonState2 == HIGH) { 
       ScN = ScN - 25;
         
        delay(150);
        lcd.clear();
        }
      if (ScN < 0)  {
        ScN = 0;  
        }
        lcd.setCursor(3,1);
        if (PS >= 10 && PS <20 ) { 
        lcd.print("*");
        }
        if (PS >=20 && PS <30 ) { 
        lcd.print("**");
        }
        if (PS >=30 && PS <40 ) { 
        lcd.print("***");
        } 
        if (PS >=40 && PS <50 ) { 
        lcd.print("****");
        } 
        if (PS >=50 && PS <60 ) { 
        lcd.print("*****");
        } 
        if (PS >=60 && PS <70 ) { 
        lcd.print("******");
        }
        if (PS >=70 && PS <80 ) { 
        lcd.print("*******");
        }
        if (PS >=80 && PS <90 ) { 
        lcd.print("********");
        }
        if (PS >=90 && PS <100 ) { 
        lcd.print("*********");
        }
        if (PS >=100) { 
        lcd.print("**********");
        }
      break;
      
case 10:
      
      lcd.setCursor(1,0); 
      lcd.print("SAVE TO MEMORY");
      buttonState3 = digitalRead(buttonPin3);
      if (buttonState3 == HIGH) {
      lcd.clear();  
      lcd.setCursor(4,0);
      lcd.print("SAVE GO");
      delay(500);
      for (int thisChar = 0; thisChar < 16; thisChar++) {
      lcd.setCursor(thisChar, 1);
      lcd.print("*");
      delay(50);
      }
      EEPROM.write(0, RH);
      EEPROM.write(1, RM);
      EEPROM.write(2, RD);
      EEPROM.write(3, ZH);
      EEPROM.write(4, ZM);
      EEPROM.write(5, ZD);
      lcd.clear(); 
      pos = 1; 
      }
      break;
      }
 //delay (100);
}




[/code]

 

b707
Offline
Зарегистрирован: 26.05.2017

ivan1984, справились?

теперь посмотрите внимательно - все. что вам нужно - поправить строчки 99-102.

И никакие кнопки не нужны, да и дисплей тоже лишний в этом простейшем проекте.

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

Просто изменить цифры отмеченные красными кружками и всё?

b707
Offline
Зарегистрирован: 26.05.2017

ivan1984 пишет:

Просто изменить цифры отмеченные красными кружками и всё?

это номинация на пост года :))))

Это комментарии, парень :))) Может все-таки прочитаешь какой-нибудь букварик по программированию, прежде чем поделки собирать? А то не дай бог устроишь пожар в птичнике... похоже пока твои куры больше тебя понимают в ардуино :)

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

Не переживай за пожар и кур всё под контролем. Некогда мне програмирование учить,хотя желание есть. На счет ума не всё так плохо как ты думаеш! Ок. Спасибо за подсказки и критику.

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

b707 пишет:

ivan1984 пишет:

Просто изменить цифры отмеченные красными кружками и всё?

это номинация на пост года :))))

Это комментарии, парень :))) Может все-таки прочитаешь какой-нибудь букварик по программированию, прежде чем поделки собирать? А то не дай бог устроишь пожар в птичнике... похоже пока твои куры больше тебя понимают в ардуино :)

Не надо строить из себя "профи". Все мы так начинали, на ошибках учатся.

ivan1984 все что стоит после знаков // является пояснениями для человека  (т.е. помощь, что делает та или иная строка). Если в начале строки стоят такие символы данная строка игнорируется (не выполняется).

b707
Offline
Зарегистрирован: 26.05.2017

MVN123P пишет:

Не надо строить из себя "профи". Все мы так начинали, на ошибках учатся.

ну по сравнени с этим тут любой последний "новечек" - супер-профи.

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

Если вы ему так сочувствуете - просто поменяйте для него в коде нужные константы, номера строк я вам указал.