Go Down

Topic: Proyecto de alarma para un coche (Read 273 times) previous topic - next topic

torke100

Jul 20, 2018, 02:24 pm Last Edit: Jul 20, 2018, 03:25 pm by torke100
Hola.
Estoy empezando, así que no seáis muy duros.
Lo pongo aquí para que le echéis un vistazo a ver si se puede mejorar, que seguro...

Code: [Select]


byte controlmovimiento=0;   // Define la variable controlmovimiento
byte controlchoque=0; // Define la variable controlchoque
byte volumetrico1=0; // Define la variable volumétrico1 con 8 bytes y valor 0
byte volumetrico2=0; // Define la variable volumétrico2 con 8 bytes y valor 0
byte choque=0;  // Define la variable choque con 8 bytes y valor 0
byte movimiento=0; // Define la variable movimiento con 8 bytes y valor 0


void setup() {
Serial.begin (9600);
pinMode (9,OUTPUT); // Define el pin 9 como salida
pinMode (10,OUTPUT); // Define el pin 10 como salida
}

void loop() {

volumetrico1=digitalRead(5); // Asigna el valor del pin 5 a la variable volumetrico1
volumetrico2=digitalRead(6); // Asigna el valor del pin 6 a la variable volumetrico2
movimiento=digitalRead(4); // Asigna el valor del pin 4 a la variable movimiento
choque=digitalRead(3);  // Asigna el valor del pin 5 a la variable choque

if (volumetrico1==HIGH)
{
  digitalWrite(9,HIGH); // enciende la alarma
  digitalWrite(10,HIGH); // enciende el testigo de la alarma (led)
  delay(45000); // espera aprox. un minuto sonando la alarma
  digitalWrite (9,LOW); // apaga la alarma
  volumetrico1=LOW; // asigna el valor apagado a la variable que controla el if
  Serial.println("volumetrico1 pin n 5"); // para controlar en el visor el funcionamiento
}

if (volumetrico2==HIGH) // igual que el anterior if pero con el otro sensor PIR
{
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  delay(45000);
  digitalWrite (9,LOW);
  volumetrico2=LOW;
  Serial.println("volumetrico2 pin n 6");
}


if ((choque==LOW) && (controlchoque<4))
{
  controlchoque++; // cuenta las veces que se activa la alarma por golpes
  digitalWrite(9,HIGH); // enciende la alarma
  digitalWrite(10,HIGH); // enciende el testigo de la alarma (led)
  delay(45000); // espera durante aprox. 1 minuto sonando la alarma
  digitalWrite(9,LOW); // apaga la alarma
  delay (30000); // espera durante medio minuto aprox. con la alarma apagada antes de volver a comprogar los sensores
  Serial.println ("choque pin n 3"); // para controlar en el visor
  choque=HIGH; // pone la variable que controla el if en valor bajo
}

if ((movimiento==HIGH) && (controlmovimiento<4)) // igual que el if de choque
{
  controlmovimiento++;
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  delay(45000);
  digitalWrite(9,LOW);
  delay (30000);
  Serial.println("movimiento pin n 4");
  movimiento=LOW;
}
}




El funcionamiento es fácil.
La alarma se activa por tres tipos de sensores (hay dos PIR)
Si se activan los PIR, es decir, mientras se detecta gente, la alarma sonará siempre.
Si se activa el movimiento o algún choque (golpe), la alarma sonará durante 1 minuto, parando durante medio minuto. Comprueba si sigue activado el sensor y vuelve a activarse. Esto lo hace cuatro veces y luego se desactiva.
El led indicador de que la alarma ha saltado no se apaga nunca una vez se ha activado. Así sabemos si se ha activado aunque ya esté apagada.
Saludos.

P.D.: He editado porque el sensor de choque funciona al contrario, es decir, arroja siempre ALTO excepto cuando se activa.

RIG

Pues tienes muchos fallos, la verdad no creo que tu codigo funcione,  revisa los comentarios que escribí en mayuscula donde decribo  algunos de los errores . Lo puse en mayúscula para que sea mas fácil de diferenciar de los comentarios tuyos

Code: [Select]


byte controlmovimiento=0;   // Define la variable controlmovimiento
byte controlchoque=0; // Define la variable controlchoque
byte volumetrico1=0; // <<< SI SOLO VAS A COMPROBAR ESTADO  0 o 1 PUEDES USAR BOOL EN LUGAR DE BYTE
byte volumetrico2=0; // Define la variable volumétrico2 con 8 bytes y valor  <<<< UNA VARIABLE DE TIPO BYTE ES DE 8 BITS NO 8 BYTES
byte choque=0;  // Define la variable choque con 8 bytes y valor 0
byte movimiento=0; // Define la variable movimiento con 8 bytes y valor 0


