Помогите подправить логику

Sasha80
Offline
Зарегистрирован: 18.01.2016

Доброго времени суток уважаемые форумчане знающие толк в программировании! Вопрос к вам. Есть скетч который реализует плавное велючение и выключение светодиода. Алгоритм таков что я задаю время начала рассвета и длительность рассвета, а так же время начала зкакта и его длительность. Возможно ли переправить логику таким образом, чтоб можно было задавать две точко начала рассвета и две точки начала заката с их оканчаниями и длительностями внутрии одних суток. Т.Е.  всего четыре точки, Например:

10:00 начало рассвета (утром)  1:00 продолжительность

13:00 начало заката рассвета (утром)  1:00 продолжительность

17:00 начало рассвета заката вечером  1:00 продолжительность

19:00 начало заката (заката) вечером  1:00 продолжительность

void loop()
{
long Day_time = rtc.getUnixTime(rtc.getTime()) % 86400;

   long sunrise_start_R = HorSunriseOn_R*hr+MinSunriseOn_R*mn;                  //Начало восхода
   long sunrise_duration_R = HorSunriseDur_R*hr+MinSunriseDur_R*mn;             //Длительность восхода
   long sunset_start_R = HorSunsetOn_R*hr+MinSunsetOn_R*mn;                     //начало заката
   long sunset_duration_R = HorSunsetDur_R*hr+MinSunsetDur_R*mn;                //Длительность заката
  

 //*********************************************************************************************
//***************обработка интервала до восхода и после заката************************ 
//*********************************************************************************************
    if ((Day_time<sunrise_start_R) ||                                                          
        (Day_time>=sunset_start_R+sunset_duration_R)) {                                        
                  Rpwm = RPWM_MIN;                                                             
//*********************************************************************************************
//           обработка интервала восхода 
//*********************************************************************************************
    }else if ((Day_time>=sunrise_start_R) &&                                                      
              (Day_time<sunrise_start_R+sunrise_duration_R)){                                     

                  Rpwm =  ((Day_time - sunrise_start_R)*(RPWM_MAX-RPWM_MIN)) / sunrise_duration_R;

//*********************************************************************************************
//           обработка интервала заката 
//*********************************************************************************************
    }else if ((Day_time>=sunset_start_R) &&                                                     
              (Day_time<sunset_start_R+sunset_duration_R)){                                     

                  Rpwm = ((sunset_start_R+sunset_duration_R - Day_time)*(RPWM_MAX-RPWM_MIN)) / sunrise_duration_R; 
 
//********************************************************************************************
//           обработка интервала от конца рассвета и до начала заката,
//           когда свет должен быть включен на максимальную яркость 
//********************************************************************************************
    }else {
                  Rpwm = RPWM_MAX;                                                              
    }
    
    analogWrite(RPWM_PIN, Rpwm);            //Пишем в Красный порт вычисленное значение

    }

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

На всякий слуяай исходник скетча:

#include <Wire.h>                                                                           
#include <RTClib.h>                                                                         

#define PWM_MIN 0                                                                            
#define PWM_MAX 255                                                                          
#define PWM_PIN 9                                                                            

#define mn 60UL                                                                              
#define hr 3600UL                                                                            
#define d 86400UL

RTC_DS1307 RTC;          

long sunrise_start = 11*hr+15*mn;                                                            
long sunrise_duration = 30*mn;                                                                
long sunset_start = 21*hr+00*mn;                                                              
long sunset_duration = 30*mn;                                                                 
//********************************************************************************************
void setup(){
  Wire.begin();                                                                               
  RTC.begin();                                                                               
  analogWrite(PWM_PIN, PWM_MIN);                                                              
}                                                                                            
//********************************************************************************************
void loop()                                                                                   
{
    long pwm; 
    DateTime myTime = RTC.now();                                                              
    long Day_time = myTime.unixtime() % 86400;                                                
//*********************************************************************************************
//           обработка интервала до восхода и после заката
//*********************************************************************************************
    if ((Day_time<sunrise_start) ||                                                           
        (Day_time>=sunset_start+sunset_duration)) {                                           
                  pwm = PWM_MIN;                                                                   
//*********************************************************************************************
//           обработка интервала восхода 
//*********************************************************************************************
    }else if ((Day_time>=sunrise_start) &&                                                   
              (Day_time<sunrise_start+sunrise_duration)){                                    
    pwm =  ((Day_time - sunrise_start)*(PWM_MAX-PWM_MIN)) / sunrise_duration;   
//*********************************************************************************************
//           обработка интервала заката 
//*********************************************************************************************
    }else if ((Day_time>=sunset_start) &&                                                      
              (Day_time<sunset_start+sunset_duration)){                                       
   pwm = ((sunset_start+sunset_duration - Day_time)*(PWM_MAX-PWM_MIN)) / sunrise_duration; 
 
//********************************************************************************************
//           обработка интервала от конца рассвета и до начала заката,
//           когда свет должен быть включен на максимальную яркость 
//********************************************************************************************
    }else {
   pwm = PWM_MAX;                                                              
    }    
    analogWrite(PWM_PIN, pwm);            //Пишем в порт вычисленное значение             
}

Добавлял переменные:

long sunrise_stop = 21*hr+11*mn;   
long sunset_stop = 21*hr+21*mn; 
 

менял логику  обработка интервала до восхода и после заката на:

if ((Day_time<sunrise_start) ||                                                           
        (Day_time>=sunset_stop+sunset_duration) &&          
        (Day_time<sunrise_stop+sunrise_duration) || 
        (Day_time>=sunset_start)) {                                            
                  pwm = PWM_MIN; 

В результате диод вообще не горит!