Stap 5: Arduino code
Voor de IR-communicatie gebruikte ik de IRemote bibliotheek-bibliotheek voor de Arduino. Voor het downloaden van github (http://github.com/shirriff/Arduino-IRremote), klik op de link "Downloads" in de rechterbovenhoek en klik op "Downloaden als zip" krijgen een zip-bestand. Unzip het en hernoem de folder shirriff-Arduino-IRremote-nnn naar IRremoteVoor de RTC DS1302 gebruikte ik de volgende library voor Arduino: https://github.com/msparks/arduino-ds1302
Voor de productie van de beeper geluid gebruik ik de standaard SPI.h Arduino library. Zie http://arduino.cc/en/Reference/SPI voor details
#include < stdio.h >
#include < string.h >
#include < DS1302.h >
#include < SPI.h >
#include < IRremote.h >
/ * Stel de juiste digitale I/O pin aansluitingen voor de RTC-module * /
uint8_t CE_PIN = 4;
uint8_t IO_PIN = 10;
uint8_t SCLK_PIN = 8;
#define RTC5vPin 5 / / deze pin wordt gebruikt om + 5v aan de RTC
#define RTCgndPin 6 / / deze pin wordt gebruikt voor GND geven de RTC
#define PIEZO_PIN 11
/ * Buffers kan maken * /
char buf [50];
char dag [10];
IRsend irsend;
/ * Maakt een object RTC DS1302 * /
DS1302 rtc (CE_PIN, IO_PIN, SCLK_PIN);
SAMSUNG TV Power on/off codes (veranderen zodat deze overeenkomt met uw externe codes)
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 Surround Sound (veranderen zodat deze overeenkomt met uw externe codes)
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; de tijd die we geven de sensor kalibreren (10-60 sec volgens het gegevensblad)
lang unsigned int lowIn; het tijdstip wanneer de sensor een lage impuls uitgangen
lang unsigned int pauze = 3000; het aantal milliseconden die de sensor worden lage moet voordat we aannemen alle beweging dat is gestopt
Booleaanse override = false;
Boole lockLow = waar;
Booleaanse takeLowTime;
int pirPin = 3; De digitale pin aangesloten op uitgang van de PIR-sensor
int ledPin = 13; Ingebouwde LED is aangesloten op een externe rode LED
int maxSecs = 300; Max tijd voor geen beweging heeft plaatsgevonden voordat we de TV uitschakelen
Dit aanpassen aan uw eigen behoeften wijzigen (standaard 5 minuten)
int overrideStartHour = 19; Welke uur om te beginnen met het override-venster
int overrideEndHour = 23; Welke uur tegen het override-venster
int currentSecs = 0; Globale teller
GROEN en YELLO LED pinnen
int greenLedPin = 12;
int yellowLedPin = 2;
int yellowState = 0;
VOID Setup {}
Serial.begin(9600);
pinMode (RTC5vPin, uitvoer); Pin ingesteld voor hoge output
digitalWrite (RTC5vPin, hoge); Schakel pin op (5v) aan de macht RTC
pinMode (RTCgndPin, uitvoer); sets Pin voor uitvoer
digitalWrite (RTCgndPin, laag); Schakel pin op lage (GND) aan de macht RTC
pinMode (11, OUTPUT); Pin 11 sets voor uitvoer
digitalWrite (11, laag); Schakel pin 11 op lage (GND) aan de macht RTC
pinMode (pirPin, INPUT); initialiseren van de PIR pin voor de detectie van de staat als input
pinMode (ledPin, OUTPUT); initialiseren van de ingebouwde LED-pin als input
digitalWrite (pirPin, laag); beginnen met geen beweging
pinMode(greenLedPin,OUTPUT);
digitalWrite (greenLedPin, laag);
pinMode(yellowLedPin,OUTPUT);
digitalWrite (yellowLedPin, laag);
yellowState = 0;
/*
Initialiseren van een nieuwe chip door schrijven bescherming uitschakelen en clearing het
Klok stoppen vlag. Deze methoden hoeft niet altijd te worden genoemd. Bekijk de DS1302
gegevensblad voor meer informatie.
Un-comment de onderstaande code om in te stellen van een nieuwe RTC-chip. Zodra u wilt in werking
Opmerking de sectie van code weer.
*/
RTC.write_protect(false);
RTC.halt(false);
Tijd t (2013, 7, 7, 14, 45, 0, 0); Maakt een nieuw object van de tijd om de datum en tijd instellen
RTC.time(t); Stel de tijd en datum op de chip
RTC.write_protect(true);
de PIR sensor enige tijd te geven om te kalibreren
Serial.Print ("kalibreren sensor");
for (int i = 0; ik < calibrationTime; i ++) {}
Serial.Print(".");
delay(1000);
}
Serial.println ("done");
Serial.println ("SENSOR actief");
delay(50);
de globale teller instellen
currentSecs = maxSecs;
StartupBeep();
}
VOID StartupBeep() {}
Tone(PIEZO_PIN,4978,2000);
delay(100);
noTone(PIEZO_PIN);
}
////////////////////////////
LOOP
void loop {}
/ * Krijg de huidige tijd en datum van de chip * /
Tijd t = rtc.time();
/ * Naam van de dag van de week * /
memset (dag 0, sizeof(day)); / * dag buffer leeg * /
/ * De tijd en datum opmaken en invoegen in de tijdelijke buffer * /
snprintf (buf, sizeof(buf), "%s % 04d-% 02d-% 02d % 02d: % 02d: % 02d",
dag,
t.yr, t.mon, t.date,
t.HR, t.min, t.sec);
/ * De opgemaakte tekenreeks naar seriële afdrukken zodat we de tijd zien kunnen * /
Serial.Print(BUF);
Serial.Print ("-");
Serial.Print ("(hr:");
Serial.Print(t.HR);
Serial.Print(")");
Als (t.hr > = overrideStartHour & & t.hr < = overrideEndHour) {}
negeren = true;
Serial.println("disabled");
} else {}
Serial.println("enabled");
negeren = false;
}
Als (overschrijven)
{
digitalWrite (greenLedPin, hoge);
}
anders
{
digitalWrite (greenLedPin, laag);
}
Als (! overschrijven) {}
currentSecs = (currentSecs - 1);
Serial.println(currentSecs);
Als (currentSecs < = 30) {}
Als (yellowState == 1) {}
digitalWrite (yellowLedPin, hoge);
yellowState = 0;
noTone(PIEZO_PIN);
}
anders
{
digitalWrite (yellowLedPin, laag);
yellowState = 1;
Als (currentSecs > = 25) {}
Serial.println("beeping!");
Tone(PIEZO_PIN,4978,1000);
}
}
}
Als (currentSecs < = 0) {}
Max tijd voor geen beweging bereikt, schakelt u de TV!
Serial.println ("Swithcing uit TV!");
toggleSamsungTV();
}
}
detectmotion();
delay(1000);
}
ongeldig check_time() {}
/ * Krijg de huidige tijd en datum van de chip * /
Tijd t = rtc.time();
/ * Naam van de dag van de week * /
memset (dag 0, sizeof(day)); / * dag buffer leeg * /
/ * De tijd en datum opmaken en invoegen in de tijdelijke buffer * /
snprintf (buf, sizeof(buf), "%s % 04d-% 02d-% 02d % 02d: % 02d: % 02d",
dag,
t.yr, t.mon, t.date,
t.HR, t.min, t.sec);
/ * De opgemaakte tekenreeks naar seriële afdrukken zodat we de tijd zien kunnen * /
Serial.Print(BUF);
Serial.Print ("-");
Als (t.hr > overrideStartHour & & t.hr < overrideEndHour) {}
negeren = true;
Serial.println("disabled");
} else {}
Serial.println("enabled");
negeren = false;
}
}
ongeldig detectmotion() {}
if(digitalRead(pirPin) == HIGH) {}
digitalWrite (ledPin, hoge); de led visualiseert de sensoren uitvoer pin staat
currentSecs = maxSecs;
digitalWrite (yellowLedPin, laag);
yellowState = 0;
if(lockLow) {}
zorgt ervoor dat we wachten op een overgang naar lage voordat verdere uitvoer plaatsvindt:
lockLow = false;
Serial.println("---");
Serial.Print ("bewegingsdetectie op");
Serial.Print(Millis()/1000);
Serial.println ("sec");
delay(50);
}
takeLowTime = true;
}
if(digitalRead(pirPin) == LOW) {}
digitalWrite (ledPin, laag); de led visualiseert de sensoren uitvoer pin staat
if(takeLowTime) {}
lowIn = millis(); opslaan van het tijdstip van de overgang van hoog naar laag
takeLowTime = false; Zorg ervoor dat dit gebeurt alleen bij het begin van een lage fase
}
de sensor wordt laag voor meer dan het bepaalde pauze,
Wij gaan ervan uit dat geen meer beweging gaat gebeuren
Als (! lockLow & & millis() - lowIn > onderbreken) {}
maakt zeker dit blok code wordt alleen uitgevoerd na opnieuw
een nieuwe reeks van beweging is gedetecteerd
lockLow = true;
Serial.Print ("motion eindigde op"); uitgang
Serial.Print((Millis() - onderbreken) / 1000);
Serial.println ("sec");
delay(50);
}
}
}
ongeldig toggleSamsungTV() {}
Schakel de TV uit met de IR-blaster
Herhaal de transmissie 3 keer om zeker te zijn!
for (int i = 0; ik < 3; i ++) {}
irsend.sendRaw(S_pwr,68,38);
Serial.println ("verzonden SAMSUNG POWER ON/OFF");
irsend.sendRaw(LG_pwr,68,38);
Serial.println ("verzonden LG POWER ON/OFF");
delay(40);
}
de globale teller instellen
currentSecs = maxSecs;
}