Étape 5: Code d’Arduino
Pour les communications IR j’ai utilisé la bibliothèque IRemote pour Arduino. Pour télécharger depuis github (http://github.com/shirriff/Arduino-IRremote), cliquez sur le lien "Téléchargements" en haut à droite, cliquez sur "Télécharger zip" et obtenir un fichier zip. Décompressez-le et renommez le répertoire shirriff-Arduino-IRremote-nnn IRremotePour le RTC DS1302 j’ai utilisé la bibliothèque suivante pour Arduino : https://github.com/msparks/arduino-ds1302
Pour produire le signal sonore sortie audio que j’utilise la bibliothèque SPI.h Arduino standard. Pour plus d’informations, voir http://arduino.cc/en/Reference/SPI
#include < stdio.h >
#include < string.h >
#include < DS1302.h >
#include < SPI.h >
#include < IRremote.h >
/ * Définir les connexions de broche e/s numériques appropriées pour le module RTC * /
uint8_t CE_PIN = 4 ;
uint8_t IO_PIN = 10 ;
uint8_t SCLK_PIN = 8 ;
#define RTC5vPin 5 / / cette broche servira à fournir + 5v au CCF
#define RTCgndPin 6 / / cette broche servira à fournir GND au CCF
#define PIEZO_PIN 11
/ * Créer des tampons * /
char buf [50] ;
jour de char [10] ;
IRsend irsend ;
/ * Créer un objet RTC DS1302 * /
Rtc DS1302 (CE_PIN, IO_PIN, SCLK_PIN) ;
Codes SAMSUNG TV Power on/off (changer cela pour correspondre à vos codes de télécommande)
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};
Son Surround LG (changer cela pour correspondre à vos codes de télécommande)
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 ; le temps de nous donner le capteur à étalonner (10 à 60 secondes selon la fiche technique)
unsigned long int lowIn ; le temps quand le capteur génère une impulsion faible
unsigned long int pause = 3000 ; la durée en millisecondes, que le capteur doit être faible avant que nous assumons tous les mouvement a cessé
override booléen = false ;
Boolean lockLow = true ;
Boolean takeLowTime ;
int pirPin = 3 ; La broche numérique connectée à la sortie du capteur PIR
int ledPin = 13 ; LED à bord est raccordée à une LED rouge externe
int maxSecs = 300 ; Temps Max pour aucun mouvement avant nous éteindre la TV
Le modifier selon vos propres besoins (par défaut 5 minutes)
int overrideStartHour = 19 ; Quelle heure la fenêtre override
int overrideEndHour = 23 ; Quelle heure pour mettre fin à la fenêtre de remplacement
int currentSecs = 0 ; Compteur global
Tiges de vert et de YELLO LED
int greenLedPin = 12 ;
int yellowLedPin = 2 ;
int yellowState = 0 ;
void setup() {}
Serial.Begin(9600) ;
pinMode (RTC5vPin, sortie) ; définit la goupille pour haut rendement
digitalWrite (RTC5vPin, élevé) ; tourne broche sur 5 (v) au pouvoir RTC
pinMode (RTCgndPin, sortie) ; Jeux de broches pour la sortie
digitalWrite (RTCgndPin, basse) ; tourne broche sur LOW (GND) au pouvoir RTC
pinMode (sortie 11) ; Jeux de Pin 11 pour la sortie
digitalWrite (11, faible) ; tourner la broche 11 sur LOW (GND) au pouvoir RTC
pinMode (pirPin, entrée) ; initialiser la goupille de détection PIR État comme entrée
pinMode (ledPin, sortie) ; initialiser la broche LED embarquée comme entrée
digitalWrite (pirPin, basse) ; Commencez par aucun mouvement
pinMode(greenLedPin,OUTPUT) ;
digitalWrite (greenLedPin, basse) ;
pinMode(yellowLedPin,OUTPUT) ;
digitalWrite (yellowLedPin, basse) ;
yellowState = 0 ;
/*
Initialisez une nouvelle puce en désactivant la protection contre l’écriture et la compensation des
horloge cesser le drapeau. Ces méthodes ne doivent pas toujours être appelées. Voir le DS1302
Fiche technique pour plus de détails.
ONU-commenter le code ci-dessous à mettre en place une nouvelle puce de CCF. Une fois lancé vous devez
commenter l’article du code à nouveau.
*/
RTC.write_protect(false) ;
RTC.Halt(false) ;
Temps t (2013, 7, 7, 14, 45, 0, 0) ; Créez un nouvel objet de temps pour définir la date et l’heure
RTC.Time(t) ; Définir la date et l’heure sur la puce
RTC.write_protect(true) ;
donner le capteur PIR quelque temps à étalonner
Serial.Print ("calibrage capteur") ;
pour (int i = 0; i < calibrationTime; i ++) {}
Serial.Print(".") ;
Delay(1000) ;
}
Serial.println ("terminé") ;
Serial.println ("capteur actif") ;
Delay(50) ;
réinitialiser le compteur global
currentSecs = maxSecs ;
StartupBeep() ;
}
void StartupBeep() {}
Tone(PIEZO_PIN,4978,2000) ;
Delay(100) ;
noTone(PIEZO_PIN) ;
}
////////////////////////////
BOUCLE
void loop() {}
/ * Obtenir l’heure actuelle et la date de la puce * /
Temps t = rtc.time() ;
/ * Nom du jour de la semaine * /
memset (jour, 0, sizeof(day)) ; / * effacer tampon jour * /
/ * Format de l’heure et la date et l’insérer dans la mémoire tampon temporaire * /
snprintf (buf, sizeof(buf), "%s 04D-02d-% 02d % 02d: % 02d: % 02d",
jour,
t.YR, t.mon, t.date,
t.hr, t.min, t.sec) ;
/ * La chaîne mise en forme à la série d’impression afin que nous pouvons voir le temps * /
Serial.Print(BUF) ;
Serial.Print ("-") ;
Serial.Print ("(hr:") ;
Serial.Print(t.hr) ;
Serial.Print(")") ;
Si (t.hr > = overrideStartHour & & t.hr < = overrideEndHour) {}
Substituez = true ;
Serial.println("Disabled") ;
} else {}
Serial.println("enabled") ;
Substituez = false ;
}
Si (remplacer)
{
digitalWrite (greenLedPin, HIGH) ;
}
d’autre
{
digitalWrite (greenLedPin, basse) ;
}
Si (! substituer) {}
currentSecs = (currentSecs - 1) ;
Serial.println(currentSecs) ;
Si (currentSecs < = 30) {}
Si (yellowState == 1) {}
digitalWrite (yellowLedPin, HIGH) ;
yellowState = 0 ;
noTone(PIEZO_PIN) ;
}
d’autre
{
digitalWrite (yellowLedPin, basse) ;
yellowState = 1 ;
Si (currentSecs > = 25) {}
Serial.println("Beeping!") ;
Tone(PIEZO_PIN,4978,1000) ;
}
}
}
Si (currentSecs < = 0) {}
temps Max pour aucun mouvement atteint, éteindre le téléviseur !
Serial.println ("ainsi off TV!") ;
toggleSamsungTV() ;
}
}
detectmotion() ;
Delay(1000) ;
}
void check_time() {}
/ * Obtenir l’heure actuelle et la date de la puce * /
Temps t = rtc.time() ;
/ * Nom du jour de la semaine * /
memset (jour, 0, sizeof(day)) ; / * effacer tampon jour * /
/ * Format de l’heure et la date et l’insérer dans la mémoire tampon temporaire * /
snprintf (buf, sizeof(buf), "%s 04D-02d-% 02d % 02d: % 02d: % 02d",
jour,
t.YR, t.mon, t.date,
t.hr, t.min, t.sec) ;
/ * La chaîne mise en forme à la série d’impression afin que nous pouvons voir le temps * /
Serial.Print(BUF) ;
Serial.Print ("-") ;
Si (t.hr > overrideStartHour & & t.hr < overrideEndHour) {}
Substituez = true ;
Serial.println("Disabled") ;
} else {}
Serial.println("enabled") ;
Substituez = false ;
}
}
void detectmotion() {}
if(digitalRead(pirPin) == HIGH) {}
digitalWrite (ledPin, HIGH) ; le voyant lumineux visualise l’état de broche de sortie de capteurs
currentSecs = maxSecs ;
digitalWrite (yellowLedPin, basse) ;
yellowState = 0 ;
{if(lockLow)}
fait en sorte de que nous attendre pour une transition vers le bas avant n’importe quelle autre sortie est faite :
lockLow = false ;
Serial.println("---") ;
Serial.Print ("mouvement détecté à") ;
Serial.Print(Millis()/1000) ;
Serial.println (« sec ») ;
Delay(50) ;
}
takeLowTime = true ;
}
if(digitalRead(pirPin) == faible) {}
digitalWrite (ledPin, basse) ; le voyant lumineux visualise l’état de broche de sortie de capteurs
{if(takeLowTime)}
lowIn = millis() ; économiser le temps de la transition entre la haute et basse
takeLowTime = false ; Veillez à ce que cela se fait uniquement au début d’une phase de faible
}
Si le capteur est faible plus la pause donnée,
Nous partons du principe qu’aucun mouvement plus ne va se passer
Si (! lockLow & & millis() - lowIn > pause) {}
fait bien sûr ce bloc de code est exécuté uniquement après
une nouvelle séquence de mouvement a été détectée
lockLow = true ;
Serial.Print ("requête s’est terminée à ») ; sortie
Serial.Print((Millis() - pause) / 1000) ;
Serial.println (« sec ») ;
Delay(50) ;
}
}
}
void toggleSamsungTV() {}
éteindre la TV avec le diffuseur infrarouge
répéter la transmission 3 fois pour être sûr !
pour (int i = 0; i < 3; i ++) {}
irsend.sendRaw(S_pwr,68,38) ;
Serial.println ("envoyé SAMSUNG POWER ON/OFF") ;
irsend.sendRaw(LG_pwr,68,38) ;
Serial.println ("envoyé LG POWER ON/OFF") ;
Delay(40) ;
}
réinitialiser le compteur global
currentSecs = maxSecs ;
}