Alarma de seguridad para Automóvil

Hola a todos, la idea de este proyecto es la realización de una alarma, todo esto con fines de aprendizaje , en el mercado ya existen una gran cantidad de alarmas, con montón de funcionalidades, para todo gusto. Para esto se va a implementar ciertas funciones, las mas básicas al principio y luego se ira añadiendo mas conforme se avance con el proyecto, actualizare el post si requieren mas funciones y conforme vaya añadiendo cosas.
Funciones a implementar:

  • Cierre de seguros Automatico(Implementado)
  • Cierre de seguros(Implementado)
  • Cierre de seguros por velocidad (Implementado)
  • Apertura de seguros(Implementado)
  • Apertura de Baúl(Implementado)
  • Alerta visual(Implementado)
  • Alerta auditiva(Implementado)
  • Lectura de velocidad(Implementado)
  • Detección de puertas, maletero, capo(Implementado)
  • Sensor de vibración(Implementado)
  • Sensor de rotura de cristal
  • Alerta por violación del sistema(Implementado)
  • Comunicación CANBUS
  • GPS
  • GMS
  • Corte de combustible
  • Corte ignición
  • Control de doble vía
  • Luz de cortesía(Implementado)

Enlaces de interés:
Schematic:
Salidas


Repositorio del proyecto:
AVR_Car_Alarm

1 Like

Hace tiempo que traigo ese proyecto en mente, pero he estado trabajando en otras cosas y no se ha llegado la hora, hace algunos años me dedique a vender e instalar alarmas como ingreso extra por lo que entiendo bien como trabajan esa parte no es problema.

Swift:
mi idea es empezar por lo básico es abrir, cerrar puertas, activar la iluminación del vehículo o alerta sirena, detectar el encendido del automóvil además de la apertura de las puertas etc.

Esto que mencionas es sencillo, si solo piensas hacer eso, es mas simple que compres una y la pongas, ahora que si tienes la idea de algo mas complejo vamos sumando ideas.
Esto es lo que traigo en mente : Ademas de lo básico que tiene cualquier alarma común, tenga: arranque remoto, cierre de vidrios, seguros y quemacoco(sunroof), apertura de puerta por medio de bluetooth ademas de detectar presencia (buscar la forma mas adecuada) y en base a eso desbloquear los seguros y permitir o bloquear el arranque (que seria con botón como los vehículos recientes) incluir un teclado para desahabilitar el sistema por medio de una contraseña y demás cosas que se puedan agregar. Todo lo que puse no creo que presente mayor problema , lo único que se me complica es la forma de detectar la presencia.

La parte que comentas sobre la batería y dormir el arduino no te preocupes, eso no es necesario ya que cuando la alarma esté armada el microcontrolador solo consume unos cuantos miliamperios porque solo estaría ejecutando el loop en espera de alguna señal de entrada.
Que te parece si colaboramos con ideas para ver si sale algo bueno.
El día de mañana tratare de hacer un diagrama de como quedarían todas las conexiones y como funcionaria cada sistema, creo que basta y sobra con los puertos GPIO del atmega328, después comenzar a desarrollar el código

SALU2

Para lo que es cierre de vidrios automáticos habría que tener en cuenta que si es un sistema original al apagar el automóvil estos se quedan sin alimentación, por lo que habría que solucionar eso, aparte un sistema de seguridad para evitar que te aplaste la mano cuando se estén cerrando los vidrios por a o b motivo algún niño mete la mano, no hay ningún problema cuando se lo alza manualmente, pero en este caso habría que de alguna forma de proteger para este caso.
Ahora el sunroof no tengo ni idea de cómo funciona exactamente o si tiene finales de carrera o algo por el estilo.
Para bloquear el arranque lo más común que se utiliza es un relay normalmente conectado, que al intentar encender el vehiculo desconecta la alimentacion de las bobinas que dan la chispa al motor.
Para el encendido remoto en mi caso no podría realizarlo debido a que mi vehiculo tiene un transponder en la llave que si no está puesto en el switch imposible prenderlo, según el manual del vehiculo tienes los pines tx, rx que se dirigen a la ECU, habría que intentar leer el código que tiene la llave y este mismo transmitirlo de alguna forma a la ECU por supuesto desactivando la comunicación con el transponder esto sería a grandes rasgos habría que investigar más a fondo el funcionamiento.
Para la eliminación de la llave y encendido por boton no creo que se muy dificil hacer por su puesto la parte de encendido bobinas relay y todo eso, ahora otra cosa es que deje de dar arranque una vez que el motor haya encendido, o que el vehiculo no enciende si no se inserta algun codigo o huella digital o algo asi por el estilo eso ya es otra cosa, para poder encender el carro de forma remota al ser manual habría que poner un sensor en el embrague para encenderlo, y el encendido remoto no me gusta mucho la idea ya que por a o b motivo dejas el carro en cambio y no en neutral puede ocurrir algún accidente.
Por ahora me parece la mejor opción que haga lo básico para tener unas buenas bases y según eso ir añadiendo más cosas aparte de las que mencionas como gps.
Este es el codigo que tengo para abrir, cerrar, puertas como el baúl me falta la sirena para que emita dos sonidos al abrir y uno al cerrar