void setup() {         
Serial.begin (9600);
pinMode (9,OUTPUT); // Define el pin 9 como salida
pinMode (10,OUTPUT); // Define el pin 10 como salida
}    <<<<<< NO DECLARASTE LAS ENTRADAS DE LOS SENSORES

void loop() {

volumetrico1=digitalRead(5); // Asigna el valor del pin 5 a la variable volumetrico1
volumetrico2=digitalRead(6); // Asigna el valor del pin 6 a la variable volumetrico2
movimiento=digitalRead(4); // Asigna el valor del pin 4 a la variable movimiento
choque=digitalRead(3);  // Asigna el valor del pin 5 a la variable choque

if (volumetrico1==HIGH)  <<< NO ES NECESARIO ESE ==HIGH, con esto es suficiente: if(volumetrico1)
{
  digitalWrite(9,HIGH); // enciende la alarma
  digitalWrite(10,HIGH); // enciende el testigo de la alarma (led)
  delay(45000); // espera aprox. un minuto sonando la alarma    <<<< CON ESTOS DELAY DETIENES ABSOLUTAMENTE TODO Y NADA RESPONDERA HASTA QUE PASEN ESOS 45 SEGUNDOS, TIENES QUE USAR millis();  quitalos antes que muera un peludito cachorrito
   digitalWrite (9,LOW); // apaga la alarma
  volumetrico1=LOW; // asigna el valor apagado a la variable que controla el if  <<ESTO ESTA MAL, SI VOLUMETRICO1 ES UNA ENTRADA ¿PORQUE LO TRATAS COMO UNA SALIDA?
  Serial.println("volumetrico1 pin n 5"); // para controlar en el visor el funcionamiento
}

if (volumetrico2==HIGH) // igual que el anterior if pero con el otro sensor PIR
{
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  delay(45000);
  digitalWrite (9,LOW);
  volumetrico2=LOW;
  Serial.println("volumetrico2 pin n 6");
}


if ((choque==LOW) && (controlchoque<4))
{
  controlchoque++; // cuenta las veces que se activa la alarma por golpes
  digitalWrite(9,HIGH); // enciende la alarma
  digitalWrite(10,HIGH); // enciende el testigo de la alarma (led)
  delay(45000); // espera durante aprox. 1 minuto sonando la alarma
  digitalWrite(9,LOW); // apaga la alarma
  delay (30000); // espera durante medio minuto aprox. con la alarma apagada antes de volver a comprogar los sensores
  Serial.println ("choque pin n 3"); // para controlar en el visor
  choque=HIGH; // pone la variable que controla el if en valor bajo
}

if ((movimiento==HIGH) && (controlmovimiento<4)) // igual que el if de choque
{
  controlmovimiento++;
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  delay(45000);
  digitalWrite(9,LOW);
  delay (30000);
  Serial.println("movimiento pin n 4");
  movimiento=LOW;
}
}

mira en la documentacion sobre millis () para que sepas como quitar esos malvados delay de tu codigo
https://forum.arduino.cc/index.php?topic=502735.0
Trata de corregir esos fallos y plantea tus dudas
Salu2

torke100

#2
Jul 21, 2018, 11:11 am Last Edit: Jul 22, 2018, 04:40 pm by surbyte
Gracias. El código funciona. Está probado.
He repasado tus sugerencias y estoy de acuerdo. Voy a mirar si puedo replantearlo desde millis (), y de paso aprendo.
Pero yo realmente creo que en un programa de una alarma el DELAY puede cumplir su función toda vez que lo que queremos cuando se active algún sensor es que se salte la alarma durante un tiempo y que nada lo pueda parar.
Saludos

RIG

Quote
El código funciona. Está probado
Bien,  si dices que funciona que bueno...

Primero esto:
Quote
Lo pongo aquí para que le echéis un vistazo a ver si se puede mejorar, que seguro...
¿y despues esto?
Quote
Pero yo realmente creo que en un programa de una alarma el DELAY puede cumplir su función
Sin comentarios

torke100

Bueno, parece que molesto. Vaya!!!
Lo único que quería era aportar.
Adiós.

surbyte

#5
Jul 23, 2018, 02:52 pm Last Edit: Jul 23, 2018, 02:58 pm by surbyte
Todo código que use delay(45000) esta destinando en algún momento a fallar y si no falla como mínimo se pierde situaciones y eventos.

Ademas sigues con un delay(30000)!!

Ve a Documentación => Indice de temas tutoriales => Millis() y también lee máquina de estados.

Con esto quiero decir que hasta ahora tu alarma funciona como quieres, detecta una persona y se dispara un PIR 1 al 3 pero permanece el sistema ajeno a su entorno por 45+30 seg o sea 75 segundos.

