Помогите подправить логику
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемые форумчане знающие толк в программировании! Вопрос к вам. Есть скетч который реализует плавное велючение и выключение светодиода. Алгоритм таков что я задаю время начала рассвета и длительность рассвета, а так же время начала зкакта и его длительность. Возможно ли переправить логику таким образом, чтоб можно было задавать две точко начала рассвета и две точки начала заката с их оканчаниями и длительностями внутрии одних суток. Т.Е. всего четыре точки, Например:
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); //Пишем в Красный порт вычисленное значение
}
На всякий слуяай исходник скетча:
#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); //Пишем в порт вычисленное значение }Добавлял переменные:
менял логику обработка интервала до восхода и после заката на:
if ((Day_time<sunrise_start) || (Day_time>=sunset_stop+sunset_duration) && (Day_time<sunrise_stop+sunrise_duration) || (Day_time>=sunset_start)) { pwm = PWM_MIN;В результате диод вообще не горит!