/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.
#include <LowPower.h>
/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
bool estadoIgnicion = 0,
     estadobotonValed = 0,
     estadopulsadorCapo = 0,
     flagSeguros = 0,
     armadoAutomatico = 0,
     armadoAlarma = 0;
char comandos;
long estadoControl = 0;
int estadopulsadorPuertas = 0; // 0(Abierto)/ 1(Cerrado)
int estadoVelocidad = 0;

/* Temporizador (Millis) */

/*Millis cerrado automatico*/
long tiempoFuncion1 = 10000; // Cierre a los 30 segundos
unsigned long TiempoInicial1;
/*Millis Apertura y cierrre de seguros y abul*/
long tiempoFuncion2 = 700; // Cierre a los 30 segundos
unsigned long TiempoInicial2;
/*Millis Alerta iluminacion */
long tiempoFuncion3 = 1200;
unsigned long TiempoInicial3;
/*Millis Tiempo Activacion alarma */
long tiempoFuncion4 = 30000;
unsigned long TiempoInicial4;

void setup()
{
  Serial.begin(9600);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);
  pinMode(botonValet, INPUT); // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0); // pin 2 para control
  TiempoInicial1 = millis(); // inicia la variable al momento actual para temporizador 1
  TiempoInicial2 = millis(); // inicia la variable al momento actual para temporizador 2
  TiempoInicial3 = millis(); // inicia la variable al momento actual para temporizador 3
  TiempoInicial4 = millis(); // inicia la variable al momento actual para temporizador 3
}

void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    else
    {
      Serial.print("codigo Recibido");
      Serial.println(estadoControl);
    }
    mySwitch.resetAvailable();
  }
}

void asignacionPulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}

