Hem underhållning Auto Power-down (HEAP Controller) (5 / 7 steg)
Steg 5: Arduino kod
För IR-kommunikation använde jag IRemote bibliotek bibliotek för Arduino. För att ladda ner från github (http://github.com/shirriff/Arduino-IRremote), klickar du på länken "Downloads" i det övre högra hörnet, klicka på "Ladda ner som zip" och få en zip-fil. Packa upp den och byta namn på katalogen shirriff-Arduino-IRremote-nnn till IRremoteFör DS1302 RTC jag använde följande bibliotek för Arduino: https://github.com/msparks/arduino-ds1302
För att producera Signalgivare utgång ljud jag använder standard SPI.h Arduino bibliotek. För mer information se http://arduino.cc/en/Reference/SPI
#include < stdio.h >
#include < string.h >
#include < DS1302.h >
#include < SPI.h >
#include < IRremote.h >
/ * Ange lämplig digital I/O stift anslutningarna för RTC-modulen * /
uint8_t CE_PIN = 4;
uint8_t IO_PIN = 10;
uint8_t SCLK_PIN = 8;
#define RTC5vPin 5 / / detta stift kommer att användas för att tillhandahålla + 5v till RTC
#define RTCgndPin 6 / / detta stift kommer att användas för att förse RTC GND
#define PIEZO_PIN 11
/ * Skapa buffertar * /
char buf [50];
char dag [10].
IRsend irsend;
/ * Skapa RTC DS1302 objekt * /
DS1302 rtc (CE_PIN, IO_PIN, SCLK_PIN);
SAMSUNG TV ström på/av koder (ändra detta för att matcha din fjärrkontroll koder)
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};
LG surroundljud (ändra detta för att matcha din fjärrkontroll koder)
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. den tid som vi ger sensorn för att kalibrera (10-60 SEK enligt databladet)
länge osignerade int lowIn; tiden när sensorn utgångar en låga impuls
länge osignerade int paus = 3000; mängden millisekunder sensorn har vara låg innan vi antar all rörelse har slutat
booleska override = false;
booleska lockLow = sant;
booleska takeLowTime;
int pirPin = 3; Den digital pin ansluten till PIR-sensorns utgång
int ledPin = 13. Inbyggda LED är kopplad till en extern röd LED
int maxSecs = 300; Maxtid för ingen rörelse innan vi stänga TV: N
Ändra detta till era egna behov (standard 5 minuter)
int overrideStartHour = 19. Vilken timme att starta fönstret omställning
int overrideEndHour = 23. Vilken timme till slut fönstret omställning
int currentSecs = 0; Globala räknare
GREEN och YELLO LED stift
int greenLedPin = 12;
int yellowLedPin = 2;
int yellowState = 0;
void setup() {
Serial.BEGIN(9600);
pinMode (RTC5vPin, OUTPUT); anger Pin för hög effekt
digitalWrite (RTC5vPin, hög); Aktivera pin på (5v) till makten RTC
pinMode (RTCgndPin, OUTPUT); anger Pin för utdata
digitalWrite (RTCgndPin, låg); Aktivera pin på låg (GND) till makten RTC
pinMode (11, OUTPUT); anger Pin 11 för utdata
digitalWrite (11, låg). Aktivera stift 11 på låg (GND) till makten RTC
pinMode (pirPin, ingång); initiera PIR staten upptäckt pin som indata
pinMode (ledPin, produktionen); initiera ombord LED stift som indata
digitalWrite (pirPin, låg); börja med ingen rörelse
pinMode(greenLedPin,OUTPUT);
digitalWrite (greenLedPin, låg);
pinMode(yellowLedPin,OUTPUT);
digitalWrite (yellowLedPin, låg);
yellowState = 0;
/*
Initiera ett nytt chip av vändningen bort skrivskyddet och röjning i
klockan stoppa flagga. Dessa metoder behöver inte alltid kallas. Se DS1302
datablad för detaljer.
O-kommentera koden nedan att inrätta en ny RTC chip. När kör du behöver
kommentera del av koden igen.
*/
RTC.write_protect(false);
RTC.halt(false);
Tiden t (2013, 7, 7, 14, 45, 0, 0); Skapa ett nytt tid objekt om du vill ange datum och tid
RTC.Time(t); Ställa in tid och datum på chip
RTC.write_protect(true);
ge att PIR-sensorn lite tid att kalibrera
Serial.Print ("kalibrera sensorn");
för (int jag = 0; jag < calibrationTime; i ++) {
Serial.Print(".");
Delay(1000);
}
Serial.println ("gjort");
Serial.println ("sensorn aktiv");
Delay(50);
återställa den globala räknaren
currentSecs = maxSecs;
StartupBeep();
}
void StartupBeep() {
Tone(PIEZO_PIN,4978,2000);
Delay(100);
noTone(PIEZO_PIN);
}
////////////////////////////
LOOP
void loop() {
/ * Få aktuell tid och datum från chip * /
Tiden t = rtc.time();
/ * Namnge dagen i veckan * /
MEMSET (dag 0, sizeof(day)); / * klart dagen buffert * /
/ * Formatera datum och tid och sätt in i tillfälliga bufferten * /
snprintf (buf, sizeof(buf), "%s % 04d-02d-% 02d % 02d: % 02d: % 02d",
dag,
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
/ * Skriva ut formaterade strängen till serial så vi kan se tiden * /
Serial.Print(BUF);
Serial.Print ("-");
Serial.Print ("(hr:");
Serial.Print(t.hr);
Serial.Print(")");
om (t.hr > = overrideStartHour & & t.hr < = overrideEndHour) {
åsidosätta = sant;
Serial.println("Disabled");
} annat {
Serial.println("Enabled");
åsidosätta = false;
}
om (åsidosätter)
{
digitalWrite (greenLedPin, hög);
}
annat
{
digitalWrite (greenLedPin, låg);
}
om (! åsidosätta) {
currentSecs = (currentSecs - 1);
Serial.println(currentSecs);
om (currentSecs < = 30) {
om (yellowState == 1) {
digitalWrite (yellowLedPin, hög);
yellowState = 0;
noTone(PIEZO_PIN);
}
annat
{
digitalWrite (yellowLedPin, låg);
yellowState = 1;
om (currentSecs > = 25) {
Serial.println("beeping!");
Tone(PIEZO_PIN,4978,1000);
}
}
}
om (currentSecs < = 0) {
Max tid för ingen rörelse nått, stänga av TV!
Serial.println ("Swithcing av TV!");
toggleSamsungTV();
}
}
detectmotion();
Delay(1000);
}
void check_time() {
/ * Få aktuell tid och datum från chip * /
Tiden t = rtc.time();
/ * Namnge dagen i veckan * /
MEMSET (dag 0, sizeof(day)); / * klart dagen buffert * /
/ * Formatera datum och tid och sätt in i tillfälliga bufferten * /
snprintf (buf, sizeof(buf), "%s % 04d-02d-% 02d % 02d: % 02d: % 02d",
dag,
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
/ * Skriva ut formaterade strängen till serial så vi kan se tiden * /
Serial.Print(BUF);
Serial.Print ("-");
om (t.hr > overrideStartHour & & t.hr < overrideEndHour) {
åsidosätta = sant;
Serial.println("Disabled");
} annat {
Serial.println("Enabled");
åsidosätta = false;
}
}
void detectmotion() {
IF(digitalRead(pirPin) == hög) {
digitalWrite (ledPin, hög); den ledde visualiserar sensorer utdata pin staten
currentSecs = maxSecs;
digitalWrite (yellowLedPin, låg);
yellowState = 0;
IF(lockLow) {
ser till att vi väntar på en övergång till låg innan någon ytterligare utgång görs:
lockLow = false;
Serial.println("---");
Serial.Print ("rörelse upptäckts på");
Serial.Print(Millis()/1000);
Serial.println ("sec");
Delay(50);
}
takeLowTime = sant;
}
IF(digitalRead(pirPin) == låg) {
digitalWrite (ledPin, låg); den ledde visualiserar sensorer utdata pin staten
IF(takeLowTime) {
lowIn = millis(); Spara tiden för övergången från hög till låg
takeLowTime = false; se till att detta görs endast i början av en låg fas
}
om sensorn är låg för mer än den givna pausen,
Vi antar att ingen mer motion som kommer att hända
om (! lockLow & & millis() - lowIn > pausa) {
gör säkert detta kodblock endast körs igen efter
ett nytt förslag sekvens har upptäckts
lockLow = sant;
Serial.Print ("motion slutade på"); utgång
Serial.Print((Millis() - paus) / 1000);
Serial.println ("sec");
Delay(50);
}
}
}
void toggleSamsungTV() {
Stäng av TV: N med IR-blastern
Upprepa överföringen 3 gånger för att vara säker!
för (int jag = 0; jag < 3; i ++) {
irsend.sendRaw(S_pwr,68,38);
Serial.println ("skickats SAMSUNG POWER ON/OFF");
irsend.sendRaw(LG_pwr,68,38);
Serial.println ("skickats LG POWER ON/OFF");
Delay(40);
}
återställa den globala räknaren
currentSecs = maxSecs;
}