Новая проблемка со светодиодом

vvadim
Offline
Зарегистрирован: 23.05.2012








/*
 Fading
*/
int ledPin = 9; 
void setup()  {  
} 
void loop()  {  
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {    
  analogWrite(ledPin, fadeValue);    
  delay(30);                            
  } 
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {     
  analogWrite(ledPin, fadeValue);       
  delay(30);                            
  } 
}

Есть стандартный пример изменения яркости светодиода Fading. Хочется регулировать с помощью пот-ра величину максимальной яркости светодиода.



/*
 Fading
*/
int ledPin = 9; 
int potPin = 0;
int pot;
void setup()  { 
pinMode(potPin, INPUT);
pinMode(ledPin, OUTPUT); 
} 
void loop()  {
pot = analogRead(potPin); 
int maxValue;
maxValue = pot;
  for(int fadeValue = 0 ; fadeValue <= maxValue; fadeValue +=5) {    
  analogWrite(ledPin, fadeValue);    
  delay(30);                            
  } 
  for(int fadeValue = maxValue ; fadeValue >= 0; fadeValue -=5) {     
  analogWrite(ledPin, fadeValue);       
  delay(30);                            
  } 
}

Код работает при неподвижном пот-ре. Но если начинаю крутить пот-сразу глюк. Как решить проблму?

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

Может причина в самом переменном резисторе, а не в коде?  Попробуйте подключить резистор к щупам мультиметра и понаблюдайте, как изменяется его сопротивление.

maksim
Offline
Зарегистрирован: 12.02.2012

Проблема именно в коде.
Первое на что стоит обрать внимание, так это то что АЦП 10-ти битный, а ШИМ 8-ми и когда вы присваиваете maxValue = pot; то maxValue может принимать значения от 0 до 1023, а можно только от 0 до 255.
Второе. Значение максимума будет актуальным только по прохождении полного цикла, то есть изменили максимум, а он изменится только после того как светодиод полностью разгорится, полностью погаснет и опять разгорится.
Поэтому делать нужно хотябы так, замените стороки с 12 по 14 на эту
 

int maxValue = map(analogRead(potPin), 0, 1023, 0, 255);

 

maksim
Offline
Зарегистрирован: 12.02.2012

А для оперативного изменения максимума нужно делать примерно так:

#define ledPin 9
#define potPin 0
#define maxValue map(analogRead(potPin), 0, 1023, 0, 255)

void setup()  
{ 
  pinMode(ledPin, OUTPUT); 
} 

void loop()  
{
  for(int fadeValue = 0; fadeValue <= maxValue; fadeValue +=5) 
  {  
    if(fadeValue > maxValue) fadeValue = maxValue;
    analogWrite(ledPin, fadeValue); 
    delay(30);    
  } 
  for(int fadeValue = maxValue; fadeValue >= 0; fadeValue -=5) 
  { 
    if(fadeValue > maxValue) fadeValue = maxValue;    
    analogWrite(ledPin, fadeValue);
    delay(30);    
  } 
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Спасибо.  Работает. Немного изменил код. Убрал участок угасания.  Светодиод доходит до указанного максимума и выключается и цикл повторяется . Как выйти из цикла при достижении максимума с возможностью опять поменять яркость в любой момент.

/*
 Fading
*/
  int ledPin = 9; 
  int potPin = 0;  
void setup()  { 
  pinMode(potPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
} 
void loop()  {
  int maxValue = map(analogRead(potPin), 0, 1023, 0, 255);
  Serial.print(maxValue);
  for(int fadeValue = 0 ; fadeValue <= maxValue; fadeValue +=5) {    
  analogWrite(ledPin, fadeValue);    
  delay(30); 
  Serial.print("\t");
  Serial.println(fadeValue);  
  }   
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

vvadim пишет:
Как выйти из цикла при достижении максимума с возможностью опять поменять яркость в любой момент.
В сообщении #3 есть ответ на этот вопрос.

vvadim
Offline
Зарегистрирован: 23.05.2012
#define ledPin 9
#define potPin 0
#define maxValue map(analogRead(potPin), 0, 1023, 0, 255)

void setup()  
{ 
  pinMode(ledPin, OUTPUT); 
} 

void loop()  
{
  for(int fadeValue = 0; fadeValue <= maxValue; fadeValue +=5) 
  {  
    if(fadeValue > maxValue) fadeValue = maxValue;
    analogWrite(ledPin, fadeValue); 
    delay(30);    
  } 
  
}

Яркость достигает максимума и светодиод гаснет и цикл повторяется.

vvadim
Offline
Зарегистрирован: 23.05.2012

Нашёл библиотеку SoftPWM. На её основе сделал код. Теперь с помощью пот-ра изменяю максимальную яркость, а другим регулирую время зажигания и затухания.  Может кому  и пригодится.






#include <SoftPWM.h>

#define ledPin 9
#define ValuePin 0
#define maxValue map(analogRead(ValuePin), 0, 1023, 0, 255)
#define fadePin 2
int fadeValue;

void setup()
{
  Serial.begin(9600);  
  SoftPWMBegin(); 
  SoftPWMSet(ledPin, 0);
}

void loop() 
{
  fadeValue = analogRead(fadePin)*3;  
  SoftPWMSetFadeTime(ledPin, fadeValue, fadeValue);
  SoftPWMSet(ledPin, maxValue);  
  delay(250);
  
  Serial.print(maxValue);
  Serial.print("\t");
  Serial.println(fadeValue); 
}

Спасибо maksim.