void loop()
{
  asignacionPulsadores();
  lecturaDatos();
  
// Abrir puertas control y telefono
  if ((flagSeguros == 0) && ((estadoControl == 11227985) || (comandos == 'a')))
  {
    digitalWrite(abrirSeguros, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    armadoAutomatico = 0;
    armadoAlarma = 0;
    flagSeguros = 1;
    TiempoInicial1 = millis();
    TiempoInicial2 = millis();
    TiempoInicial3 = millis();
  }
// Cerrar puertas control y telefono
  
  if ((flagSeguros == 0) && ((estadoControl == 11227986) || (comandos == 'c')))
  {
    digitalWrite(alertaIluminacion, HIGH);
    digitalWrite(cerrarSeguros, HIGH);
    armadoAutomatico = 0;
    armadoAlarma = 1;
    flagSeguros = 1;
    TiempoInicial1 = millis();
    TiempoInicial2 = millis();
    TiempoInicial3 = millis();
  }

// Abrir baul contro y telefono
  if ((flagSeguros == 0) && ((estadoControl == 11227988) || (comandos == 'b')))
  {
    digitalWrite(abrirBaul, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    armadoAutomatico = 0;
    flagSeguros = 1;
    TiempoInicial1 = millis();
    TiempoInicial2 = millis();
    TiempoInicial3 = millis();
  }

//Millis descativar 
  if (millis() >= (TiempoInicial2 + tiempoFuncion2))
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }
  if (millis() >= (TiempoInicial3 + tiempoFuncion3))
  {
    digitalWrite(alertaIluminacion, LOW);
  }
  if (millis() >= (TiempoInicial4 + tiempoFuncion4))
  {
    digitalWrite(sirena, LOW);
  }
  comandos = ' ';
  estadoControl = 0;
}

Aquí las conexiones(los leds son para simulación):

Muy bien, veo que llevas avanzado el tema por lo que tratare de ayudarte en lo que pueda. Como te dije antes a eso me dedique mucho tiempo, en uno de mis vehículos instale una alarma con la cual cierra seguros ademas de una interfase que cierra los vidrios, otra para el arranque remoto.
tratare de aclarar tus inquietudes

Para lo que es cierre de vidrios automáticos habría que tener en cuenta que si es un sistema original al apagar el automóvil estos se quedan sin alimentación, por lo que habría que solucionar eso

No hay problema se hace un by.pass con relevadores alimentados independientemente del sistema original

aparte un sistema de seguridad para evitar que te aplaste la mano cuando se estén cerrando los vidrios por a o b motivo algún niño mete la mano

Esta parte ya la habia pensado incluso ya se usa en muchos vehiculos con sistema original y se me ocurre por el momento : 1.- utilizar sensores de corriente como el ACS712 o similar para detectar el momento que sube el consumo de corriente, asi en caso de que alguien meta la mano el vidrio se detiene y regresa un poco, algo mas sencillo es poner un reed-switch cerca del cable de alimentacion del motor (este enrollado para que genere un campo magnetico al subir la corriente y active el reed), para esto hay que usar un puente H para invertir el giro del motor. El final de carrera se puede detectar con un sensor de efecto hall

Para bloquear el arranque lo más común que se utiliza es un relay normalmente conectado, que al intentar encender el vehiculo desconecta la alimentacion de las bobinas que dan la chispa al motor.

Exactamente como lo indicas... esto no tiene mayor problema

Para el encendido remoto en mi caso no podría realizarlo debido a que mi vehiculo tiene un transponder en la llave que si no está puesto en el switch imposible prenderlo,

Esto tambien tiene una solucion mas sencilla de lo que te imaginas, pero tiene el inconveniente que le quita la seguridad que te brinda el transponder (el sistema de cierto modo ya no funcionaria)

ahora otra cosa es que deje de dar arranque una vez que el motor haya encendido,

Esto que dices se puede hacer de 2 maneras: 1.- al presionar el boton de arranque se activa la ignicion y el motor de arranque solo funciona mientras tengas oprimido el boton. 2.- al presionar el boton activas la ignicion y el motor de arranque trabaja un tiempo establecido(ejemplo 30 seg.), si antes de ese tiempo el motor enciende el arranque corta. Para saber cuando el motor encendio se pueden usar la señal del alternador, o se pueden medir las revoluciones, esta señal se puede tomar del distribuidor, de la bobina de ignicion, del sensor de cigüeñal (CKP) o del sensor de posicion de arbol (CMP) según sea el caso

para poder encender el carro de forma remota al ser manual habría que poner un sensor en el embrague para encenderlo, y el encendido remoto no me gusta mucho la idea ya que por a o b motivo dejas el carro en cambio y no en neutral puede ocurrir algún accidente.

Aquí tienes razon por eso es mas recomendable usarlo solo en vehículos automáticos, eso no quiere decir que no se pueda hacer un sistema seguro, solo es cuestión de hacer un sistema que detecte la posición de la palanca en neutro y ademas validar que este bien puesto el freno de estacionamiento

Otra cosa, veo que usas transistores para los interruptores de puertas y baul, creo que salen sobrando, solo es cuestión de conectarlos en modo pull-up ya que la mayoría de los vehículos trabajan con negativo.

Tengo que decirte que tengo un taller mecánico, por lo que se refiere a cualquier sistema del vehículo no tengo problema y por la información técnica o diagramas no vamos a sufrir, tengo bastante, asi que lo que se pueda ofrecer no dudes en preguntar.
Bueno me despido porque ya se hizo algo largo el post
Salu2

Cual seria la forma de anular el transponder ya que según tengo entendido en el caso que se pierda la llave se tiene que desmontar la computadora y borrar la llave e introducir una nueva,ahora según los diagramas de mi veichulo tiene un pin Tx y Rx que comunica al transponder y la ECU, ya que como idea tenia intentar conectar este al arduino y poder ver si se puede leer el código de la llave y una ves esto mandar el codigo desde el arduino hasta la ECU que es la que maneja esto solo es una idea no se si podra realizar esto para no tener que implementar otro sistema de seguridad

En este caso no anularíamos el sistema, solo seria un tipo de "engaño" o by-pass ya que solo necesitamos desactivar el sistema cuando se acciona el arranque remoto o si se hace el encendido con un boton, el sistema de inmovilizador segura funcionando y es totalmente reversible

según tengo entendido en el caso que se pierda la llave se tiene que desmontar la computadora y borrar la llave e introducir una nueva

Esto no es correcto ya que la ecu no es la que se programa si no el sistema inmovilizador, y si bien hay algunos vehículos que se tiene que desmontar la memoria del inmo y reprogramarla (porque es mas barato que usar un equipo mucho mas caro como es el caso de algunos BMW), todos se pueden re-programar por el puerto OBD2, primeramente tendria que saber que vehículo tienes para saber en donde estamos pisando.

Eso de leer el código de la llave por medio de las lineas Tx y Rx con el arduino no me atrevería a decir que es imposible pero, lo que si creo es que va a ser muy difícil "atrapar" las señales y decodificarlas para después usarlas.

Para hacer el baypass del inmo solo necesitas un tramo de cable calibre 22AWG y un relevador, vas a dar entre 8 y 9 vueltas alrededor de la antena del inmo, y con los otros extremos vas a envolver la llave (donde esta el chip) y también le das algunas vueltas, digamos que estas haciendo un tipo de extensión de la antena para que puedas llevar la llave fuera del switch en un lugar escondido debajo del tablero, así cuando se active la ignición el inmo detecte la llave, el relevador es para desconectar el sistema cuando la alarma este armada. Te comentaba que el sistema es algo vulnerable porque tendrias una llave dentro del vehiculo, pero pensando que se eliminaria el switch de ignicion y todo el control del sistema seria por el arduino esto le da la seguridad necesaria. Bueno soy muy malo dibujando, tratare de hacerte un plano y lo pongo para que quede mas claro lo que trate de explicarte, igual en algún lugar debo tener un plano hecho, por ahora me voy a dormir, aquí son las 23:50 y tengo sueño
seguimos en contacto Salu2

Buenas a todos una pequeña actualización, ya que no e tenido mucho tiempo para invertir en el proyecto solo e modificado el código en la parte de millis por el motivo de paso por 0 a los 50 días aproximadamente según en varios post recomendaban restar para evitar esto no se si sera la forma correcta o si estoy equivocado o entendi mal.
Antes

if (millis() >= (TiempoInicial2 + tiempoFuncion2))
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }

