Go Down

Topic: Contador de presencia (Read 3 times) previous topic - next topic

tiozes

Buenas a todos, estoy montando una alarmar y se como hacer para que salte cuando detecta movimiento y hasta ahi de momento bien, ahora quiero conectar un sensor Pir al arduino y que me valla sumando cada vez que detecte movimiento para asi saber si salta con el perro que tengo e intentar regular la sensibilidad para que con el perro no salte.

He buscado ejemplos y no he dado con ninguno que me sirva lo mas cercano ha sido un video y nada de la programacion, en uno de los manuales que tengo pone usar X++ para sumar uno, pero no trae ejemplo y creo que lo hago mal.

Code: [Select]
// Alarma Chalet
#include <Wire.h>                   // Libreria para I2C
#include <LiquidCrystal_I2C.h>      // Libreria para LCD
#define DS1307_I2C_ADDRESS 0x68     // Direccion bus Reloj

LiquidCrystal_I2C lcd(0x27,16,2);  // Direccion de bus pantalla

const int pir1 = 4;            // Pin de entrada señal Pir 1

const int ledEstado = 13;      // Led en pin 13 salto Pir 1 y Pir 2
int estadoPir1 = 0;            // Estado de Pir 1 "0"


byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.send(0);
   Wire.send(decToBcd(second));   
   Wire.send(decToBcd(minute));
   Wire.send(decToBcd(hour));     
   Wire.send(decToBcd(dayOfWeek));
   Wire.send(decToBcd(dayOfMonth));
   Wire.send(decToBcd(month));
   Wire.send(decToBcd(year));
   Wire.endTransmission();
}

// Establece la fecha y la hora del reloj
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  // Resetea el registro puntero
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // Alguno de estos necesitan enmascarar porque ciertos bits son bits de control   

  *second     = bcdToDec(Wire.receive() & 0x7f);
  *minute     = bcdToDec(Wire.receive());
  *hour       = bcdToDec(Wire.receive() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.receive());
  *dayOfMonth = bcdToDec(Wire.receive());
  *month      = bcdToDec(Wire.receive());
  *year       = bcdToDec(Wire.receive());
}

void setup()

{
  lcd.init();                  // Inicializacion LCD
  pinMode(ledEstado, OUTPUT);  // Funcion de salida LedEstado pin 13
  pinMode(pir1, INPUT);        // Funcion de entrada Pir 1 pin 2

 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
 
 

  // la primera vez debemos poner en hora, active esta parte y luego vuelva a quitarla
  /*second = 00;
  minute = 33;
  hour = 15;
  dayOfWeek = 6;
  dayOfMonth = 11;
  month = 2;
  year = 12;
 
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); */
   
 
}

void loop()
{
 
   lcd.backlight();             // Iluminacion LCD
   lcd.setCursor(0,0);          // Seleccionamos posicion del cursor
   
 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 

  lcd.setCursor(6,0);
    lcd.print(year, DEC);
  lcd.setCursor(2,0);
  lcd.print("/");
  lcd.setCursor(3,0);
    if (month < 10) lcd.print("0");
  lcd.print(month, DEC); 
  lcd.setCursor(5,0);
  lcd.print("/");   
  lcd.setCursor(0,0);
    if (dayOfMonth < 10) lcd.print("0");
  lcd.print(dayOfMonth, DEC);
  lcd.print("");
  lcd.setCursor(0,1);
    if (hour < 10) lcd.print("0");
  lcd.print(hour, DEC);
  lcd.setCursor(2,1);
  lcd.print(":"); 
  lcd.setCursor(3,1);
    if (minute < 10) lcd.print("0");
  lcd.print(minute, DEC);
  lcd.setCursor(5,1);
  lcd.print(":");
    if (second < 10) lcd.print("0");
  lcd.print(second, DEC); 
 
     switch (dayOfWeek)
   
    {
     
    case 1:
      lcd.setCursor(9,0);
      lcd.print("Lunes");
      break;
    case 2:
      lcd.setCursor(9,0);
      lcd.print("Martes");
      break;
    case 3:
      lcd.setCursor(9,0);
      lcd.print("Miercoles");
      break;
    case 4:
      lcd.setCursor(9,0);
      lcd.print("Jueves");
      break;
    case 5:
      lcd.setCursor(9,0);
      lcd.print("Viernes");
      break;
    case 6:
      lcd.setCursor(9,0);
      lcd.print("Sabado");
      break;
    case 7:
      lcd.setCursor(9,0);
      lcd.print("Domingo");
      break;
   }
   
   

  delay(1000); //Pausa durante 1 segundo
 
 
 
  estadoPir1 = digitalRead(pir1);  // Leer estado Pir 1

 
  lcd.backlight();             // Iluminacion LCD
  lcd.setCursor(9,1);          // Seleccionamos posicion del cursor
  int x=0;

  if (estadoPir1 == HIGH) {        // Si esta sl sensor Pir 1 activado activa led Pin 13
  digitalWrite(ledEstado, HIGH);    //Pone led Estado pin 13 a nivel alto
  int x=++;     // Se inicia bucle cuenta atras desde 35s
  lcd.print(x);               // Se imprime bucle en puerto serie
  lcd.setCursor (9,1);            // Se establece el curso en el LCD
  lcd.print(x);                    // Se imprime el valor de x por donde va.
     
     
     
   
 
  }

  else {                           // Si no se da las condiciones anteriores pone led Estado a nivel bajo
  digitalWrite(ledEstado, LOW);
   
   
       
     

 
     
}
}


