Ligar o carro com Arduino

Boa noite amigos !
Estou com esse pequeno projeto e preciso de um código de pulso. Ao apertar o botão de start, preciso que ele libere energia por um determinado tempo para um relé e esse relé ligaria o motor de arranque do carro.

O esquema é o seguinte:
Switch liga energ. geral e liga a placa;
Dois botões digitam uma senha que, se correta, libera energ. para o painel e para o botão start;
Um terceiro botão reseta a senha;
Apertando o botão de start temos:
Primeira vez - Dá o pulso por um tempo (2s) para o relé ligar o motor de arranque.
Segunda vez - Desliga o motor.
Terceira vez - Zera a contagem.

Uso ainda códigos básicos e ainda brigo com o bounce dos botões. Qualquer ajuda mais avançada seria muito bem-vinda !

Desde já, Obrigado !

Qualquer código será bem-vindo também.

Terminei ele ontem e aqui está ! =D

int ledPLACAON(12);
int senhamenosBOTAO(3);
int senhamaisBOTAO(4);
int senhamenosLED(5);
int senhamaisLED(6);
int ativaSTART(7);
int ativaPAINEL(8);
int ledSTART(9);
int botaoSTART(10);
int motor(11);
int senha=0;
int start=0;
int EBMAIS=0;
int EBMENOS=0;
int EBSTART=0;
int zero(2);
// todos os pinos e funções;

void setup(){
Serial.begin(9600);
pinMode(ledPLACAON, OUTPUT);
pinMode(senhamenosBOTAO, INPUT);
pinMode(senhamaisBOTAO, INPUT);
pinMode(senhamenosLED, OUTPUT);
pinMode(senhamaisLED, OUTPUT);
pinMode(ativaSTART, OUTPUT);
pinMode(ativaPAINEL, OUTPUT);
pinMode(ledSTART, OUTPUT);
pinMode(botaoSTART, INPUT);
pinMode(motor, OUTPUT);
pinMode(zero, OUTPUT);
}

void loop(){
EBSTART = digitalRead(botaoSTART);
EBMAIS = digitalRead(senhamaisBOTAO);
EBMENOS = digitalRead(senhamenosBOTAO);
//senha para ligar o painel e ativar o botão start, juntamente com um led;
if(senha>=7){
senha=0;
}
//apenas um led para indicar o zero da senha;
if(senha==0){
digitalWrite(zero, HIGH);
}else{digitalWrite(zero, LOW);
}
if(EBMAIS==HIGH){ //botão precionado, add 2 na senha e o segundo botão retira 1;
digitalWrite(senhamaisLED, HIGH);
senha=senha+2;
delay(150);
}else{digitalWrite(senhamaisLED, LOW);
}
if(EBMENOS==HIGH){
digitalWrite(senhamenosLED, HIGH);
senha--;
delay(150);
}else{digitalWrite(senhamenosLED, LOW);
}
Serial.println(senha);
Serial.print("start");
Serial.println(start);
if(senha==5){ //descrito a ativação do painel, do botão start e do led indicativo;
digitalWrite(ledSTART, HIGH);
digitalWrite(ativaSTART, HIGH);
digitalWrite(ativaPAINEL, HIGH);
}else{digitalWrite(ativaSTART, LOW);
digitalWrite(ativaPAINEL, LOW);
digitalWrite(ledSTART, LOW);
}//se o botão start for precionado uma vez, ele liga o motor com start=1 (é aqui que eu preciso de apenas um pulso senão o motor de arranque vai ficar ligado direto);
//Quando precionado mais uma vez, start=2 desliga o painel e, consequentemente, o motor;
//Pela terceira vez ele zera o start e libera a senha;
if(EBSTART==HIGH){
start++;
delay(150);
}
if(start>=3){
start=0;
}
if(start==1){
digitalWrite(motor, HIGH);
}else{ digitalWrite(motor, LOW);
}
if(start==2){
senha=0;
}
}

Ja viste a funcao millis()?

Podes ver o que ela faz mais a fundo no exemplo blink without delay na IDE do Arduino.

A forma correcta de publicar código no fórum é a indicada nas regras. Aparece esta imagem, que penso que explica bem o processo:

Para fazer debounce de botões, pode usar-se a função millis(), como refere o bubulindo, mas talvez o melhor exemplo seja este.

Obrigado pela atenção e pelas dicas galera !
Então, eu havia visto alguns exemplos da função millis mas mesmo assim não consigo que o "start = 1" dê apenas um pulso de 2000millis, não sei como colocar a função para funcionar dessa maneira.

se start for igual a 1 (estas no modo correcto)
variavel_tempo = millis();
start_tempo = 1;
liga o pino
fim se

se start_tempo ==1 e millis()-start_tempo > 2000
start_tempo = 0
desliga o pino.
fim se

Parece que há pouco não percebi o que se estava a tratar. :-X

Era exatamente isso que procurava, muito obrigado !! Mas não consegui encaixa-lo no código :frowning:
Ele não manda o sinal para o pin motor

Este é o código que ache certo escrever, mas não rolou.

if(EBSTART==HIGH){
  start++;
  delay(150);
}
if(start>=3){
  start=0;
}
if(start==1){
  variavel_tempo = millis(); 
   start_tempo = 1;
  digitalWrite(motor, HIGH);
}
if(start_tempo==1&&millis()-start_tempo>2000){
  start_tempo=0;
 digitalWrite(motor, LOW);
}
if(start==2){
  senha=0;
}
}

Muito obrigado pela paciência e atenção dos que ajudaram aqui, fui atras de material no youtube e aprendi como fazer o tal pulso. Usei códigos modificados de relógio.
Até a próxima !

Olá amigo, poderia mandar seu projeto para analisar? Estou pensando em fazer isso no meu celta, mas não manjo muito, seria de grande ajuda. Obrigado.

InoaMedeiros:
Muito obrigado pela paciência e atenção dos que ajudaram aqui, fui atras de material no youtube e aprendi como fazer o tal pulso. Usei códigos modificados de relógio.
Até a próxima !

cara tem como me ajudar ? estou fazendo um pra por no meu carro mais nao consigo montar o codigo vc consegue me mandar por email o esquema que fez ?