Ahora

if (millis() - tiempoInicial1 >= tiempoFuncional1) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    tiempoInicial1 = 0;
    flagSeguros = 0;
  }

Codigo completo

/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.

/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
char comandos;
bool estadoIgnicion = 0,
     estadobotonValed = 0,
     estadopulsadorCapo = 0,   // 0(Abierto)/ 1(Cerrado)
    estadopulsadorPuertas = 0, // 0(Abierto)/ 1(Cerrado)
    flagSeguros = 0,
     armadoAutomatico = 0,
     armadoAlarma = 0;

long estadoControl = 0;
int estadoVelocidad = 0,
    contSirena = 0,
    flagSirena = 0,
    estadoSirena = LOW;

/* Temporizador (Millis) */

unsigned long tiempoInicial1;      // Tiempo Seguros
const long tiempoFuncional1 = 500; // Tiempo Seguros

unsigned long tiempoInicial2;       // Tiempo Alerta iluminacion
const long tiempoFuncional2 = 1200; // Tiempo Alerta iluminacion

unsigned long tiempoInicial3;      // Tiempo Sirena
const long tiempoFuncional3 = 100; // Tiempo Sirena

unsigned long tiempoInicial4;       // Armado Automatico Alarma
const long tiempoFuncional4 = 5000; // Armado Automatico alarma

void setup()
{
  Serial.begin(115200);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);                      // Comprobar si es posible incluirlo
  pinMode(botonValet, INPUT);                     // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0);                       // pin 2 para control
}