Esta es una de las formas que he probado medio sacado de otro proyecto a ver si conseguia enteder algo o hacer funcionar algo y nada, cuando detecta movimiento parece en el 0, 1, 2 depende de cuandos x=++ ponga o como ahora se pone a contar como un loco en cuanto detecta movimiento una sola vez.


Saludoss

jorgepl

Creo que para lo que intentas hacer, necesitas plantearlo de otra manera.

Ahora mismo, en cada ejecución del loop() compruebas si se ha detectado presencia o no, y si es así, pones la variable x a 1 (o a 2 o a 3 depende de los x++ que pongas dentro del if) pero al volver a ejecutar el loop vuelves a inicializar la variable a o (int x=0).

Lo que tendrías que hacer es comprobar cuando se detecta presencia y cuando se deja de detectar, es decir, cuando estadoPir pasa de HIGH a LOW (para eso deberías guardar su estado en otra variable del tipo estadoPir_anterior y compararlos), y entonces aumentar el contador (x), además x debe ser variable global para que su valor no se reinicie cada vez que ejecuta el loop.

Cheyenne

Yo la verdad que no entiendo muy bien este tipo de discriminación. Vamos, que como entre un ladrón y haga un par de paseitos como el del perro va a poder robar la casa tranquilamente.

jorgepl

#3
Jun 27, 2012, 09:59 am Last Edit: Jun 27, 2012, 10:01 am by jorgepl Reason: 1

Yo la verdad que no entiendo muy bien este tipo de discriminación. Vamos, que como entre un ladrón y haga un par de paseitos como el del perro va a poder robar la casa tranquilamente.


Es verdad, no creo que con el detector Pir se pueda discriminar entre un perro y una persona, ya que la detección es booleana (0 o 1) y un perro puede hacer casi cualquier cosa.

De todas maneras, te he modificado tu código para incluir la idea que te comentaba del contador de presencia:
Code: [Select]

// Alarma Chalet
const int pir1 = 4;             // Pin de entrada señal Pir 1
const int ledEstado = 13;       // Led en pin 13 salto Pir 1 y Pir 2

int estadoPir1 = 0;             // Estado de Pir 1
int estadoPir1_anterior = 0;    // Estado de Pir 1
int contadorPresencia = 0;      // Contador de presencias detectadas

void setup()

{
  pinMode(ledEstado, OUTPUT);  // Funcion de salida LedEstado pin 13
  pinMode(pir1, INPUT);        // Funcion de entrada Pir 1 pin 2
}

void loop()
{
  estadoPir1 = digitalRead(pir1);  // Leer estado Pir 1

  // Led se enciende durante la detección de presencia
  if (estadoPir1 == HIGH)
    digitalWrite(ledEstado, HIGH);  //Pone led Estado pin 13 a nivel alto
  else
    digitalWrite(ledEstado, LOW);   //Pone led Estado pin 13 a nivel bajo
   
  // Contador histórico de presencias detectadas
  if (estadoPir1 == LOW && estadoPir1_anterior == HIGH)
    contadorPresencia++;
  estadoPir1_anterior = estadoPir1;
}
}


tiozes

Muchas gracias compañeros, los sensores tienen un potenciometro para cambiar la sensibilidad, entonces quiero ponerlo un par de dias a ver si puedo ajustarlo para que no salte con el perro y gatos, entonces habia pensado en montarlo de esta manera.


Cuando llegue a casa cargo el codigo a ver que tal me va.

Muchas gracias jorgepl

Go Up