Usar millis() y máquina de estados te permitirá estar atento a los 3 sensores volumetricos y a cualquier otro en el tiempo de un ciclo del loop(). Ves la diferencia de lo que planteo?

Ahora hablas del sensor de choque.. dime que ocurre si el sensor de choque debe activarse mientras un PIR este ejecutando su rutina? Pues no lo ve y tu chocas.

Ahi un ejemplo de lo que te digo al comienzo.



torke100

Gracias por contestar.
Mi idea inicial es que una vez inicie el código, el sistema está alerta para detectar el disparo de algún sensor. Si se activa un PIR, la alarma suena siempre 45 segundos. Si pasados esos 45 segundos el PIR continúa activo, la alarma sigue sonando. Esto lo que pretende es que si alguien se introduce en el habitáculo del vehículo, suene la alarma hasta que se vaya. Sonará siempre.

Sin embargo, si lo que se activa es el sensor de choque o movimiento (un porrazo en un cristal, un golpe en el coche o que lo suban a una grúa) la alarma suena durante 45 segundos seguidos. Luego se para medio minuto. Comprueba de nuevo algún sensor para volver a sonar al menos, otros 45 segundos. Este ciclo lo hace 4 veces (con sensor choque o movimiento), para luego dejar de activarse por estos sensores.
El motivo de diferenciar entre volumétrico y choque o movimiento está claro. Imaginamos alguna de las situaciones reales, por ejemplo, una grúa llevándose el coche. La alarma sonará (lo que queremos si la grúa es de un ladrón) pero sólo cuatro veces para pararse luego definitivamente (lo que esperamos si es la grúa de la policía) Igual con el del choque o cualquier otro sensor que puede quedar activo (puertas abiertas...)

Pero sí. Llevas razón. Estoy intentando replantear el programa con millis (), al menos el retardo de espera de 30 segundos.
La razón es que durante el retardo de 45 segundos en el que la alarma está sonando, lo cierto es que creo que es irrelevante el que el sistema esté activo o inactivo: la alarma suena, la alerta está en marcha, luego no hace falta que el programa haga nada más.

Pero lo del retraso en los 30 segundos de inactividad total y espera es mejorable seguro. Intentaré con millis()

Respecto al sensor de choque (o movimiento), si el PIR está activado y la alarma sonando, no añade nada si se activa o no, porque lo que hacen todos es activar la alarma.

No pretendo llevar razón, lo que quiero es argumentar y contra-argumentar. Es la forma de aprender, ¿no?

Gracias de nuevo por tu interés y tu aporte.

surbyte

Yo no hablé de razones, hable que estas en una fase inicial de tu idea y cuando tu proyecto crezca te vas a encontrar con un camino sin retorno por culpa de los delays. Te aconsejo que leas hilos y verás como vivimos diciendo que no usen delay().

Ahora el uso de millis() provoca incialmente un NO ENTIENDO NADA pero tomate tu tiempo y mira las cosas simples. Domina lo simple para luego ir a cosas mas complejas como la maquina de estados.
Si no eres programador no tienes la cabeza entrenada para entender eso y te llevará un tiempo hacer ese cambio.

Swift

Hola, yo tambien estoy haciendo una alarma para un coche y te planteo algunos problemas que e visto:
  • En caso de que la alarma se active por equivocación está igual va a seguir sonando ya que no has implementado ninguna forma de desactivarla o como piensas hacer esto?
  • Si tu estas conduciendo como piensas desactivarla para que estos sensores no se activen y empiece a sonar mientras el vehiculo este en movimiento?
  • Si vas a implementar más funciones los delay van a ser un problema como ya te lo han dicho en este enlace hay un ejemplo con millis y leds para que entiendas como funciona 

torke100

Hola.
Gracias de nuevo.

Como dije, ya estoy replanteando todo desde millis(). De hecho, he avanzado más de lo que creía. Cuando lo tenga, lo subiré.

Respecto a los problemas que me dice Swift los tengo solventados con los relés de activación de la placa. Luego lo explicaré mejor cuando tenga todo e intentaré subir un esquema, pero básicamente lo que he diseñado es la entrada de la señal de cierre de la puerta (todo con diodos de protección) para que active un relé que se retroalimente a través de otro relé que así mismo se desactiva con la señal de apertura de la puerta. El primero es el que alimenta a arduino. Es aquí donde intercalaré un botón de desactivación manual.

El sistema sólo estará encendido cuando se cierren las puertas y el contacto esté apagado (otro relé intercalado en la alimentación al primer relé que se desactiva al poner el contacto)

Arduino sólo debe detectar los sensores y activar la alarma de las distintas formas que yo quiero. Y con todos lo sensores que me interese poner.

Saludos


Go Up