omega
Well-Known Member
Hi,
hier mal der PWM-Level live errechnet und der Tagsesablauf einfachst mit Delays nach Sabri.
setup() und loop() fehlen.
Daraus kann man auch eine C++-Klasse machen mit den ersten drei Konstanten als Parameter für den Konstruktor, damit das schön weggekapselt ist und die Details den Rest nicht stören.
Die Parameter zum Bestimmen des PWM-Levels werden absolut ermittelt und nicht über eine inkrementierte Variable: der Rundungsfehler wegen.
Hoch- und Runterdimmen brauchen jeweils eine eigene Funktion. Die beiden kann man sich dort ansehen: http://rechneronline.de/funktionsgraphen/ (der kann kein C).
Hoch: 1.0384 * (( 3.0^ (x * 3.0 - 3.0)) - 0.037)
Runter: 1.0384 * (3.0^ ((1.0 - x) * 3.0 - 3.0) - 0.037)
Grüße, Markus
hier mal der PWM-Level live errechnet und der Tagsesablauf einfachst mit Delays nach Sabri.
setup() und loop() fehlen.
Daraus kann man auch eine C++-Klasse machen mit den ersten drei Konstanten als Parameter für den Konstruktor, damit das schön weggekapselt ist und die Details den Rest nicht stören.
Die Parameter zum Bestimmen des PWM-Levels werden absolut ermittelt und nicht über eine inkrementierte Variable: der Rundungsfehler wegen.
Hoch- und Runterdimmen brauchen jeweils eine eigene Funktion. Die beiden kann man sich dort ansehen: http://rechneronline.de/funktionsgraphen/ (der kann kein C).
Hoch: 1.0384 * (( 3.0^ (x * 3.0 - 3.0)) - 0.037)
Runter: 1.0384 * (3.0^ ((1.0 - x) * 3.0 - 3.0) - 0.037)
Grüße, Markus
Code:
#include <math.h>
#define dimDuration 60.0 // in minutes
#define dimIterations 4000 // in count
#define maxPWMLevel 255
#define PWMPin 10
uint8_t getPWMLevelUp( float time);
uint8_t getPWMLevelDown( float time);
float expFunc( float x);
float invExpFunc( float x);
void sampleDayDimmerForSabri()
{
uint8_t pwmLevel;
// fade in
for( uint16_t i = 0; i < dimIterations; i++)
{
pwmLevel = getPWMLevelUp( dimDuration * i / dimIterations);
analogWrite( PWMPin, maxPWMLevel - pwmLevel);
delay( dimDuration * 60 * 1000 / dimIterations);
}
// 8 hours full throttle
delay( 28800000);
// fade out
for( uint16_t i = 0; i < dimIterations; i++)
{
pwmLevel = getPWMLevelDown( dimDuration * i / dimIterations);
analogWrite( PWMPin, maxPWMLevel - pwmLevel);
delay( dimDuration * 60 * 1000 / dimIterations);
}
delay( 3600000); // don't restart immediately but switch me off
}
// time must be 0.0 when fading starts and must be
// dimDurataion when fading stops
uint8_t getPWMLevelUp( float time)
{
float expVal = expFunc( time / dimDuration);
return expVal * maxPWMLevel;
}
// time must be 0.0 when fading starts and must be
// dimDurataion when fading stops
uint8_t getPWMLevelDown( float time)
{
float expVal = invExpFunc( time / dimDuration);
return expVal * maxPWMLevel;
}
// x must be scaled between 0.0 and 1.0
// returns a value between 0.0 and 1.0 for 0.0 <= x <= 1.0 using
// an exponential function
float expFunc( float x)
{
return 1.0384 * (pow( 3.0, x * 3.0 - 3.0) - 0.037);
}
// x must be scaled between 0.0 and 1.0
// returns a value between 1.0 and 0.0 for 0.0 <= x <= 1.0 using
// an exponential function
float invExpFunc( float x)
{
return 1.0384 * (pow( 3.0, (1.0 - x) * 3.0 - 3.0) - 0.037);
}