Код:
int rele_1 = 2; //зажигание
int rele_2 = 3; //стартер
int rele_3 = 4; //габариты
int rele_4 = 5; //ближний свет
int rele_5 = 6; //подсветка салона
const int motor = 7; //определение работы двс
const int LedPin = 8; //подсветка глазка
const int LedButtonPin = 9; //подсветка кнопки
const int buttonPin = 10; //кнопка
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 30; // the debounce time; increase if the output flickers
long longDelay = 1000; //время длинного нажатия
void setup() //конфигурирование системы после сброса
{
char i;
pinMode(rele_1, OUTPUT);
pinMode(rele_2, OUTPUT);
pinMode(rele_3, OUTPUT);
pinMode(rele_4, OUTPUT);
pinMode(rele_5, OUTPUT);
pinMode(motor, INPUT);
pinMode(LedPin, OUTPUT);
pinMode(LedButtonPin, OUTPUT);
pinMode(buttonPin, INPUT);
//начальное положение реле
setKeyState1();
}
//Состояние 1 все выключено
void setKeyState1(){
delay(25);
digitalWrite(rele_1, LOW);
delay(25);
digitalWrite(rele_2, LOW);
delay(25);
digitalWrite(rele_3, LOW);
delay(25);
digitalWrite(rele_4, LOW);
delay(25);
digitalWrite(rele_5, LOW);
}
//Состояние 2 зажигание
void setKeyState2(){
delay(25);
digitalWrite(rele_1, HIGH);
delay(25);
digitalWrite(rele_2, LOW);
delay(25);
digitalWrite(rele_4, LOW);
delay(25);
digitalWrite(rele_5, LOW);
}
//Состояние 3 зажигание и стартер
void setKeyState3(){
delay(25);
digitalWrite(rele_1, HIGH);
delay(25);
digitalWrite(rele_2, HIGH);
delay(25);
digitalWrite(rele_4, LOW);
delay(25);
digitalWrite(rele_5, LOW);
}
//Состояние 4 зажигание, подсветка, ближний
void setKeyState4(){
delay(25);
digitalWrite(rele_1, HIGH);
delay(25);
digitalWrite(rele_2, LOW);
delay(25);
digitalWrite(rele_4, HIGH);
delay(25);
digitalWrite(rele_5, HIGH);
}
//Состояние 5 зажигание, подсветка
void setKeyState5(){
delay(25);
digitalWrite(rele_1, HIGH);
delay(25);
digitalWrite(rele_2, LOW);
delay(25);
digitalWrite(rele_4, LOW);
delay(25);
digitalWrite(rele_5, HIGH);
}
//Автомат состояний
void changeState(int s){
int _delay;
if(s==1){ //поступил сигнал длинного нажатия
if(digitalRead(7)==HIGH) //если двигатель запущен, то ....
{
if(digitalRead(1)==HIGH) //если зажигание вкл, то ....
{setKeyState1(); //выключаем все
}
}else{
if(digitalRead(1)==HIGH) //если зажигание вкл, то ....
{setKeyState4(); //Состояние 4 зажигание, подсветка, ближний
}else{
setKeyState2(); //Состояние 2 зажигание
delay(2000); //Даем подкачать бензонасосу
setKeyState3(); //Состояние 3 зажигание и стартер
_delay=millis();
while(digitalRead(7)==LOW){ //крутим стартер пока не заведемся
if((millis()-_delay)>3000)break; //но не более 3х сек
}
delay(2000);
if(digitalRead(7)==LOW){ //если не завелись
setKeyState1(); //Состояние 1 все выключено
}else{ //если завелись
setKeyState4(); //Состояние 4 зажигание, подсветка, ближний
}
}
}
}else{ //поступил сигнал короткого нажатия
if(digitalRead(7)==HIGH) //если двигатель запущен, то ....
{
if(digitalRead(1)==HIGH) //если зажигание вкл, то ....
{
if(digitalRead(5)==HIGH) //если ближний вкл, то ....
{
setKeyState5(); //Состояние 5 зажигание, подсветка
}else{
setKeyState4(); //Состояние 4 зажигание, подсветка, ближний
}
}else{
setKeyState4(); //Состояние 4 зажигание, подсветка, ближний
}
}else{
if(digitalRead(1)==HIGH) //если зажигание вкл, то ....
{
setKeyState1(); //Состояние 1 все выключено
}else{
setKeyState2(); //Состояние 2 зажигание
}
}
}
}
void loop() {
if(digitalRead(7)==HIGH) //если двигатель запущен, то ....
{
delay(25);
digitalWrite(rele_3, HIGH); //вкл габариты
delay(25);
digitalWrite(LedPin, HIGH); //вкл подсветку глазка
}
if(digitalRead(1)==HIGH) //если зажигание вкл, то ....
{
delay(25);
digitalWrite(LedButtonPin, HIGH); //вкл подсветку кнопки
}
//читаем состояние кнопки
int reading = digitalRead(buttonPin);
//сбрасываем таймер кнопки, пока отжата
if(reading==1)
{
lastDebounceTime=millis();
}else
{
//если кнопка нажата и дребезг контактов прекратился,
if((millis()-lastDebounceTime)>debounceDelay){
while(reading==0){
//то ждем пока отпустят кнопку
reading = digitalRead(buttonPin);
//если кнопку держали дольше longDelay
if((millis()-lastDebounceTime)>longDelay)
//то шлем в автомат 1
changeState(1);
else //иначе 0
changeState(0);
}
}
}
}
Логика работы на блок схеме. Постоянная проверка зажигания, т.к. движку мог завести в автозапуска. В планах собрать KeyLess систему со своей логикой работы))