Новая проблемка со светодиодом
- Войдите на сайт для отправки комментариев
Сб, 08/12/2012 - 23:05
/*
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);
}
}
Код работает при неподвижном пот-ре. Но если начинаю крутить пот-сразу глюк. Как решить проблму?
Может причина в самом переменном резисторе, а не в коде? Попробуйте подключить резистор к щупам мультиметра и понаблюдайте, как изменяется его сопротивление.
Проблема именно в коде.
Первое на что стоит обрать внимание, так это то что АЦП 10-ти битный, а ШИМ 8-ми и когда вы присваиваете maxValue = pot; то maxValue может принимать значения от 0 до 1023, а можно только от 0 до 255.
Второе. Значение максимума будет актуальным только по прохождении полного цикла, то есть изменили максимум, а он изменится только после того как светодиод полностью разгорится, полностью погаснет и опять разгорится.
Поэтому делать нужно хотябы так, замените стороки с 12 по 14 на эту
А для оперативного изменения максимума нужно делать примерно так:
#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); } }Спасибо. Работает. Немного изменил код. Убрал участок угасания. Светодиод доходит до указанного максимума и выключается и цикл повторяется . Как выйти из цикла при достижении максимума с возможностью опять поменять яркость в любой момент.
/* 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); } }#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); } }Яркость достигает максимума и светодиод гаснет и цикл повторяется.
Нашёл библиотеку 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.