Nos, átvariáltam a kódot, és megnöveltem a PWM frekvenciákat.
Jelenleg nem látok vibrálást, de az esti "besötétedés" még hátra van.
------------------------
#include <swRTC.h>
swRTC rtc;
const byte WhiteValue[60] = {255, 255, 255, 255, 255, 250, 245, 240, 235, 230, 225, 220, 215, 210, 205, 200, 195, 190, 185, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 130, 125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0, 0, 0, 0, 0};
const byte RedValue[60] = {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 130, 125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0, 0, 0, 0, 0};
const byte BlueValue[60] = {190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 180, 175, 170, 165, 160, 155, 150, 145, 140, 135, 130, 125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50};
byte WhitePin = 9;
byte RedPin = 10;
byte BluePin = 6;
byte PWM;
int hr;
int mins;
void setup()
{
rtc.stopRTC(); //stop the RTC
rtc.setTime(17, 55, 0); //set the time here
rtc.setDate(4, 1, 2018); //set the date here
rtc.startRTC(); //start the RTC
setPwmFrequency(9, 8); // (31250/8 = 3906 Hz)
setPwmFrequency(10, 8); // (31250/8 = 3906 Hz)
setPwmFrequency(6, 8); // (62500/8 = 7812 Hz)
}
void loop()
{
hr = rtc.getHours();
mins = rtc.getMinutes();
//Set White
if (hr <= 6) PWM = 0;
if (hr == 7) PWM = WhiteValue[59 - mins];
if (hr >= 8 && hr <= 20) PWM = 255;
if (hr == 21) PWM = WhiteValue[mins];
if (hr >= 22) PWM = 0;
analogWrite(WhitePin, PWM);
//Set Red
if (hr <= 5) PWM = 0;
if (hr == 6) PWM = RedValue[59 - mins];
if (hr >= 7 && hr <= 21) PWM = 190;
if (hr == 22)PWM = RedValue[mins];
if (hr >= 23) PWM = 0;
analogWrite(RedPin, PWM);
//Set Blue
if (hr <= 5) PWM = 50;
if (hr == 6) PWM = BlueValue[59 - mins];
if (hr >= 7 && hr <= 21) PWM =190;
if (hr == 22)PWM = BlueValue[mins];
if (hr >= 23) PWM = 50;
analogWrite(BluePin, PWM);
}
void setPwmFrequency(int pin, int divisor)
{
byte mode;
if (pin == 5 || pin == 6 || pin == 9 || pin == 10)
{
switch (divisor)
{
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if (pin == 5 || pin == 6)
{
TCCR0B = TCCR0B & 0b11111000 | mode;
} else
{
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if (pin == 3 || pin == 11)
{
switch (divisor)
{
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x07; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}