Paso 5: Código de Arduino
Para las comunicaciones de IR utilicé la biblioteca IRemote para Arduino. Para descargar desde github (http://github.com/shirriff/Arduino-IRremote), haga clic en el enlace "Descargas" en la parte superior derecha, haga clic en "Descargar como zip" y obtener un archivo zip. Descomprimir y renombrar el directorio shirriff-Arduino-IRremote-nnn a IRremotePara el DS1302 RTC utilicé la siguiente biblioteca para Arduino: https://github.com/msparks/arduino-ds1302
Para producir el sonido salida de sonido que utilice la biblioteca estándar de SPI.h Arduino. Para más detalles ver http://arduino.cc/en/Reference/SPI
#include < stdio.h >
#include < string.h >
#include < DS1302.h >
#include < SPI.h >
#include < IRremote.h >
/ * Establecer las conexiones apropiadas digitales del pin de I/O para el módulo RTC * /
CE_PIN de uint8_t = 4;
uint8_t IO_PIN = 10;
SCLK_PIN de uint8_t = 8;
#define RTC5vPin 5 / / se utilizará para proporcionar este pin + 5v a la RTC
#define RTCgndPin 6 / este pin se utiliza para proporcionar tierra a la RTC
#define PIEZO_PIN 11
/ * Crear búferes * /
char buf [50];
día del Char [10];
Irsend de IRsend;
/ * Crear un objeto DS1302 RTC * /
DS1302 rtc (CE_PIN, IO_PIN, SCLK_PIN);
Códigos SAMSUNG TV Power ON/OFF (cambiar esto para que coincida con los códigos de control remotos)
unsigned int S_pwr[68]={ 4400,4550,500,1750,500,1750,500,1750,450,650,500,600,500,600,500,650,500,600,500,1750,450,1750,500,1750,500,600,500,600,500,650,500,600,500,600,500,650,500,1750,450,650,500,600,500,600,500,650,500,600,500,600,500,1750,500,600,500,1750,500,1750,500,1750,450,1750,500,1750,500,1750,450};
Sonido envolvente de LG (cambiar esto para que coincida con los códigos de control remotos)
unsigned int LG_pwr[68]={ 4350,4550,500,600,500,600,500,1750,450,1750,500,600,500,1750,450,600,500,650,450,650,500,600,500,1750,450,1750,450,650,500,1700,500,600,500,650,450,650,450,1800,450,1750,450,1750,450,1750,500,600,500,600,500,600,500,1750,500,600,500,600,500,600,500,650,450,1750,500,1750,450,1750,450};
int calibrationTime = 30; el tiempo nos da el sensor a calibrar (10 a 60 segundos según la hoja de datos)
tiempo unsigned int lowIn; el momento cuando el sensor produce un impulso de baja
pausa larga unsigned int = 3000; la cantidad de milisegundos que el sensor tiene que ser baja antes de que asuma todo el movimiento se ha detenido
anulación boolean = false;
Boolean lockLow = true;
takeLowTime Boolean;
pirPin int = 3; El pin digital conectado a la salida del sensor PIR
int ledPin = 13; LED a bordo está conectado a un LED rojo externo
int maxSecs = 300; Tiempo máximo para ningún movimiento antes de que apague el televisor
Cambiar esto para satisfacer sus propias necesidades (por defecto 5 minutos)
int overrideStartHour = 19; Que hora en la ventana de anulación
int overrideEndHour = 23; Que hora para poner fin a la ventana de anulación
int currentSecs = 0; Contador global
Patillas verde y LED YELLO
int greenLedPin = 12;
int yellowLedPin = 2;
int yellowState = 0;
void setup() {}
Serial.Begin(9600);
pinMode (RTC5vPin, salida); conjuntos de perno para alto rendimiento
digitalWrite (RTC5vPin, alto); Gire el pasador en (5v) al poder RTC
pinMode (RTCgndPin, salida); establece el Pin de salida
digitalWrite (RTCgndPin, bajo); Gire el pasador en bajo (GND) al poder RTC
pinMode (11, salida); establece el Pin 11 de salida
digitalWrite (11, bajo); Gire el pasador 11 bajo (GND) al poder RTC
pinMode (pirPin, entrada); Inicializa el pin de detección PIR estado como entrada
pinMode (ledPin, salida); Inicializa el pin LED a bordo como entrada
digitalWrite (pirPin, LOW); empezar con ningún movimiento
pinMode(greenLedPin,OUTPUT);
digitalWrite (greenLedPin, bajo);
pinMode(yellowLedPin,OUTPUT);
digitalWrite (yellowLedPin, bajo);
yellowState = 0;
/*
Inicializar un nuevo chip por apagar la protección contra escritura y claro el
reloj detener la bandera. Estos métodos no necesitan siempre ser llamados. Ver el DS1302
hoja de datos para obtener más información.
Un Comentario en el código siguiente para crear un nuevo chip RTC. Una vez ejecutado necesita
Comentario de la sección de código nuevo.
*/
RTC.write_protect(false);
RTC.HALT(false);
Tiempo t (2013, 7, 7, 14, 45, 0, 0); Crear un nuevo objeto de tiempo para establecer la fecha y hora
RTC.Time(t); Ajustar la hora y fecha en el chip
RTC.write_protect(true);
dar el sensor de PIR algún tiempo a calibrar
Serial.Print ("calibración sensor");
para (int i = 0; i < calibrationTime; i ++) {}
Serial.Print(".");
Delay(1000);
}
Serial.println ("hecho");
Serial.println ("SENSOR activo");
Delay(50);
el contador global
currentSecs = maxSecs;
StartupBeep();
}
void StartupBeep() {}
Tone(PIEZO_PIN,4978,2000);
Delay(100);
noTone(PIEZO_PIN);
}
////////////////////////////
LAZO
void loop() {}
/ * Obtener la hora actual y la fecha desde el chip * /
Tiempo t = rtc.time();
/ * Nombre del día de la semana * /
memset (día, 0, sizeof(day)); / * borrar el búfer de día * /
/ * Inserte en el búfer temporal y el formato de la hora y fecha * /
snprintf (buf, sizeof(buf), "%s % d 04-02d-% 02d % 02d: % 02d: % 02d",
día,
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
/ * Imprime la cadena con formato a la serie para que podamos ver el tiempo * /
Serial.Print(BUF);
Serial.Print ("-");
Serial.Print ("(hr:");
Serial.Print(t.hr);
Serial.Print(")");
Si (t.hr > = overrideStartHour & & t.hr < = overrideEndHour) {}
anular = true;
Serial.println("Disabled");
} else {}
Serial.println("Enabled");
anular = false;
}
Si (reemplazar)
{
digitalWrite (greenLedPin, HIGH);
}
otra cosa
{
digitalWrite (greenLedPin, bajo);
}
Si (! anular) {}
currentSecs = (currentSecs - 1);
Serial.println(currentSecs);
Si (currentSecs < = 30) {}
Si (yellowState == 1) {}
digitalWrite (yellowLedPin, HIGH);
yellowState = 0;
noTone(PIEZO_PIN);
}
otra cosa
{
digitalWrite (yellowLedPin, bajo);
yellowState = 1;
Si (currentSecs > = 25) {}
Serial.println("Beeping!");
Tone(PIEZO_PIN,4978,1000);
}
}
}
Si (currentSecs < = 0) {}
máximo tiempo para ningún movimiento, apague la TV!
Serial.println ("Swithcing televisor!");
toggleSamsungTV();
}
}
detectmotion();
Delay(1000);
}
void check_time() {}
/ * Obtener la hora actual y la fecha desde el chip * /
Tiempo t = rtc.time();
/ * Nombre del día de la semana * /
memset (día, 0, sizeof(day)); / * borrar el búfer de día * /
/ * Inserte en el búfer temporal y el formato de la hora y fecha * /
snprintf (buf, sizeof(buf), "%s % d 04-02d-% 02d % 02d: % 02d: % 02d",
día,
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
/ * Imprime la cadena con formato a la serie para que podamos ver el tiempo * /
Serial.Print(BUF);
Serial.Print ("-");
Si (t.hr > overrideStartHour & & t.hr < overrideEndHour) {}
anular = true;
Serial.println("Disabled");
} else {}
Serial.println("Enabled");
anular = false;
}
}
void detectmotion() {}
if(digitalRead(pirPin) == HIGH) {}
digitalWrite (ledPin, HIGH); el led visualiza el estado de pin de salida de sensores
currentSecs = maxSecs;
digitalWrite (yellowLedPin, bajo);
yellowState = 0;
{if(lockLow)}
se cerciora de que esperamos una transición a la baja antes de cualquier salida de más:
lockLow = false;
Serial.println("---");
Serial.Print ("movimiento detectado en");
Serial.Print(Millis()/1000);
Serial.println ("sec");
Delay(50);
}
takeLowTime = true;
}
if(digitalRead(pirPin) == LOW) {}
digitalWrite (ledPin, LOW); el led visualiza el estado de pin de salida de sensores
{if(takeLowTime)}
lowIn = millis(); ahorrar el tiempo de la transición de alto a bajo
takeLowTime = false; Asegúrese de que esto sólo se hace en el inicio de una fase
}
Si el sensor está bajo más de la pausa dada,
asumimos que no hay movimiento más va a pasar
Si (! lockLow & & millis() - lowIn > pausa) {}
hace que este bloque de código es sólo se ejecuta después de
se ha detectado una nueva secuencia de movimiento
lockLow = true;
Serial.Print ("movimiento terminada en"); salida
Serial.Print((Millis() - pausa) / 1000);
Serial.println ("sec");
Delay(50);
}
}
}
void toggleSamsungTV() {}
Apague el TV con el emisor de infrarrojos
repetir la transmisión 3 veces para estar seguro!
para (int i = 0; i < 3; i ++) {}
irsend.sendRaw(S_pwr,68,38);
Serial.println ("enviada SAMSUNG POWER ON/OFF");
irsend.sendRaw(LG_pwr,68,38);
Serial.println ("enviado LG POWER ON/OFF");
Delay(40);
}
el contador global
currentSecs = maxSecs;
}