Сделать так, чтобы два светодиода появлялись и гасли с разными значениями ШИМ.

У меня есть два УФ-светодиода: один Vf 3,3 В @ 150 мА, а второй Vf 5 В @ 150 мА. Мне нужна схема, которая заставит их попеременно появляться и исчезать, т.е., когда один становится тусклее, другой становится ярче, и наоборот. Я попробовал использовать ШИМ-транзистор Arduino с платой Attiny85 и приведенным ниже кодом, и он работает, но мне нужно, чтобы светодиод ledPin2 работал с более низкой maxbrightness. Как я могу изменить код, чтобы установить maxbrightness для ledPin2 примерно на 25, а maxbrightness для ledPin1 остается 255, но для появления и исчезновения обоих требуется одинаковое время?

int ledPin1 = 0;       
int ledPin2 = 4;         
int minbrightness = 0;     
int maxbrightness = 255;    
int fadeAmount = 1;   
int tim=4;
    
void setup()  { 
   pinMode(ledPin1, OUTPUT);
   pinMode(ledPin2, OUTPUT);
} 
    
void loop()  {
  analogWrite(ledPin1, minbrightness);
  analogWrite(ledPin2, maxbrightness);
  minbrightness = minbrightness + fadeAmount;
  maxbrightness = maxbrightness - fadeAmount;
  if (minbrightness == 0 || minbrightness == 255 ){
    fadeAmount = -fadeAmount ;
  }
  delay(tim);
}
    

, 👍1

Обсуждение

Почему бы не внести изменения в аппаратное обеспечение? Гораздо проще и не нужно менять какой-либо код. Если вы действительно этого не хотите, почему бы просто не попробовать ввести maxbrightness/10 в аналоговую запись для второго светодиода? Возможно, вам придется изменить переменную на число с плавающей запятой, чтобы сделать это примерно за такое же время (в противном случае вы действительно будете менять значение яркости второго примерно каждые 5 отсчетов)., @Nick S.

Мне нужно кодовое решение, чтобы его было проще использовать в других конфигурациях. Кроме того, если я просто разделю максимальную яркость на 10, я боюсь, что через несколько циклов светодиоды могут рассинхронизироваться., @Rodrigo


1 ответ


Лучший ответ:

0

Я не думаю, что у вас есть другой выбор, кроме как придумать что-то вроде счетчика и вместо одной переменной для яркости всех светодиодов вам придется поддерживать отдельную переменную яркости для каждого канала. который будет иметь свой собственный уникальный профиль затемнения. Затем вам придется эмпирически определить, сколько отсчетов вам потребуется, чтобы уменьшить/увеличить рабочий цикл ШИМ на каждом отдельном канале (поскольку воспринимаемая яркость не является линейной).

Что-то вроде этого? Яркость 32 и модуль 8 были выбраны с коэффициентом 256, поэтому они более или менее синхронизированы.

int ledPin1 = 0;       
int ledPin2 = 4;            
int brightnessLP1 = 0;  //начинаем с выключенного светодиода
int brightnessLP2 = 32; //начинаем с включенным светодиодом
int fadeAmount = 1;   
int tim=4;
    
void setup()  { 
   pinMode(ledPin1, OUTPUT);
   pinMode(ledPin2, OUTPUT);
} 
    
void loop()  {
  //значение счетчика соответствует приведенному ниже модулю
  for(int brightnessCounter = 1; brightnessCounter < 257; brightnessCounter++) { 
     
     analogWrite(ledPin1, brightnessLP1);
     analogWrite(ledPin2, brightnessLP2);
     brightnessLP1 = brightnessLP1 + fadeAmount; 
     if(brightnessCounter  % 8) {
       brightnessLP2 = brightnessLP2 - fadeAmount;
     }
     delay(tim);
  }
  fadeAmount = -fadeAmount;
}

Я уверен, что вы могли бы сделать его чище или связать значения яркости со счетчиком, но я оставлю это вам.

,

Спасибо. Я могу работать оттуда., @Rodrigo

Конечно, пожалуйста!, @Nick S.