void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    /*    else
    {
      Serial.print("codigo Recibido ");
      Serial.println(estadoControl);
    }   */
    mySwitch.resetAvailable();
  }
}
void asignacionPulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}
void estadoSeguros(int estadoPuertas)
{
  digitalWrite(estadoPuertas, HIGH);
  digitalWrite(alertaIluminacion, HIGH); // En caso de utilizar señal negativa para encender relay como alternativa utilizar un blink
  tiempoInicial1 = millis();
  tiempoInicial2 = millis();
  flagSeguros = 1;
}
void loop()
{

  lecturaDatos();
  /*Control Automatico*/
  

  /*Control Manual */
  // Radio control y comando bluetooth

  if (((estadoControl == 11227985) || comandos == 'a') && (flagSeguros == 0)) // Comando y codigo para abir puertas
  {
    estadoSeguros(abrirSeguros);
    flagSirena = 3;
    contSirena = 0;
  }

  if (((estadoControl == 11227986) || comandos == 'c') && (flagSeguros == 0)) // Comando y codigo para cerrar puertas
  {
    estadoSeguros(cerrarSeguros);
    flagSirena = 2;
    contSirena = 0;
  }

  if (((estadoControl == 11227988) || comandos == 'b') && (flagSeguros == 0)) // Comando y codigo para abir el baul
  {
    estadoSeguros(abrirBaul);
    flagSirena = 4;
    contSirena = 0;
  }

  // Apagado de pines millis
  if (millis() - tiempoInicial1 >= tiempoFuncional1) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    tiempoInicial1 = 0;
    flagSeguros = 0;
  }

  if (millis() - tiempoInicial2 >= tiempoFuncional2) // Desactivacion pines de alerta iluminacion
  {
    digitalWrite(alertaIluminacion, LOW);
    tiempoInicial2 = 0;
  }
  if (contSirena < flagSirena) // Blink Sirena (Optimizar si se puede)
  {
    if (millis() - tiempoInicial3 >= tiempoFuncional3)
    {
      tiempoInicial3 = millis();

      if (estadoSirena == LOW)
      {
        estadoSirena = HIGH;
      }
      else
      {
        estadoSirena = LOW;
        contSirena++;
      }
    }
  }

  digitalWrite(sirena, estadoSirena);

  // Limpieza de variables
  estadoControl = 0;
  comandos = ' ';
}

Adjuntare todos los archivos que tenga al inicio del proyecto, también adjunto 2 videos funcionando tanto por rf como por bluetooth solo en modo manual, ahora intentaré añadir un modo para que me cierre las puertas después de un tiempo como una alarma común luego seguire implementando las sugerencias de RIG empezando por los vidrios automaticos.

Videos.

Funcionamiento contro RF
Funcionamiento por bluetooth

Buenas a todos actualizo el proyecto, e añadido el armado automático a un cierto tiempo además si está armada la alarma y se abre una puerta o capó se activa la sirena por un cierto tiempo en esta parte se puede añadir un relay que corte la alimentación de las bobinas para que no lo puedan encender el vehiculo, en mi caso no le pondré ya que se necesita la llave para poder encenderlo. Me falta añadir lo que es la luz de cortesía.

Ahora para lo que es los vidrios automáticos no se si sea mejor utilizar otro microcontrolador para controlar de forma individual cada ventana y añadir las protecciones para lo cual se utilizará 1 puente h para cada ventana o dos l298n para las 4 y que cada puente h lleve un sensor para medir el consumo como el ACS712 o ustedes que me recomiendan.

Adjunto el codigo que tengo hasta el momento:

/*Librerias*/
#include <Arduino.h>
#include <RCSwitch.h> //Libreria para control remoto.
/*Definiciones Entradas y Salidas */
const int sirena = 13,
          abrirBaul = 12,
          luzCortecia = 11,
          alertaIluminacion = 10,
          cerrarSeguros = 9,
          abrirSeguros = 8,
          ignicion = 7,
          velocidad = 6,
          botonValet = 5,
          pulsadorCapo = 4,
          pulsadorPuertas = 3,
          controlRadio = 2,
          subirVentanas = A4,
          bajarVentanas = A5;
RCSwitch mySwitch = RCSwitch();
/*Variables y Constantes*/
char comandos;
bool estadoIgnicion = 0,            // 0(Apagado) / 1(Prendido)
    estadobotonValed = 0,
    estadopulsadorCapo = 0,         // 0(Abierto) / 1(Cerrado)
    estadopulsadorPuertas = 0,      // 0(Abierto) / 1(Cerrado)
    armadoAutomatico = 0,
    armadoAlarma = 0,
    flagAlarma = 0,
    flagIluminacion = 0,
    flagSirena = 0,
    flagSeguros = 0,
    flagArmado = 0,
    estadoSirena = LOW;
long estadoControl = 0;
int estadoVelocidad = 0,
    contSirena = 0,
    blinkSirena = 0;
