А ты попробуй запустить так и проверишь его работоспособность.
Вид для печати
А ты попробуй запустить так и проверишь его работоспособность.
Рад бы, да фоторезистор с полевиком вторую неделю прислать не могут
Т кстати что это за место такое чудесное- Setup, в котором можно частоту ШИМа менять? А то у меня тоже Innolux 8"
Так проверить можно на светодиоде без полевика, вместо фоторезистора переменный резистор поставить
PHP код:
void setup()
{
pinMode(ledPin, OUTPUT);
TCCR1B = TCCR1B & 0b11111000 | 2;
Serial.begin(115200);
}
Точно, попробую так. Спасибо!
а обязательно включатся в разрыв минуса ?
Для N канального транзистора обязательно
А если p канальный использовать? И вот ещё вопрос вроде нашёл на своей матрице шлейф подсветки, но при разрыве + провода изображение на мониторе исчезает, а при обратном соединение проводов изображение не появляется, помогает только выкл-вкл монитор, такое впечатление что преобразователь подсветки уходит в защиту или это провода питания матрицы.
фото монитора и матрицы, даташит прилагаются. Кстати на 5 странице даташита нашёл что 3 пин вход шим для регулировки яркости. Может лучше к нему подключится ?Требования к шим сигналу (от 0в до 3.3в и от 100гц до 300гц).
Если использовать Р канальный то придется еще биполярник с резистором добавить
На твоей матрице шлейф подсветки справа , состоящий из двух проводов
вот именно там я + и разрывал.
Помогите я весь в раздумьях куда лучше подключить ? К 3 контакту или в разрыв - ?
Прошу прощения за, возможно, глупый вопрос.
В тексте программы есть оператор analogwrite (,). Так вот, собственно вопрос: модуль ардуино выдает действительно аналоговый сигнал (с ЦАПа, например), или, как я понял из текста, ШИМ сигнал?
И можно ли полевиком рулить не ШИМ а просто постоянкой, например с переменного резистора? Матрице не поплохеет?
analogwrite вадает на выход ШИМ
От пременника матрице плохо не станет , но полевик будет при этом греться
Все понял, спасибо! :)
Кстати, после настройки сего скетча настоятельно рекомендую закомментарить строчки Serial.print(sens, DEC);
Serial.print(" ");
Особенно если к нему дополнительно дописывать что-то что будет слать информацию в комп. Иначе будет нестись неисчерпаемый поток мусора.
Еще могу предложить мой вариант прочтения программ от Чипа, если он не возражает.
В данном скетче объединены резистивные кнопки, автоматическая регулировка LED подсветки и добавлена реакция на включение заднего хода.
Отличия от первоисточников:
1. реакция на резистивные кнопки по факту нажатия а не отпускания т.е. практически мгновенно
2. Для регулировки яркости подсветки используется усредненное значение двух замеров при отсутствии дребезга и яркость сдвигается по единичке
3. При включении заднего хода яркость выставляется на максимум
4. Используются условные переходы, поэтому одновременно несколько действий не происходит и поэтому нет поводов для глюков
PHP код:
//AutoLight & Softresbutton & reverslight
//http://compcar.ru
#define PIN 5 //номер аналогового порта
#define LIMIT 10 //предел погрешности сопротивления
#define DELTA 5 //предел погрешности освещения
byte bytes[2];
int res_dt1, res_d;
int back_on = 12; //вход сигнал включения задней скорости
int ledPin = 9; //номер светодиодного порта
int light = 0;
int reallight = 0;
int oldlight = 0;
int sensVal_dt1 = 0;
int sensVal_d = 0;
void setup()
{
pinMode(back_on, INPUT);
digitalWrite(back_on, HIGH); //Подключить внутренний подтягивающий резистор
pinMode(ledPin, OUTPUT);
TCCR1B = TCCR1B & 0b11111000 | 1;
Serial.begin(115200); // настроить скорость com порта
}
void loop()
{
res_d = analogRead(PIN); // прочитать данные АЦП
delay(50);
res_dt1 = analogRead(PIN); // прочитать данные АЦП
if (res_dt1 > res_d-LIMIT && res_dt1 < res_d+LIMIT && res_dt1 < 900) // если сигнал резистивных кнопок не дребезжит и что-то нажато
{
bytes[0] = res_d & 255; // преобразовать в 2-байта
bytes[1] = (res_d & 768) >> 8;
Serial.write( bytes,2); // отправить прочитаное значение компьютеру
delay(700);
}
else if (digitalRead(back_on) == HIGH) //если нет сигнала резистивных кнопок надо проверить включен ли задний ход
{
delay(200);
light = 255; // ежели включен з.х.- сделать яркость на максимум (иначе нифига ночью не видно)
goto label;
}
else
{
sensVal_d = analogRead(0); // если нет з.х.- прочитать данные фоторезистора
delay(100);
sensVal_dt1 = analogRead(0); // опять прочитать данные фоторезистора
if(sensVal_dt1 > sensVal_d-DELTA && sensVal_dt1 < sensVal_d+DELTA ) // если разница между замерами незначительна
{
reallight = (sensVal_d + sensVal_dt1)/50 + 7; // присваиваем значению которое программа хотела бы отправить на светодиоды сумму этих замеров.
// можно дополнительно умножить или приплюсовать любое поправочное значение которое подойдет для настройки адекватной яркости
if(reallight == oldlight) //сравниваем желаемое для программы значение яркости со старым и если они не совпадают, то изменяем по единичке
{
light = oldlight;
}
else if(reallight > oldlight) //
{
light = ++oldlight;
}
else
{
light = --oldlight;
}
}
else
{
light = oldlight;
}
}
oldlight = light;
label:
constrain(light, 8, 255);
analogWrite(ledPin, light);
}
Вот это, пожалуй, зря. Как раз в этой ситуации, ночью больше всего мешает его высокая яркость, когда приходится несколько раз переводить взгляд с задних стекол на дисплей. Я даже перестал на него смотреть, потому что глаза слепнут и некоторое время позади машины не удается ничего разглядеть...
Ну, каждому свое! Когда ночью яркость экрана на минимуме, да к тому-же изображение с камеры тоже очень темное, мне лично было ничего не видно. Теперь стало просто отлично. Кто-то писал про "нереально яркие" матрицы некоторых "Лилипутов". Возможно в таком случае данная опция окажется лишней, но у меня "Innolux" и мне надо яркость на полную.
в этом случае массы монитора и ардуины тож надо объединять?
Вопрос массы в автомобиле- это самая сложная из тем для обсуждения. Массы практически всех устройств так или иначе соединены с кузовом автомобиля, только эти цепочки масс бывают слишком длинными и сечение проводников слишком маленькое. Отсюда появляются разности потенциалов массы в различных точках электрооборудования, что может привести к некорректной его работе.
У меня, например, монитор запитан от блока питания компа, и ардуина через ЮСБшный шнурок соответственно тоже, поэтому массы объединены через системник. Вроде этого достаточно, но не факт что у всех будет так.
bc817 тут не пойдет?
Все зависит от тока нагрузки, какой ток твоя подсветка потребляет?
200ма в максимуме
Еще есть КТ972Б в наличии. Но он вроде не логический
Если установить значение ШИМ 128 это будет 2,5в , но при этом потребуется поставить RC цепочку для фильтрации частоты ШИМ. Чем выше частота ШИМ тем проще будет ее отфильтровать
Не, там фильтровать ее ни к чему вроде, там входящя тоже ШИМ, с частотой частота от 100 до 300 по даташиту. Ну и логическая единица 3.3V. Проблема я так понимаю в том что у нас на аудуине логическая единица это 5v
поставь стабилитрон на 3,3в
или делитель на двух резисторах
Подскажите а как можно считать присутствие сигнала на матрице? Хочу гасить подсветку в ноль когда сигнала нет, чтоб синий экран не слепил
похоже никак ...
Понял тут с неделю назад, что ламповая подсветка в мониторе начала сдыхать и решил поставить светодиодную, естественно, с авторегулировкой яркости.
Купил на митинском рынке пару светодиодных полосок шириной около 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);
}
}
Или как то всё преподключить на самой ардуино ?
По всякому пробовал, у меня ничего не получилось. И еще почему то подсветка резкими ступенями регулируется, оч отвлекает, а те скетчи что преведены выше, не понял подойдут мне или нет.
У тебя фигурные скобки стоят где попало, разберись с ними сначала
Например:
Или вот здесь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);
Если честно, то вообще не особо понимаю что и зачем я пишу в ардуино, добавлял скетч с авторегулировкой часа 2 наверно... Так как постоянно ругается, то на скобки, то на слова, вообще не понимаю как её программировать.
Кстати сейчас вспомнил что яркость менялась при нажатии кнопок на руле, даже со скетчем из первого поста, соответственно могу предположить что не в нём дело.
Кто бы подправил мой скетч и убрал лишнее был бы оч благодарен.
Вот как у меня всё подключено. Может тут какая то ошибка ?
Хотябы подскажите как сделать чтоб значения датчика или кнопок поменялись, у меня сейчас 0-600 вроде, и они пересекаются с кнопками, как сделать чтоб у кнопок начиналось 600-1200 или у датчика 600-1200 ? какой резистор поменять или что сделать... Моргающая подсветка от кнопок сильно напрягает..
В общем моя проблема так и не решилась...
При нажатии кнопок на руле, притухает подсветка, причём определённым кнопкам соответствует определённая яркость. При заливке скетча из шапки (без доработок, как есть) картина та-же.. Пробовал кнопки перевешивать на другие порты, менять резисторы, менять фоторезистор, ничего не помогает. Может у меня что-то не так подключено ? Хелп!
И еще одна проблемма, когда экран на минимальной яркости, при включении камеры заднего вида, через несколько секунд выключается подсветка помогает только попадание света на фоторезистор (но это второстепенная проблема).
А ты что хотел от этого кода? В коде компьютеру посылается всего два байта и эти два байта данные о нажатии кнопок руля.