void setLight(int Value){ boolean SetRelay=false; int Min,Max,ac=0,dlt=0,dla=0; Tlc.clear(); for( int i=0;i < 16; i++){ if(light_channels[i].Active==1){ ac++; int c_PWM = PWM_Licht(RTC.daystamp, light_channels[i].Sunrise, light_channels[i].Sunset, light_channels[i].Dim_in, light_channels[i].Dim_out, light_channels[i].Min, light_channels[i].Max, light_channels[i].Invert,4095); Serial.println(i); Serial.println(c_PWM); if(c_PWM<0){ c_PWM=0; }else if(c_PWM>4095){ c_PWM=4095; } // Speicher dir den Wert für manuelles anpassen halbewchs genau zwischen, auch in %... if(light_channels[i].Invert==1){ dlt=int(dlt+int((4095-c_PWM)/4095*100)); // 80%=>819 also 4095-c_PWM sind "echte" 80%. also das / 4095*100 }else{ dlt=int(dlt+int(c_PWM/4095*100)); } Serial.println(dlt); // Stell sicher das Relay an ist if(c_PWM!=0){ SetRelay=true; } Tlc.set(i, c_PWM); } } Tlc.update(); } int PWM_Licht(float time, float Start, float Ende, int Dim_in, int Dim_out, int oMin, int oMax, boolean Invert,int s){ int pwm,Max,Min; if(Ende < Start && time > Start){ // Ende ist im nächsten Tag Ende += 86400; //einen Tag in Sekunden dazurechnen } if (Ende < Start && time < Ende){ //Zeit ist morgens am nächsten Tag vor Ende der Beleuchtung time += 86400; Ende += 86400; } if(Invert==false){ Min=int(s/100*oMin); // 0 = 0%... Max=int(s/100*oMax); // 80% von 4095 sind 3276 pwm=0; }else{ Min=int(s-(s/100*oMin)); // 0%=4095-(4095/100*0) = Max=int(s-(s/100*oMax)); // 80% von 4095-(4095/100*80) sind 819 pwm=s; } // Starten der Dimmung von Min if (time >= Start && time <= Start+float(Dim_in*60)){ Serial.println ("Raufdimmen"); float s = time-Start+0.5; // vergangene Sekunden ~1616Sek ~ 27min int m = Max-Min; //3000-200=2800 float f= float(Dim_in*60)/float(m); // 1800/2800=0,64 float p = s/f; // 1616 / 0,64=2525 pwm=Min+int(p); return pwm; } // Voll an keine Dimmung if (time > Start+float(Dim_in*60) && time < Ende-float(Dim_out*60)){ return Max; } // Ende der Dimmung if (time >= Ende-float(Dim_out*60) && time <= Ende){ Serial.println ("Runterdimmen"); float s = time+float(Dim_out*60)-Ende+0.5; // vergangene Sekunden ~1616 int m = Max-Min; // 135 float f= float(Dim_out*60)/float(m); // 3000/135 ~22 float p = s/f; // 1616 / 22 pwm = Max-int(p); return pwm; } // Der Rest return pwm; } int MondPhase(int Year,int Month,int Day){ double M; int XYear,Century; int a; if(Month<=2){ Year--; Month+=12; } Month-=3; XYear=Year % 100; a = Year / 100; Century=(a*146097) >> 2; XYear=(XYear*1461) >> 2; M=(floor(((((Month*153)+2)/ 5)+Day)+1721119+XYear+Century)+4.867)/29.53058; return int(abs(2*(M-floor(M))-1) * 100); }