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

На кой нужна фара на 1/3 яркости?
Из пожеланий - дополнить китайским датчиком вибрации (пружинка внутри металлической трубочки). Если более 30 сек нет вибраций - плавно понизить яркость до 50%. Еще через 40 сек выключить фару и уйти в спячку.
Если дополнить фоторезистором, то и кнопка не нужна - полный автомат.
Tomasina, яркость воспринимается нелинейно, поэтому при шиме 30% это как минимум половина яркости. А на полную она очень ярко светит, там 6 трёх-амперных светодиодов. И много кушает, мне такой свет не всегда нужен, хватит половины. Дополнительно туда ничего не поставить, нет места. Я имел ввиду программные фишки. Вот сделал ещё плавное включение/выключение, но это уж совсем мелочь.
На всякий случай добъю тему до логического конца. Вдруг кому понадобится. Прилепил кое-как тини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); } } }так полно же места для датчика вибрации. Его габариты D2.5 х 8 мм, как полтиньки без ножек ;)