Велофара-модернизация.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Имеется велофара - 6 светодиодов Cree XM-L T6 + boost led драйвер на китайском спец.чипе PS9920, вход "Enable" которого дёргает шимом неизвестный МК. Не устраивают режимы работы  -Ярко - умеренно- стробоскоп. Хочу плавно менять яркость, а  стробоскоп совсем не нужен.  Все ноги МК вызвонил, буду приделывать туда тини13 или тини85, не важно.  На фаре всего одна кнопка. Пока думаю так -кратковременное нажатие кнопки включает фару с шимо заполнением 30%, т.е. средняя яркость.  Если нажать и удерживать -то яркость плавно возрастает от 0 до максимума и обратно. Повторное кратковременное -отключает фару.

Может есть ли какие нибудь более интересные варианты работы с фарой? ) А то нехочется потом отпаивать М.К. что-б перешить, если в голову что-то ещё придёт ))

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

На кой нужна фара на 1/3 яркости?
Из пожеланий - дополнить китайским датчиком вибрации (пружинка внутри металлической трубочки). Если более 30 сек нет вибраций - плавно понизить яркость до 50%. Еще через 40 сек выключить фару и уйти в спячку.
Если дополнить фоторезистором, то и кнопка не нужна - полный автомат.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Tomasina, яркость воспринимается нелинейно, поэтому при шиме 30% это как минимум половина яркости. А на полную она очень ярко светит, там 6 трёх-амперных светодиодов. И много кушает, мне такой свет не всегда нужен, хватит половины.  Дополнительно туда ничего не поставить, нет места. Я имел ввиду программные фишки. Вот сделал ещё плавное включение/выключение, но это уж совсем мелочь.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

На всякий случай добъю тему до логического конца. Вдруг кому понадобится.  Прилепил кое-как тини85, всё работает как задумывал. Скетч:

// ADC2(P4) -analog in
// PB0 (ocoa)-выход pwm
// PB1 -red LED (включается низким уровнем) сигнал разряжённого аккума
// PB2 -green LED (включается низким уровнем) сигнал напряжение в порядке
// PB3 -кнопка (включается низким уровнем)

uint32_t prevmillis;
boolean preskey, preskeyflag;
void setup() {
DDRB=(1<<PB0)|(1<<PB1)|(1<<PB2); //set output
PORTB|=(1<<PB3); // key pullup
TCCR0A=(1<<COM0A0)|(1<<COM0A1)|(1<<WGM00)|(1<<WGM01);
TCCR0B=(1<<CS00)|(1<<CS01); 
OCR0A=255;
ADMUX=(1<<REFS2)|(1<<REFS1)|(1<<MUX1); // 2,56v internal
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //ADC2 input
DIDR0=1<<ADC2D;
ADCSRB=0;
}

void loop() {

preskey=!digitalRead(3);

// если нажата кнопка но флага нет -то начать 
// считать время и поставить флаг нажатия
if (preskey && !preskeyflag){
    prevmillis=millis();
    preskeyflag=1;
   }


//если отжата, а флаг есть, то проверить время
if (!preskey && preskeyflag){ preskeyflag=0;
     uint16_t  delta= (millis()-prevmillis);
       if (delta > 100 && delta <1000) on_off();
        }

//если нажато и флаг есть -регулировать яркость
if (preskey && preskeyflag){
    if ( (millis()-prevmillis) > 1000) up_down();
    }

ADCSRA |= (1<<ADSC);
while (bit_is_set(ADCSRA,ADSC));
if (ADC > 530){ PORTB|=(1<<1); PORTB&=~(1<<2); }
else {PORTB|=(1<<2); PORTB&=~(1<<1);}


} //end loop

void on_off() {
if (OCR0A!=255) { while(OCR0A<255){ OCR0A++; delay(5); } } // выключать
else { while(OCR0A>190){ OCR0A--; delay(10); } } //включать на четверть мощи

}

void up_down(){
static boolean dir=1;
if (dir) OCR0A==255? dir=0 : OCR0A++;
else OCR0A==0? dir=1 : OCR0A--;
delay(10);
if (OCR0A==255||OCR0A==0) { for(byte n=1; n<5; n++) {PORTB^=(1<<1); delay(200); } }

  
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

так полно же места для датчика вибрации. Его габариты D2.5 х 8 мм, как полтиньки без ножек ;)