Paso 5: Código de Arduino
Usted notará en la primera parte del código que dos señales diferentes se pueden utilizar para iniciar el comando de arranque de coche:
1) envío una "s" a la Arduino a través del módulo de bluetooth (que actúa como un puerto serie) puede utilizarse para iniciar la secuencia de arranque. Esto se usa cuando se arranca el vehículo desde una terminal en una computadora.
2) poniendo un alfiler en el Arduino alta también iniciará la secuencia de salida. Este perno de la entrada en el Arduino está conectado a la tarjeta de Bluetooth. Cuando se utiliza la aplicación de Margarita ON/OFF desde un teléfono Android, la aplicación hará el pin en la placa de Bluetooth a alta, que a su vez será vista por el Arduino y la secuencia de salida comenzar.
Este es mi código:
/ * Programa: arranque remoto de coches
* Autor: Chris Johnson
* Revisado: 05 de diciembre de 2011
*
* Entradas: BT módulo señal "ON"
* Señal de "OFF" BT módulo
* Sensor de RPM del vehículo
* Vehículo Sensor de posición de punto muerto
* Sensor de velocidad del vehículo
* Puerto serie
* Salidas: Relé de Control de ignición
* Accesorios de control
* Relé de Control el arranque
* Embrague de seguridad interruptor relé
* Serial Port
*/
EQUIVALE
Entradas
int BT_on = 2; Bluetooth inputed de señal "ON" al pin 2
int RPM_sens = 3; Sensor de RPM del vehículo introducido al pin 3
int neutral_sens = 4; Sensor de posición de neutro de vehículo introducido al pin 4 (12 voltios +-0,5 voltios)
int speed_sens = 5; Sesor de velocidad del vehículo introducidos al pin 5
int BT_off = 7; Bluetooth "OFF" señal inputed en pin 7
Salidas
int ign_ctrl = 8; Relé de Control de ignición controlada por el pin 8
int start_ctrl = 9; Relé de Control de arranque controlada por el pin 9
int clutch_sfty = 10; Relé de Swithc de seguridad embrague controlado por el perno 10
int acc_ctrl = 11; Accesorio relé de Control controlado por el pin 11
start_time largo sin firmar; Variable utilizada para almacenar el momento en el que participa el motor de arranque
char datos = 0; Variable utilizada para almacenar los datos recibidos a través del puerto serie
DEFINICIONES
void setup()
{
pinMode (BT_on, entrada); Definir pines de entradas y salidas
pinMode (RPM_sens, entrada);
pinMode (neutral_sens, entrada);
pinMode (speed_sens, entrada);
pinMode (BT_off, entrada);
pinMode (ign_ctrl, salida);
pinMode (start_ctrl, salida);
pinMode (clutch_sfty, salida);
pinMode (acc_ctrl, salida);
Serial.Begin(9600); Inicializar el puerto serie con una velocidad en baudios de 9600
}
PROGRAMA
Función de bucle: esperar a que un comando de START recibir (comandos por puerto serie o
voltaje aplicado al pin BT_on)
void loop()
{
Si (Serial.available() > 0) //Check si se dispone de datos seriales
{
datos = Serial.read(); Variable "Datos" del sistema a los datos actualmente disponibles en serie
Check(); Ir a la para función "comprobar" si se dispone de datos en serie
}
else if (digitalRead(BT_on) == HIGH) //Check si módulo BT ha pin alto
{
begin(); Begin Inicio secuencia si el pin es de alta
}
otra cosa
{
Loop(); Esta función de repetición hasta que se recibe un comando de START
}
}
Comprobar funcionamiento: prueba para el carácter propio de BT
check() vacío
{
Si (datos == de ') //Check si ha sido enviada a una "s"
{
begin(); Begin Inicio secuencia si "s" ha sido enviado
}
otra cosa
{
Serial.println ("comando no válido"); Si hay algo que se ha enviado una "s", envía mensaje de error "Comando no válido"
Loop(); Volver al inicio del programa
}
}
Comenzar la función: activar el accesorio y encendido
begin() vacío
{
Delay(500); 0.5 demora segundos
digitalWrite (acc_ctrl, HIGH); Activar accesorios en el
digitalWrite (ign_ctrl, HIGH); Gire a ON (encendido)
Delay(500); 0.5 demora segundos
neutral(); Ir a la función «neutral»
}
Neutral de la función: verificar si la transmisión del vehículo en la posición neutral.
Continuar si el vehículo está en punto muerto. Salida Inicio secuencia si el vehículo está en marcha.
void neutral()
{
Si (digitalRead(neutral_sens) == HIGH) //Continue sólo si el vehículo está en punto muerto
{
Start(); Arrancar el vehículo en caso de neutro
}
otra cosa
{
Serial.println ("vehículo no en punto muerto"); En caso de cambios, envía mensaje de error "Vehículo no en punto muerto"
vehicle_off(); Salida Inicio secuencia en caso de cambios
}
}
Función: participar arranque sólo si el motor no está en ejecución.
void start()
{
int RPM = pulseIn (RPM_sens, alta, 1000000); Obtener valor RPM
if(RPM == 0) //Continue Inicio secuencia sólo si el vehículo no está funcionando.
{
digitalWrite (clutch_sfty, HIGH); Embrague "Presione"
digitalWrite (acc_ctrl, bajo); Apagar accesorios
Delay(500); 0.5 demora segundos
digitalWrite (start_ctrl, HIGH); Realizar arranque
start_time = millis(); El tiempo en que fue contratado el motor de arranque
starter_engaged(); Ir a la función Starter_engaged
}
otra cosa
{
Serial.println ("vehículo ya funcionando"); Mensaje "Vehículo ya corre" si previamente se inició el motor de
vehicle_off(); Salida Inicio secuencia si ya está ejecutando
}
}
Función Starter_engaged: desactivar arrancador después de vehículo de motor de arranque o apagar el motor de arranque si
vehículo no ha comenzado dentro de 4 segundos.
void starter_engaged()
{
int RPM = pulseIn (RPM_sens, alto); Obtener valor RPM
Si //Continue (RPM > 1000) si el motor ha comenzado (alcanzado bajo ralentí)
{
Serial.println ("motor funcionando"); Mensaje "Motor en marcha" una vez arrancado el motor
disengage_starter(); Ir a disengage_starter después de motor está en marcha
}
else if ((start_time+4000) < millis()) //Test si 4 segundos ha pasado desde que fue contratado el motor de arranque
{
disengage_starter_timeout(); Ir a disengage_starter si el motor no ha comenzado dentro de 4 segundos de compromiso motor de arranque
}
otra cosa
{
starter_engaged(); Repetir esta función si el motor no se ha iniciado o no haya transcurrido 4 segundos
}
}
Función Disengage_starter: desactivar el motor de arranque.
void disengage_starter()
{
digitalWrite (start_ctrl, bajo); Desengrane el motor de arranque
digitalWrite (clutch_sfty, bajo); "Liberación" del embrague
digitalWrite (acc_ctrl, HIGH); Activar accesorios en el
vehicle_off_sense(); Ir a la función vehicle_off_sense
}
Función Disengage_starter_timeout: desactivar el motor de arranque (usado después de 4 segundos ha transcurrido sin un arranque del motor)
void disengage_starter_timeout()
{
digitalWrite (start_ctrl, bajo); Desengrane el motor de arranque
digitalWrite (clutch_sfty, bajo); "Liberación" del embrague
Serial.println ("vehículo arranque fallido"); Enviar "Vehículo Inicio fallido"
vehicle_off(); Secuencia de arranque de salida
}
Función Vehicle_off_sense: esperando una señal "off" para el motor en marcha.
Si se recibe ninguna señal "off", se apaga el vehículo transcurrido 30 minutos desde el arranque.
void vehicle_off_sense()
{
móvil int = pulseIn (speed_sens, HIGH); Obtener la velocidad del vehículo
Si (movimiento > 1000) //Check si el vehículo está en movimiento
{
Serial.println ("vehículo--movimiento"); Enviar "Vehículo de movimiento--" mensaje ifvehcile se está moviendo
vehicle_off(); Apague el vehículo si se mueve
}
else if (start_time + 1800000 < //Check millis()) si han transcurrido 30 minutos desde el arranque del motor
{
Serial.println ("vehículo, tiempo de espera automático"); Mensaje "Vehículo apagado--automático tiempo de espera", si ha sido
funcionar por 30 minutos
vehicle_off(); Apague el vehículo si el motor está en marcha durante 30 minutos
}
else if (Serial.available() > 0) //Check si ha enviado una señal a través de los datos en serie
{
datos = Serial.read(); Tienda serie envía datos en serie
Si (datos == ' o ') //Check si la señal enviada es un comando de apagado ("o")
{
Serial.println ("vehículo--al mando de usuario"); Mensaje "Vehículo apagado--usuario manda" si los datos en serie están el
comando ("o")
vehicle_off(); Apagar el vehículo si fuera comando es enviado a través de los datos en serie
}
}
else if (digitalRead(BT_off) == HIGH) //Check si fuera comando se ha enviado vía el módulo de BT
{
Serial.println ("vehículo--al mando de usuario"); Mensaje "Vehículo apagado--usuario ordenó" if OFF
comando fue enviado
vehicle_off(); Apagar el vehículo si fuera comando fue enviado vía el módulo de BT
}
otra cosa
{
vehicle_off_sense(); Esta función de repetición si ninguna de las anteriores condiciones han sido cumplida
}
}
Vehicle_off función: desactiva el vechile y comienza todo el programa sobre
void vehicle_off()
{
digitalWrite (ign_ctrl, bajo); Apague la ignición
digitalWrite (acc_ctrl, bajo); Apagar accesorios
Loop(); Repetición de programa (busque la orden de marcha)
}