помогите новичку ШИМ -led

tiger63rus
Offline
Зарегистрирован: 19.11.2021

Добрый день.... позволю себе наглость поднять тему.

Мои познания и результаты поисков вылились вот в такое:


#define CORRECT_CLOCK 1
void fixDelay(uint32_t ms) {
  delay(ms << CORRECT_CLOCK);
}
#include <EEPROM.h> // подключаем библиотеку EEPROM


int led_uf; //servo_val_1;
int led_wt; //servo_val_2;
int led_rb;
int led_rd;
int led_or;
int led_bl;

int PWM_led_ufPin = 6;    //PWM_ledPin = 5; // светодиод, или для управления RGB подсветкой.
int PWM_led_wtPin = 5;
int PWM_led_rbPin = 3;
int PWM_led_rdPin = 9;
int PWM_led_orPin = 10;
int PWM_led_blPin = 11;

int led_PWM_uf_val; // для хранения значений яркости светодиода.
int led_PWM_wt_val;
int led_PWM_rb_val;
int led_PWM_rd_val;
int led_PWM_or_val;
int led_PWM_bl_val;
int serial_val; // для хранения значений Serial.parseInt.

void setup() {

Serial.begin(9600);



// Пины D5 и D6 - 62.5 кГц
TCCR0B = 0b00000001;  // x1
TCCR0A = 0b00000011;  // fast pwm

// Пины D9 и D10 - 62.5 кГц
TCCR1A = 0b00000001;  // 8bit
TCCR1B = 0b00001001;  // x1 fast pwm

// Пины D3 и D11 - 62.5 кГц
TCCR2B = 0b00000001;  // x1
TCCR2A = 0b00000011;  // fast pwm

led_PWM_uf_val=EEPROM.read(1),analogWrite(PWM_led_ufPin,led_PWM_uf_val); 
led_PWM_wt_val=EEPROM.read(2),analogWrite(PWM_led_wtPin,led_PWM_wt_val); 
led_PWM_rb_val=EEPROM.read(3),analogWrite(PWM_led_rbPin,led_PWM_rb_val); 
led_PWM_rd_val=EEPROM.read(4),analogWrite(PWM_led_rdPin,led_PWM_rd_val); 
led_PWM_or_val=EEPROM.read(5),analogWrite(PWM_led_orPin,led_PWM_or_val); 
led_PWM_bl_val=EEPROM.read(6),analogWrite(PWM_led_blPin,led_PWM_bl_val); 

 pinMode(PWM_led_ufPin, OUTPUT);
 pinMode(PWM_led_wtPin, OUTPUT);
 pinMode(PWM_led_rbPin, OUTPUT);
 pinMode(PWM_led_rdPin, OUTPUT);
 pinMode(PWM_led_orPin, OUTPUT);
 pinMode(PWM_led_blPin, OUTPUT);

}

void loop()

{

if (Serial.available()>0)

{

serial_val = Serial.parseInt();

if (serial_val >-1 && serial_val <256)

{

led_PWM_uf_val = serial_val;
led_PWM_uf_val = map(led_PWM_uf_val, 0, 255, 0, 255); // конвертируем в диапазон значений,в диапазон уровень яркости
analogWrite(PWM_led_ufPin,led_PWM_uf_val);
Serial.println(led_PWM_uf_val);

}

if (serial_val >255 && serial_val <512)

{
led_PWM_wt_val = serial_val;
led_PWM_wt_val = map(led_PWM_wt_val, 256, 511, 0, 255);
analogWrite(PWM_led_wtPin,led_PWM_wt_val);
Serial.println(led_PWM_wt_val);

}

if (serial_val >511 && serial_val <768)

{

led_PWM_rb_val = serial_val;
led_PWM_rb_val = map(led_PWM_rb_val, 512, 767, 0, 255); 
analogWrite(PWM_led_rbPin,led_PWM_rb_val);
Serial.println(led_PWM_rb_val);

}
if (serial_val >767 && serial_val <1024)

{

led_PWM_rd_val = serial_val;
led_PWM_rd_val = map(led_PWM_rd_val, 768, 1023, 0, 255); 
analogWrite(PWM_led_rdPin,led_PWM_rd_val);
Serial.println(led_PWM_rd_val);

}

if (serial_val >1023 && serial_val <1280)

{

led_PWM_or_val = serial_val;
led_PWM_or_val = map(led_PWM_or_val, 1024, 1279, 0, 255); 
analogWrite(PWM_led_orPin,led_PWM_or_val);
Serial.println(led_PWM_or_val);

}

if (serial_val >1279 && serial_val <1536)

{

led_PWM_bl_val = serial_val;
led_PWM_bl_val = map(led_PWM_bl_val, 1280, 1535, 0, 255); 
analogWrite(PWM_led_blPin,led_PWM_bl_val);
Serial.println(led_PWM_bl_val);

}
}
}

Прошу помощи у профессионалов.... подозреваю, что где-то написано криво, где-то не по правилам... помогите причесать код.

И есть второй вопрос. Мне не удалось понять как организовать простой алгоритм работы по времени.

Необходимо чтобы в определенный час (всегда в один не зависимо от дня недели года и тд...) часть каналов плавно выключалась в течении заданного времени (скажем 60 мин) и чтоб в другой момент времени эти же каналы плавно за тот же промежуток времени включались до первоначального значения (скажем снижалась с 50% до 0% и увеличивалась с 0% до 50%. Я так думаю это будут значения led_PWM_***_val).