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.
// 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