/* Temporizador (Millis) */
unsigned long tiempoInicial1;                         //Tiempo desactivacion de seguros
const unsigned long tiempoFuncional1 = 700;           //Tiempo desactivacion de seguros
unsigned long tiempoInicial2;                         // Tiempo Alerta iluminacion
const unsigned long tiempoFuncional2 = 1200;          // Tiempo Alerta iluminacion
unsigned long tiempoInicial3;                         // Tiempo Sirena
const unsigned long tiempoFuncional3 = 100;           // Tiempo Sirena
unsigned long tiempoInicial4;                         // Armado Automatico Alarma
const unsigned long tiempoFuncional4 = 10000;         // Armado Automatico alarma
unsigned long tiempoInicial5;                         // Activacion de Sirena y luces
const unsigned long tiempoFuncional5 = 10000;         // Activacion de Sirena y luces
void setup()
{
  Serial.begin(115200);
  pinMode(sirena, OUTPUT);
  pinMode(abrirBaul, OUTPUT);
  pinMode(luzCortecia, OUTPUT);
  pinMode(alertaIluminacion, OUTPUT);
  pinMode(cerrarSeguros, OUTPUT);
  pinMode(abrirSeguros, OUTPUT);
  pinMode(subirVentanas, OUTPUT);
  pinMode(bajarVentanas, OUTPUT);
  pinMode(ignicion, INPUT);
  pinMode(velocidad, INPUT);                        // Comprobar si es posible incluirlo
  pinMode(botonValet, INPUT);                       // Posiblemente NO
  pinMode(pulsadorCapo, INPUT);
  pinMode(pulsadorPuertas, INPUT);
  pinMode(controlRadio, INPUT);
  mySwitch.enableReceive(0);                        // pin 2 para control
}
void lecturaDatos()
{
  if (Serial.available() > 0)
  {
    comandos = Serial.read();
  }
  if (mySwitch.available())
  {
    estadoControl = mySwitch.getReceivedValue();
    if (estadoControl == 0)
    {
      Serial.println("error de codigo");
    }
    {
      Serial.print("codigo Recibido ");
      Serial.println(estadoControl);
    }
    mySwitch.resetAvailable();
  }
}
void pulsadores()
{
  estadoIgnicion = digitalRead(ignicion);
  estadoVelocidad = digitalRead(velocidad);
  estadobotonValed = digitalRead(botonValet);
  estadopulsadorCapo = digitalRead(pulsadorCapo);
  estadopulsadorPuertas = digitalRead(pulsadorPuertas);
}
void estadoSeguros(int estadoPuertas)
{
  digitalWrite(estadoPuertas, HIGH);

  tiempoInicial1 = millis();
  tiempoInicial2 = millis();
  flagSeguros = 1;
  if (estadoIgnicion == 0)
  {
    digitalWrite(alertaIluminacion, HIGH); // En caso de utilizar señal negativa para encender relay como alternativa utilizar un blink
    flagIluminacion = 1;
    flagSirena = 1;
  }
}
void loop()
{
  lecturaDatos();
  pulsadores();

  /*Control Automatico*/
  /*Armado Automatico 30 segundo */
  if ((estadoIgnicion == 0) && (estadoIgnicion == 0) && (armadoAutomatico == 0) && (estadopulsadorPuertas == 1) && (estadopulsadorCapo == 1))
  {
    if (millis() - tiempoInicial4 >= tiempoFuncional4)
    {
      estadoSeguros(cerrarSeguros);
      armadoAutomatico = 1; // Para evitar que se vuelva armar la alrma cada cierto tiempo.
      flagSirena = 3;       // Sonidos Armado de la Alarma.
      contSirena = 0;
    }
  }
  if ((estadopulsadorPuertas == 0) || (estadopulsadorCapo == 0) || (estadoIgnicion == 1)) // Mientras las puertas esten abiertas o el vehiculo encendido
  {
    tiempoInicial4 = millis();
  }
  if ((armadoAutomatico == 1) && ((estadopulsadorPuertas == 0) || (estadopulsadorCapo == 0)||(estadoIgnicion == 1))) // Alarma por apertura de puertas o capo
  {
    digitalWrite(sirena, HIGH);
    digitalWrite(alertaIluminacion, HIGH);
    flagAlarma = 1;
    tiempoInicial5 = millis();
  }
  /*Control Manual */
  // Radio control y comando bluetooth
  if (((estadoControl == 11227985) || comandos == 'a') && (flagSeguros == 0)) // Comando y codigo para abir puertas
  {
    estadoSeguros(abrirSeguros);
    if (estadoIgnicion == 0)
    {
      armadoAutomatico = 0;
      blinkSirena = 3;
      contSirena = 0;
      tiempoInicial4 = millis();
    }
  }
  if (((estadoControl == 11227986) || comandos == 'c') && (flagSeguros == 0)) // Comando y codigo para cerrar puertas
  {
    estadoSeguros(cerrarSeguros);
    if (estadoIgnicion == 0)
    {
      blinkSirena = 2;
      contSirena = 0;
      armadoAutomatico = 1;
    } 
  }
  if (((estadoControl == 11227988) || comandos == 'b') && (flagSeguros == 0)) // Comando y codigo para abir el baul
  {
    estadoSeguros(abrirBaul);
    if (estadoIgnicion == 0)
    {
      blinkSirena = 4;
      contSirena = 0;
    }
  }
  if ((flagSeguros == 1) && (millis() - tiempoInicial1 >= tiempoFuncional1)) // Desactivacion pines de seguros
  {
    digitalWrite(abrirSeguros, LOW);
    digitalWrite(cerrarSeguros, LOW);
    digitalWrite(abrirBaul, LOW);
    flagSeguros = 0;
  }
  if ((flagIluminacion == 1) && (millis() - tiempoInicial2 >= tiempoFuncional2)) // Desactivacion pines de alerta iluminacion
  {
    digitalWrite(alertaIluminacion, LOW);
    flagIluminacion = 0;
  }
  if ((flagSirena == 1) && (contSirena < blinkSirena)) // Blink Sirena (Optimizar si se puede)
  {
    if (millis() - tiempoInicial3 >= tiempoFuncional3)
    {
      tiempoInicial3 = millis();

      if (estadoSirena == LOW)
      {
        estadoSirena = HIGH;
      }
      else
      {
        estadoSirena = LOW;
        contSirena++;
      }
    }
    digitalWrite(sirena, estadoSirena);
  }
  if ((flagAlarma == 1) && (millis() - tiempoInicial5 >= tiempoFuncional5))
  {
    digitalWrite(sirena, LOW);
    digitalWrite(alertaIluminacion, LOW);
    flagAlarma = 0;
  }
  estadoControl = 0; // Limpieza de variables
  comandos = ' ';    // Limpieza de variables
}

