void RA_PWMClass::ChannelPWMParabola(byte Channel, byte Start, byte End, byte MinuteOffset) { int onTime=NumMins(InternalMemory.StdLightsOnHour_read(),InternalMemory.StdLightsOnMinute_read())-MinuteOffset; int offTime=NumMins(InternalMemory.StdLightsOffHour_read(),InternalMemory.StdLightsOffMinute_read())+MinuteOffset; SetChannel(Channel,PWMParabola( onTime/60, onTime%60, offTime/60, offTime%60, Start, End, ExpansionChannel[Channel] )); }
void RA_PWMClass::StandardDaylight(byte MinuteOffset) { int onTime=NumMins(InternalMemory.StdLightsOnHour_read(),InternalMemory.StdLightsOnMinute_read())-MinuteOffset; int offTime=NumMins(InternalMemory.StdLightsOffHour_read(),InternalMemory.StdLightsOffMinute_read())+MinuteOffset; SetDaylight(PWMParabola( onTime/60, onTime%60, offTime/60, offTime%60, 0, InternalMemory.LEDPWMDaylight_read(), 0 )); }
void RA_PWMClass::DaylightPWMParabola(byte MinuteOffset) { int onTime=NumMins(InternalMemory.StdLightsOnHour_read(),InternalMemory.StdLightsOnMinute_read())-MinuteOffset; int offTime=NumMins(InternalMemory.StdLightsOffHour_read(),InternalMemory.StdLightsOffMinute_read())+MinuteOffset; SetDaylight(PWMParabola( onTime/60, onTime%60, offTime/60, offTime%60, InternalMemory.PWMSlopeStartD_read(), InternalMemory.PWMSlopeEndD_read(), DaylightPWMValue )); }
void RA_PWMClass::ActinicPWMSlope(byte MinuteOffset) { int onTime=NumMins(InternalMemory.StdLightsOnHour_read(),InternalMemory.StdLightsOnMinute_read())-MinuteOffset; int offTime=NumMins(InternalMemory.StdLightsOffHour_read(),InternalMemory.StdLightsOffMinute_read())+MinuteOffset; SetActinic(PWMSlope( onTime/60, onTime%60, offTime/60, offTime%60, InternalMemory.PWMSlopeStartA_read(), InternalMemory.PWMSlopeEndA_read(), InternalMemory.PWMSlopeDurationA_read(), ActinicPWMValue )); }
byte PWMParabola(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte oldValue) { int Now = NumMins(hour(), minute()); int Start = NumMins(startHour, startMinute); int End = NumMins(endHour, endMinute); byte PWMDelta = endPWM-startPWM; byte ParabolaPhase=constrain(map(Now,Start,End,0,180),0,180); if ( Now <= Start || Now >= End) return oldValue; else { return startPWM+(PWMDelta*sin(radians(ParabolaPhase))); } }
byte PWMSlope(byte startHour, byte startMinute, byte endHour, byte endMinute, byte startPWM, byte endPWM, byte Duration, byte oldValue) { int Now = NumMins(hour(), minute()); int Start = NumMins(startHour, startMinute); int StartD = Start + Duration; int End = NumMins(endHour, endMinute); int StopD = End - Duration; if ( Now >= Start && Now <= StartD ) return constrain(map(Now, Start, StartD, startPWM, endPWM),startPWM, endPWM); else if ( Now >= StopD && Now <= End ) { byte v = constrain(map(Now, StopD, End, startPWM, endPWM),startPWM, endPWM); return endPWM-v+startPWM; } else if ( Now > StartD && Now < StopD ) return endPWM; // lastly return the existing value return oldValue; }