Ви не увійшли.
Поскольку сайт 123d.circuits.io приказал долго жить, выкладываю код сюда. См. подпрограмму transform_brightness:
#define STEP 3 // шаг изменения яркости
#define STEP_DELAY 20 // задержка (мс) при изменении яркости
#define LED_QTY 6 // количество светодиодов, подключённых к выходам с PWM
#define CYCLES_PER_MODE 7 // сколько волн яркости проходит перед сменой режима свечения
#define CYCLE_MODE_QTY 3 // количество режимов свечения
#define MAX_BRIGHT 255 // максимальная яркость свечения
const byte led_pins[LED_QTY] = {3, 5, 6, 9, 10, 11}; // соответствие выводов с ШИМ номерам светодиодов
byte led_brightness[LED_QTY]; // яркость
int brightness_step[LED_QTY]; // шаг изменения яркости
byte cycle_mode = 0;
int cycle_counter = 0;
bool cycle_state = false;
void setup() {
for (int i = 0; i < LED_QTY; i++) {
pinMode(led_pins[i], OUTPUT); // переключить все PWM выводы на выход
brightness_step[i] = STEP;
led_brightness[i] = (i + 1) * MAX_BRIGHT / LED_QTY;
}
pinMode(13, OUTPUT); // встроенный светодиод
}
byte transform_brightness(byte b) {
long t = (long(b) + 1) * b >> 8; // попытка линеаризовать воспринимаемую яркость
if (cycle_mode == 1 && t == 0) t = 1;
return byte(t);
}
void apply_brightness() {
for (int i = 0; i < LED_QTY; i++) {
analogWrite(led_pins[i], transform_brightness(led_brightness[i]));
}
if (led_brightness[LED_QTY - 1] > MAX_BRIGHT / 2) {
if (!cycle_state) {
cycle_state = true;
on_cycle_change();
}
digitalWrite(13, HIGH); // вкл. встроенный LED
} else {
cycle_state = false;
digitalWrite(13, LOW); // выкл. встроенный LED
}
}
void got_max_brightness(int &brght, int &stp) {
switch (cycle_mode) {
case 0: brght = MAX_BRIGHT; stp = -stp; break;
case 1: brght = 0; stp = STEP; break;
case 2: brght = MAX_BRIGHT; stp = -STEP; break;
}
}
void got_min_brightness(int &brght, int &stp) {
switch (cycle_mode) {
case 0: brght = 0; stp = -stp; break;
case 1: brght = 0; stp = STEP; break;
case 2: brght = MAX_BRIGHT; stp = -STEP; break;
}
}
void calculate_brightness() {
int new_brightness;
for (int i = 0; i < LED_QTY; i++) {
new_brightness = led_brightness[i] + brightness_step[i];
if (new_brightness > MAX_BRIGHT) {
got_max_brightness(new_brightness, brightness_step[i]);
} else if (new_brightness < 0) {
got_min_brightness(new_brightness, brightness_step[i]);
}
led_brightness[i] = (byte) new_brightness;
}
}
void on_cycle_change() {
if (cycle_counter++ > CYCLES_PER_MODE) {
cycle_counter = 0;
cycle_mode++;
if (cycle_mode >= CYCLE_MODE_QTY) {
cycle_mode = 0;
}
}
}
void loop() {
apply_brightness();
calculate_brightness();
delay(STEP_DELAY);
}
https://m.youtube.com/watch?v=M9hls9FVa3U
PS: Не подключайте много светодиодов напрямую к Arduino и не пытайтесь одновременно их включить, иначе можете сжечь микроконтроллер.
К сожалению яркость светодиода не пропорциональна заполнению ШИМ поданного на него.
... точнее кривая восприятия глаза далека от линейной. renoshnik верно сказал.
Большое вам спасибо очень помогли
Нужно сделать логарифмическую таблицу (массив 255 значений) и по ней рулить СД
К сожалению яркость светодиода не пропорциональна заполнению ШИМ поданного на него.
Подавайте на него значения от 0 до около 10 (вместо 255). При этом значении светодиод горит почти на полную. Попробуйте разные значения 10, 20, 50....
Спасибі диод нечел гореть но нет плавного виключення и включення
currentTime не меняется.
При первом проходе цикла условие оказывается ложным, а дальше ничего не меняется, цикл повторяется заново и заново и не выполняется тело.
Замените if(currentTime >= (loopTime +20)){
на if(milllis() >= (loopTime +20)){
Не работает схема
int brightness = 0;
int fadeAmount = 5;
unsigned long currentTime;
unsigned long loopTime ;
void setup(){
pinMode(10, OUTPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop(){
if(currentTime >= (loopTime +20)){
analogWrite(10, brightness);
brightness = brightness + fadeAmount;
if(brightness == 0 || brightness == 255){
fadeAmount = -fadeAmount;
}
loopTime = currentTime;
}
}