Недавно приобрёл Кардуину и решил выложить свой первый скетч, пришлось пару вечеров вспоминать азы С++
Идея такова: планирую изготовить светодиодные ДХО, пока ищу подходящий корпус. В каждой фаре будет по 6шт 3х ваттных всетодиодов последовательно. Драйвер будет буст на ncp3066, с ШИМ входом. Выходной ток драйвера планируется около 1А.
Теперь об управлении: Ардуинка будет подключена к замку зажигания, при включении она выдаёт импульсы заданной скважности( регулируется резистором R2) и фиксированной частоты. Специально ввёл такую регулировку чтобы понизить выходной ток драйвера до нужного(около 600мА) значения в штатном режиме. Нажатие на кнопку "Strobe on" включает режим стробоскопа. Каждая сторона поочерёдно мигает установленное кол-во раз с установленной частотой. Причём в режиме строба, на выходах уже не ШИМ сигнал, а логические о и 1. Это как раз для того чтобы драйвер выдавал установленный в нём изначально 1А. Сделано это для повышения яркости. В паузах между вспышками у светодиодов будут достаточные передышки чтобы можно было не бояться перегрева.
PHP код:
#include <EEPROM.h>
#include <buttons.h>
int freq; //Настройки - частота, кол-во вспышек и яркость в основном режиме
int num;
int bright;
Button B; //Кнопка настроек
#define rightpin 10 //1ый выход ШИМ
#define leftpin 9 //2ой выход ШИМ
#define butpin 11 //кнопка включения строб режима
#define settings 7 //кнопка настроек
#define resetjump 5 //джампер сброса настроек(если запутались)
#define ind 6 //салонный индикатор
#define internalind 13 //внутренний индикатор
#define dimmeradc 0 //вход регулировки яркости в обычном режиме
void setup()
{
pinMode(leftpin, OUTPUT);
pinMode(rightpin, OUTPUT);
pinMode(ind, OUTPUT);
pinMode(internalind, OUTPUT);
pinMode(butpin, INPUT);
pinMode(settings, INPUT);
pinMode(dimmeradc, INPUT);
pinMode(resetjump, INPUT);
//Свойства кнопки настроек
B.assign(settings); //Определяем выход для класса Button
B.setMode(OneShotTimer); //Режим
B.setTimer(500); //Время для удерживания устанавливаем пол секунды
B.setRefresh(1000); //Время срабатывания последующих удерживаний кнопки
//Записываем начальные настройки в еепром если он пустой и читаем их и кладём в переменные если там чтото есть
if (EEPROM.read(0)==255) {
EEPROM.write(0,1);
}
else {
num = EEPROM.read(0);
}
if (EEPROM.read(1)==255) {
EEPROM.write(1,7);
}
else {
freq = EEPROM.read(1);
}
}
void loop() //Понеслась
{
bright=analogRead(dimmeradc)/4;
switch (B.check()) //Проверяем состояние кнопки настроек
{
case ON: //Если нажатие одиночное - уменьшаем частоту строба и записываем в еепром
freq=freq+7;
EEPROM.write(1,freq);
if (EEPROM.read(1)>=147) {
EEPROM.write(1,10);
freq=7;
} //Задаём максимальную паузу мажду вспышками
//Для наглядного показа настроенной частоты мигаем индикаторами 5 раз с установленной частотой
for (int j=0; j<5; j++)
{
delay(freq);
digitalWrite(internalind,HIGH);
digitalWrite(ind,HIGH);
delay(freq);
digitalWrite(internalind,LOW);
digitalWrite(ind,LOW);
}
break;
case Hold: //Если держим кнопку то увеличиваем моличество вспышек
num++;
freq=freq-7;
EEPROM.write(0,num); //Сразу записываем в еепром
if (EEPROM.read(0)>=11) {
EEPROM.write(0,0);
num=1;
} //Задаём максимальное кол-во вспышек
B.setRefresh(1000+(300*num));
//Мигаем индикаторами установленное кол-во раз чтобы сосчитать глазами:)
for (int j=0; j<num; j++)
{
delay(150);
analogWrite(ind,15); //Чтобы не перепутать настройки частоты и кол-ва вспышек, нужно чтобы индикатор моргал с разной яркостью
digitalWrite(internalind,HIGH);
delay(150);
analogWrite(ind,0);
digitalWrite(internalind,LOW);
}
break;
default:
break;
}
//Кнопка нажата - включаем строб
if (digitalRead(butpin)) { strobenow(freq, num); }
//Кнопка отпущена - включаем основной режим
else { analogWrite(rightpin,bright); analogWrite(leftpin,bright); }
if (digitalRead(resetjump)) { resetsettings(); }
}
//===============================================================================
//Строб режим
void strobenow(int f, int c) {
digitalWrite(rightpin, LOW);
for (int i=0; i<c;i++) //Мигает одна сторона
{
if (i!=0) delay(f); //Первое включение стороны делаем без задержки
digitalWrite(ind,HIGH);
digitalWrite(leftpin, HIGH);
delay(f);
digitalWrite(ind,LOW);
digitalWrite(leftpin, LOW);
}
for (int ii=0; ii<c;ii++) //Мигает другая сторона
{
if (ii!=0) delay(f); //Первое включение стороны делаем без задержки
digitalWrite(ind,HIGH);
digitalWrite(rightpin, HIGH);
delay(f);
digitalWrite(ind,LOW);
digitalWrite(rightpin, LOW);
}
}
//===============================================================================
//Сброс настроек
void resetsettings() {
freq=7;
num=1;
EEPROM.write(0,num);
EEPROM.write(1,freq);
digitalWrite(internalind,HIGH);
}
LED1 используется как индикатор состояния и ставится в салоне. Настраивается всё с помощью кнопки "Settings". Одиночное нажатие увеличивает паузы между вспышками на 7 миллисекунд, минимальная пауза - 7мс, максимальная - 147мс. (20 нажатий) После нажатия кнопки, пауза увеличится на 7мс, LED1 и D13 мигнёт 5 раз с установленной паузой и настройка запишется в еепром. При долгом удерживании, устанавливается кол-во вспышек с каждой стороны. Например: держим кнопку более полсекунды, индикатор мигнёт 4 раза, если после этого, всё ещё держим - индикатор через секунду мигнёт 5 раз, если кнопку отпустим - настройка сохранится. Количество свпышек индикатора будет соответствовать количеству вспышек каждой стороны. Ещё предусмотрены джампер сброса настроек и дополнительное приглушение света при включении фар например(U1, R1).