Buenas a todos otra pequeña actualización, he añadido la luz de cortesía con un efecto fade-out sin la utilización de un ciclo for gracias a la explicación de IgnoranteAbsoluto les dejo el enlace por si alguien le interesa usar millis() junto con for() [SOLUCIONADO] - Software - Arduino Forum, ahora revisando las instalaciones me tope con que por donde detecta si alguna puerta está abierta que es una señal a gnd también la utiliza para encender la luz de cortesía y aqui es donde me perdi, RIG has visto alguna vez esto ya que las alarmas que e instalado tiene conexiones separadas tanto para detectar las puertas como para encender la luz de cortesía.También tenia la idea de llevar una señal de cada puerta, capo, baul, todo esto a la alarma e implementar una red Can-Bus con diferentes módulos o asu vez que muestre toda esta información en una pantalla algo parecido a esto DeLorean o Nissan 200sx S13.
Adjunto el código por si a alguien le interesa.

main.cpp (8.36 KB)

Disculpa el retraso, he andado muy ocupado y no me sobra tiempo ni para encender la pc...

por donde detecta si alguna puerta está abierta que es una señal a gnd también la utiliza para encender la luz de cortesía

Asi se utiliza cuando no cuentan indicador individual de puerta abierta, es decir solo indican que hay una puerta abierta pero no te dice cual, es un sistema sencillo que manda gnd a la luz de cortesia y al mismo tiempo al testigo de puerta como es tu caso. En el caso de la mayoría de los vehiculos modernos el sistema es un poco mas complejo: aqui todos los interruptores de puerta, capo y baul van conectados al BCM y este se encarga de encender y apagar la luz interior, hacer el fade out y mostrar si esta abierta alguna puerta o capo o baul ademas de indicar cual.
Como ves lo mas sencillo es unificar todos los interruptores de puerta y cualquier puerta que se abra enciende la luz interior y activa la alarma, si quieres mostrar en pantalla todas las puertas de forma individual tendras que conectar cada interruptor al arduino, pero ten en cuenta que ocuparas 6 puertos, de otro modo solo utilizas 2

Pues si utilizo todos las conexiones de la alarma original creo que ya me faltan pines del arduino uno en total seria 12:
Azul Amarillo = 12v
Blanco Negro = GND
Rosado verde = Sirena (+)
Rojo blanco = Detector de puertas y luz de cortecia
Morado amarillo = Pulsador de capo (-)
Azul rojo = Abre seguros (-)
Verde amarillo = Cierra seguros (-)
Amarillo verde = Señal de parada (-)
Negro amarillo = Ignición (+)
Verde rojo = Horn (-)
Rojo blanco = Luz de cortecia baúl (-)
Azul negro = Detector de llave (-)
Violeta blanco Velocidad ECU (+)
Con esto me faltaría el sensor de golpe, la comunicación por SPI para la comunicación con la red CAN pues creo que al utilizar un arduino mega los pines a ocupar no seria un problema.

