Нужна помощь. своял управление питанием систем и регулировкой света в салоне. немогу сообразить как написать двойное нажатие кнопки(у меня энкодера, но это не важно)
и ещё у меня от штатного блока ЦЗ реализовано плавное затухание салонного освещения через ШИМ и естественно этот сигнал управления заведён на вход ардуины и при выключении освещения свет моргает. как проще реализовать? программно синхронизировать ШИМ или сглаживание ШИМа конденсатором и перевод в аналоговый пересчёт?
/*
Для управлением яркостью LED используется энкодер
*/
#define VHOD_SALONNIY_SVET A0 //4 сигнал от штатного блока управления
#define SVET_SALON 13 //1 плюс питания салонного света
#define KNOPKA_SVET A1 //2 кнопка энкодера салонного света
#define VIHOD_OSTATOCHNOGO_PITANIYA 4 //3 на доводчик стёкол
#define VIHOD_OTKRITO 5 //3 питание салонных приблуд
#define VHOD_ZAKRITO 3 //3 от ЦЗ
#define VHOD_OTKRITO 2 //3 от ЦЗ
int val = 0; //2 сохраняет состояние входного контакта
int old_val = 0; //2 хранит предыдущее значение "вал"
int state = 0; //2 0 = LED off в то время как 1 = LED on
int flag=0; //3
unsigned long currentTime_pit; //3
unsigned long loopTime_pit; //3
int brightness = 30; //1 яркость LED, начинаем с половины
int fadeAmount = 1; //1 шаг изменения яркости LED
unsigned long currentTime_enc; //1
unsigned long loopTime_enc; //1
const int pin_A = A2; //1 pin 22
const int pin_B = A3; //1 pin 23
unsigned char encoder_A; //1
unsigned char encoder_B; //1
unsigned char encoder_A_prev=0; //1
unsigned long startTime = 0; //2 когда же мы начнем нажатием?
void setup()
{
pinMode(KNOPKA_SVET, INPUT); //2 52 вход кнопки энкодера
pinMode(VIHOD_OTKRITO, OUTPUT); //3
pinMode(VIHOD_OSTATOCHNOGO_PITANIYA, OUTPUT); //3
pinMode(VHOD_SALONNIY_SVET, INPUT); //4
pinMode(SVET_SALON, OUTPUT); //1 устанавливаем как выход
pinMode(pin_A, INPUT); //1
pinMode(pin_B, INPUT); //1
digitalWrite(A2, HIGH); //1 внутренняя подтяжка 10 кОм к +5V
digitalWrite(A3, HIGH); //1 внутренняя подтяжка 10 кОм к +5V
digitalWrite(A1, HIGH); //2
currentTime_enc = millis(); //1
loopTime_enc = currentTime_enc; //1
}
void loop()
{
val = digitalRead(KNOPKA_SVET); //2 читать входное значение и сохранить его ням, свежий галочку, если произошел переход
if ((val == LOW) && (old_val == HIGH)) //2
{
state = 1 - state; //2 изменить состояние из выключенного состояния во включенное или наоборот
startTime = millis(); //2 millis()является Arduino часы она возвращает количество миллисекунд прошло с тех пор совет был сброшен. (эта линия помнит, когда кнопка была нажата в прошлом)
delay(10); //2
}
currentTime_enc = millis(); //1
if(currentTime_enc >= (loopTime_enc + 5)) //1 проверяем каждые 5мс (200 Гц)
{
encoder_A = digitalRead(pin_A); //1 считываем состояние выхода А энкодера
encoder_B = digitalRead(pin_B); //1 считываем состояние выхода А энкодера
if((!encoder_A) && (encoder_A_prev)) //1 если состояние изменилось с положительного к нулю
{
if(encoder_B) {if(brightness + fadeAmount <= 255) brightness += fadeAmount;} //1 выход В в полож. сост., значит вращение по часовой стрелке увеличиваем яркость, не более чем до 255
else {if(brightness - fadeAmount >= 1) brightness -= fadeAmount;} //1 выход В в 0 сост., значит вращение против часовой стрелки уменьшаем яркость, но не ниже 0
}
encoder_A_prev = encoder_A; //1 сохраняем значение А для следующего цикла
old_val = val; //2 val теперь старый, давайте хранить его
if ((state == 1&&digitalRead(VIHOD_OTKRITO)==HIGH) || (digitalRead(VIHOD_OTKRITO)==HIGH&&digitalRead(VHO D_SALONNIY_SVET)==HIGH)) {analogWrite(SVET_SALON, brightness);} //2 //3 //4 включить светодиод на текущем уровне яркости
else {analogWrite(SVET_SALON, 0);} //2 выключить светодиод
loopTime_enc = currentTime_enc; //1
}
if(digitalRead(VHOD_OTKRITO)==HIGH&&digitalRead(VH OD_ZAKRITO)==LOW&&flag==0) //3 если кнопка нажата и перемення flag равна 0 , то ...
{
digitalWrite(VIHOD_OTKRITO,HIGH); //3
digitalWrite(VIHOD_OSTATOCHNOGO_PITANIYA,HIGH); //3
flag=1; //3 это нужно для того что бы с каждым нажатием кнопки происходило только одно действие плюс защита от "дребезга" 100%
}
if(digitalRead(VHOD_OTKRITO)==LOW&&digitalRead(VHO D_ZAKRITO)==HIGH&&flag==1) //3 если кнопка НЕ нажата и переменная flag равна - 1 ,то ...
{
digitalWrite(VIHOD_OTKRITO,LOW); //3
flag=0; //3
state=0; //3 сбрасываем принудительно салонный свет в выкл. состояние
loopTime_pit = currentTime_pit; //3
}
currentTime_pit = millis(); //3 считываем время, прошедшее с момента запуска программы
if(digitalRead(VIHOD_OTKRITO)==LOW && currentTime_pit >= (loopTime_pit + 30000)) //3 сравниваем текущий таймер с переменной loopTime + 1 секунда
digitalWrite(VIHOD_OSTATOCHNOGO_PITANIYA, digitalRead(VIHOD_OTKRITO)); //3 выключаем остаточное питание через заданный промежуток времени
}