Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Йожэг
2018-09-16 21:59:22

Поскольку сайт 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);
}

j8m8krL.jpg

Йожэг
2018-09-16 21:10:46

https://m.youtube.com/watch?v=M9hls9FVa3U

PS: Не подключайте много светодиодов напрямую к Arduino и не пытайтесь одновременно их включить, иначе можете сжечь микроконтроллер.

theoristos
2018-08-26 15:01:07
LynX пише:

К сожалению яркость светодиода не пропорциональна заполнению ШИМ поданного на него.

... точнее кривая восприятия глаза далека от линейной. renoshnik верно сказал.

Влад4325
2018-07-10 16:37:38

Большое вам спасибо очень помогли

renoshnik
2018-07-10 16:30:43

Нужно сделать логарифмическую таблицу (массив 255 значений)  и по ней рулить СД

LynX
2018-07-10 15:35:22

К сожалению яркость светодиода не пропорциональна заполнению ШИМ поданного на него.
Подавайте на него значения от 0 до около 10 (вместо 255). При этом значении светодиод горит почти на полную. Попробуйте разные значения 10, 20, 50....

Влад4325
2018-07-10 14:50:49

Спасибі диод нечел гореть но нет плавного виключення и включення

LynX
2018-07-09 17:12:47

currentTime не меняется.
При первом проходе цикла условие оказывается ложным, а дальше ничего не меняется, цикл повторяется заново и заново и не выполняется тело.

Замените  if(currentTime >= (loopTime +20)){
на  if(milllis() >= (loopTime +20)){

Влад4325
2018-07-09 15:26:50

IMG_20180709_150634.jpegНе работает схема
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;
    }
}

Підвал форуму