Continuando con el proyecto tengo funcionando:

  • Armado automático cuando puertas, capo y baul se encuentran cerradas después de un cierto tiempo, se podría añadir para que excluya alguna puerta y a la vez emita una alerta.
  • La luz de cortesía realiza el efecto fade cuando el vehiculo se encuentra encendido y se abre alguna puerta, ademas de cuando se enciende el vehiculo.
  • Cierre de seguros segun la velocidad del vehiculo en la que se encuentre esta se la puede definir a una mayor velocidad sea el caso, para esto utilice el código de Nick Gammon específicamente el que utiliza el input capture pin 49 y cambien algunas partes para utilizar el timer 4 del arduino mega, con este código se puede leer frecuencias de hasta 200kHz.
  • Cuando se ordena mediante el control abrir alguna puerta o cerrarla, abrir baul utiliza la sirena como advertencia y cuando la alarma se encuentra armada y se abre alguna puerta empieza a sonar el claxon como advertencia, si se activa después de un determinado tiempo se apaga mientras se hayan cerrado las puertas o desactivado con el control.

Me gustaría saber como van con el proyecto, actualmente trabajo en un proyecto similar.
La idea es poder reconocer el conductor por medio de las tarjetas RFID.
me gustaría saber si han podido utilizar los controles Rolling code y si tienen alguna librería para poder usar los controles comerciales con los que vienen las alarmas.

No e tenido tiempo para seguir con el proyecto, me puse a revisar el código y ni yo mismo entiendo lo que hace jajaja por lo que no recomiendo utilizarlo, en cuando tenga mas tiempo lo mejorare y lo subire.
Ahora a lo que te refieres con las tarjetas RFID si es posible utilizarlas pero necesitas pero para ello lo primero seria conseguir el modulo y leer las tarjetas y validar estar tarjetas con arduino, una vez que logres hacer eso seguir con los demás aquí un tutorial: Lectura de Tarjetas RFID con arduino y lector mifare RC522.
No e tenido la posibilidad de encontrar controles para probar que algoritmo están utilizando o no me han querido prestar por que los utilizan, los únicos que e utilizado son los que tiene el EV1527 que según el datasheet: "tiene un máximo de 20 bits que proporciona hasta 1 millón de código. Puede reducir cualquier colisión de código y posibilidades de escaneo de código no autorizado"(traducido con traductor de google). Por lo cual en ese sentido no te puedo ayudar.

Eso pasa por no documentarlo.. me ocurre a mi tambien.
Cuando dejas un código debes comentar que has hecho porque los momentos de inspiración pocas veces se repiten.

Hola, soy nuevo en el foro, había olvidado postearte, se ve muy interesante tu proyecto, ojalá y pudieras seguir, éxito!

Hola a todos, retomando el proyecto después de un tiempo, no creo que se pueda conectar solo en modo pull-up como dice @RIG en el post #4 o bueno no solo con la resistencia pull-up habría que añadir uno que otro componente.
En el caso que el interruptor de la puerta fuera exclusivo para la alarma quedaría de la siguiente manera (ignoren los valores de la resistencia y la falta de un debounce):


Ahora ya que en la mayoría de vehículos el interruptor de las puertas es utilizado para encender una luz en el techo del mismo tendríamos lo siguiente:
Captura2
En este caso al interruptor de las puertas los 14V de la luz del techo(LED, halógenas, etc) llegarían al microcontrolador y al riel de 5V por la resistencia pull-up(corríjanme si me equivoco), esto se solucionaría colocando un diodo.
Ahora en me puse a hacer ingeniería inversa en una alarma dañada que tenia y tenían los siguientes circuitos:

  • Entradas de interruptores conectados a GND:
  • Entradas de interruptores conectados a GND o 14V Selección mediante Jumper:
    Captura4

En este caso al dañarse el diodo los 14V dirigirán al riel de 5V (Corríjanme si me equivoco) dañando todo lo que este conectados a este.

En el caso de dañarse el optoacoplador no hay forma de que los 14V lleguen al riel de 5v.

Si tienen alguna otra sugerencia de como podría implementarse esto o alguna sugerencia estaría muy agradecido.
Saludos a todos.

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.