похоже никак ...
похоже никак ...
Понял тут с неделю назад, что ламповая подсветка в мониторе начала сдыхать и решил поставить светодиодную, естественно, с авторегулировкой яркости.
Купил на митинском рынке пару светодиодных полосок шириной около 3 мм, длина - 30 см, на каждой располагается 48 светодиодов, цена 300р. Есть и с 24 светодиодами, 150р за штуку.
Разобрал матрицу.
Внутри - П-образная лампа. Разбирается аккуратно легко, граблей нет. Но все же надо аккуратно.
Заменил лампу на два куска ленты. Одна - целиковая, ее хватило на длинную и короткую стороны, от другой отрезал кусок и поставил на оставшуюся длинную, собрал обратно. Никакой гребенки от светодиодов нет. При полной яркости светодиодам явно внутри жарко, внешняя поверхность разогревается градусов до 60, а у нее тепловой контакт со светодиодами ужасный.
Собрал все примерно как в первом сообщении, единственное - не на ардуине, а на меге48 (валялась), но суть абсолютно та же.
Я несколько изменил способ изменения яркости, сделав изменение яркости плавным и попытался убрать лишние колебания яркости подсветки.
В начале определяются значения с датчика и соответствующие значения яркостей. Единственное, у меня использовался АЦП в 8-битном режиме, поэтому все значения меньше 256.
затем инициализацияКод:#define BrCount 6 // количество элементов в обоих массивах чуть ниже uint8_t BrIn[BrCount]={43,60,100,140,213,240}; // значения с датчика, должны возрастать! uint8_t BrOut[BrCount]={154,77,41,20,10,5}; // соответствующие значения для ШИМ. У меня в схеме значение датчика 240 соответствует яркости 5. volatile uint16_t CurrentBrightness=0; // текущая яркость*256. volatile uint8_t DestBrightness; // яркость, с которой надо светить (обычная, не умноженная на 255) uint8_t BrIndex; - текущий индекс режима яркости - индекс из массивов BrIn и BrOut
Теперь то, что повторяетсяКод:BrIndex=0; // текущий режим- 0 DestBrightness=600; //стартуем с яркостью 60. Можно выставить минимальную. CurrentBrightness=DestBrightness*256;
Код:uint16_t br=0; for (uint8_t i=0;i<32;i++) // в цикле считаем среднее значение с датчика за некоторое время (около секунды). Складываем 32 значения. { br+=analogRead(0); // а еще - плавно меняем яркость. //А вот здесь делаем интересное. DestBrightness - та яркость, с которой нам надо светить. Но мы на текущий момент светим с яркостью CurrentBrightness. Нам надо плавно поменять яркость. //для этого мы меняем CurrentBrightness на CurrentBrightness/32 за шаг. // такое изменение сделано потому, что человеческие чувства экспоненциальны. Для нас яркость в 30 и 60 кандел отличаются также как и 60 и 120 кд. //всякие +1 в формулах для того, чтобы при целочисленном делении 20/32 получить не 0, а 1 и все же изменить яркость. uint16_t destb=DestBrightness*256; TimerCounter2=0; if (destb>cbr) // надо увеличить яркость? { uint16_t db=cbr/32+1; if ((cbr+db)<cbr) //переполнение? cbr=0xFFFF; else cbr=cbr+db; if (destb<cbr) cbr=destb; CurrentBrightness=cbr; } else if (destb<cbr) // надо уменьшить? { uint16_t db=cbr/32+1; if (cbr>0) cbr=cbr-db; if (destb>cbr) cbr=destb; CurrentBrightness=cbr; } AnalogWrite(Pin,CurrentBrightness/256);// тут, собственно, задаем яркость _delay_ms(1000/32); // повторяем 32 раза, значит цикл будет выполняться примерно 1 секунду. } uint8_t cbr=br/4/32; // .. делим сумму на 32 (цикл складывает 32 значения) и на 4 - у меня в массиве BrIn значения датчика до 255, а не 1023. // далее в цикле изменяем BrIndex (индекс текущего режима яркости). Принцип такой - меняем текущий режим только если показания с датчика отклонились от текущего режима настолько, что дошли как минимум до соседнего режима. // пример - значения в массиве датчика 10,20,40,80. Значения яркостей - 110,120,140,180. Текущий иднекс 2 (датчик выдавал ранее около 40). // яркость подсветки - 140. Пока датчик не выдаст 20 (или менее) или 80 (или более), яркость подсветки не изменится и режим останется вторым. // Если датчик выдаст <=20, то режим сменится на 1-й (яркость - 120), если выдаст >=80, то режим сменится на 3-й. //ну а цикл нужен на случай, если значения с датчика резко поменялась более чем на 1 режим. К примеру - был режим 2 (датчик около 40), а вдруг стало 5. Тогда на первом проходе режим сменится на 1, а потом на 0. for (uint8_t i=0;i<5;i++) { if ( (BrIndex>0) && (BrIn[BrIndex-1]>cbr) ) BrIndex--; if ( (BrIndex<BrCount-1) && (BrIn[BrIndex+1]<cbr) ) BrIndex++; DestBrightness=BrOut[BrIndex]; }
Самое главное ты упустил, какова разница изображения?
Проехался сегодня по солнцу, стало на порядок лучше, чем было до замены ламп. Надо будет чуток подкорректировать значения, иногда слишком тускло светит. К примеру, не учел, что даже в полной темноте рядом с монитором светит климат и панель приборов и не надо опускать яркость до 5/255.
ps. у меня нетонированная машина, раньше при ярком солнечном свете изображение практически не было видно.
Подскажите в чём может быть проблема, подключил сегодня себе авто регулировку подсветки, теперь такая проблема, при нажатии кнопок на руле пригасает подсветка, например нажимаю громкость вверх, гаснет на 50%, жму кнопку mute гаснет на 90%.
К ардуино подцеплено управление компьютером (hotkey) паралельно управляется магнитола Pioneer 88rs, ну и соответственно авторегулировка яркости...
А так, всё работает.
Вот мой скетч:
Может в нём что-то подправить можно ?PHP код:
int analogPin = 7; // potentiometer wiper (middle terminal) connected to analog pin 3
int val = 0; // variable to store the value read
int mute = 2; //MUTE Выход для нажатии кнопки
int volu = 3; //Volume UP Выход для нажатии кнопки
int vold = 4; //Volume DOWN Выход для нажатии кнопки
int pt = 5; //Предыдущий трек
int nt = 6; //След трек
int ledPin = 9;
int sens = 0;
int light = 0;
#define PIN 7 //номер аналогового порта
#define LIMIT 20 //предел погрешности сопротивления
byte bytes[2];
int res_dt1, res_d;
unsigned long math_time,old_time,real_time;
void setup()
{
Serial.begin(115200); // настроить скорость com порта
}
void loop()
{
res_d = analogRead(PIN); // прочитать данные АЦП
delay(30);
res_dt1 = analogRead(PIN); // прочитать данные АЦП
old_time = millis();
math_time = 0;
while(math_time < 300 && (res_dt1 > res_d-LIMIT && res_dt1 < res_d+LIMIT ))
{
real_time = millis(); //получить реальное время
math_time = real_time - old_time; //считаем длительность нажатия
res_dt1 = analogRead(PIN); // прочитать данные АЦП
}
if( math_time > 50) //если нет дребезга то короткое нажатие
{
bytes[0] = res_d & 255; // преобразовать в 2-байта
bytes[1] = (res_d & 768) >> 8;
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
}
val = analogRead(analogPin); // PIONEER read the input pin
{
if (val > 600)
pinMode(mute, INPUT);
pinMode(volu, INPUT);
pinMode(vold, INPUT);
pinMode(nt, INPUT);
pinMode(pt, INPUT);
}
if (val > 0 and val < 40)
{
pinMode(mute, OUTPUT);
}
if (val > 60 and val < 120)
{
pinMode(volu, OUTPUT);
}
if (val > 140 and val < 200)
{
pinMode(vold, OUTPUT);
}
if (val > 300 and val < 420)
{
pinMode(nt, OUTPUT);
}
if (val > 500 and val < 590)
{
pinMode(pt, OUTPUT);
}
{
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
}
{
sens = analogRead(0);
if ((sens > 0) && (sens<3)) {light = 1;}
if ((sens > 5) && (sens<10)) {light = 5;}
if ((sens > 10) && (sens<15)) {light = 10;}
if ((sens > 15) && (sens<18)) {light = 20;}
if ((sens > 20) && (sens<25)) {light = 30;}
if ((sens > 25) && (sens<30)) {light = 40;}
if ((sens > 30) && (sens<35)) {light = 50;}
if ((sens > 35) && (sens<38)) {light = 60;}
if ((sens > 40) && (sens<45)) {light = 70;}
if ((sens > 45) && (sens<50)) {light = 80;}
if ((sens > 50) && (sens<55)) {light = 90;}
if ((sens > 55) && (sens<60)) {light = 150;}
if ((sens > 65) && (sens<70)) {light = 210;}
if ((sens > 70) && (sens<80)) {light = 230;}.
if (sens > 80) {light = 255;}
analogWrite(ledPin, light);
//Serial.print(sens, DEC);
//Serial.print(" ");
//delay(300);
}
}
Или как то всё преподключить на самой ардуино ?
По всякому пробовал, у меня ничего не получилось. И еще почему то подсветка резкими ступенями регулируется, оч отвлекает, а те скетчи что преведены выше, не понял подойдут мне или нет.
Последний раз редактировалось Chip; 05.06.2012 в 02:00.
У тебя фигурные скобки стоят где попало, разберись с ними сначала
Например:
Или вот здесьPHP код:
val = analogRead(analogPin); // PIONEER read the input pin
{
if (val > 600)
pinMode(mute, INPUT);
pinMode(volu, INPUT);
pinMode(vold, INPUT);
pinMode(nt, INPUT);
pinMode(pt, INPUT);
}
PHP код:
{
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
}
{
sens = analogRead(0);
Последний раз редактировалось Chip; 05.06.2012 в 02:07.
Если честно, то вообще не особо понимаю что и зачем я пишу в ардуино, добавлял скетч с авторегулировкой часа 2 наверно... Так как постоянно ругается, то на скобки, то на слова, вообще не понимаю как её программировать.
Кстати сейчас вспомнил что яркость менялась при нажатии кнопок на руле, даже со скетчем из первого поста, соответственно могу предположить что не в нём дело.
Кто бы подправил мой скетч и убрал лишнее был бы оч благодарен.
Вот как у меня всё подключено. Может тут какая то ошибка ?
Хотябы подскажите как сделать чтоб значения датчика или кнопок поменялись, у меня сейчас 0-600 вроде, и они пересекаются с кнопками, как сделать чтоб у кнопок начиналось 600-1200 или у датчика 600-1200 ? какой резистор поменять или что сделать... Моргающая подсветка от кнопок сильно напрягает..
В общем моя проблема так и не решилась...
При нажатии кнопок на руле, притухает подсветка, причём определённым кнопкам соответствует определённая яркость. При заливке скетча из шапки (без доработок, как есть) картина та-же.. Пробовал кнопки перевешивать на другие порты, менять резисторы, менять фоторезистор, ничего не помогает. Может у меня что-то не так подключено ? Хелп!
И еще одна проблемма, когда экран на минимальной яркости, при включении камеры заднего вида, через несколько секунд выключается подсветка помогает только попадание света на фоторезистор (но это второстепенная проблема).
А ты что хотел от этого кода? В коде компьютеру посылается всего два байта и эти два байта данные о нажатии кнопок руля.
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)