Sleep Cycle väckarklocka med rörelsesensor (4 / 5 steg)
Steg 4: Program klockan
Hur man programmerar varje komponent:Realtidsklocka
Efter löpande den ursprungliga SetTime, är det mycket lätt att använda DS1307. Var noga med att inkludera Time.h och DS1307RTC.h filer och inkludera uttrycket "tmElements_t tm;". För att läsa tid från klockan, skapa en if uttalande säger "if(RTC.read(tm))" att kontrollera om RTC tiden kan läsas. Inom att om uttalande kan du få någon potion av tiden genom att skriva någon av följande:
TM. Timme
TM. Minut
TM. Dagen
TM. Månad
TM. År
Summern
Funktionen för Arduino tone() för att spela toner av olika frekvens och varaktighet på min piezo summern. Stift 9 fungerar som en utgång till summern. Funktionen tonar bör skrivas enligt följande:
tonen (pin, frekvens, varaktighet);
Jag tyckte att det bästa sättet att spela och hela låten var att skapa 3-matriser som vars enskilda artiklar användes i en for-loop. En array var för frekvenser för varje not, en var för varaktigheten av varje not och sist var för pauserna mellan tonerna. Jag hittade all denna information för Super Mario temat låten från inlägget av återskapa på detta forum:
http://Arduino.cc/forum/index.php/topic, 8409.0.html
Han eller hon använder en separat tonen i sin kod, så jag kopierade bara de frekvenser, varaktigheter och pauser i min egen matriser. Jag också till 100 millisekunder varje paus och varaktighet eftersom melodin var lite snabb.
LCD-Display
Hämta Adafruit RGB LCD sköld biblioteket finns på följande länk:
https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library
Inkludera Adafruit_MCP23017.h och Adafruit_RGBLCDShield.h i din kod, för att manipulera den LCD skölden.
Hur slutprodukten ska arbeta:
Första visningen på LCD bör läsa "Tryck Select". Att trycka på knappen Välj byter klockan från normal klocka läge ställa Alarm läge eller tillbaka till klockläget. En gång i ställa in Alarm läge, gör att trycka på rätt knapp att du kan larmet på eller av (kontrollerad av den vänstra knappen), ställa in timmen av alarmet (kontrolleras av UP-knappen), eller ändra minimalt av larmet (kontrolleras av knappen DOWN). Inga problem om det inte ganska rimligt ändå. Varje steg har instruktioner om vilken knapp att trycka på längs vägen.
När larmet går, kan du stänga av genom att trycka på knappen extra (bifogas framför min klocka).
Den fullständiga koden:
Min loop är ganska komplicerat, men klockan fungerar! Om du har förslag på hur man kan förenkla koden, låt mig veta. Jag fann det svåraste programmet knapptryckningar som separata åtgärder och för att få klockan att skriva ut datum och tid så att det skulle ständigt uppdatera.
Förhoppningsvis kommer du att kunna förstå det om du vill göra tweaks för din egen till klockan!
#include < DS1307RTC.h >
#include < Time.h >
#include < Wire.h >
#include < Adafruit_MCP23017.h >
#include < Adafruit_RGBLCDShield.h >
Koden för en sleep cycle väckarklocka
Använder PIR rörelsesensor, LCD sköld, knappen, piezo Summer, realtidsklocka
Dessa #defines gör det enkelt att ställa in bakgrundsljus färg
#define röd 0x1
#define gul 0x3
#define grön 0x2
#define kricka 0x6
#define blå 0x4
#define VIOLET 0x5
#define vit 0x7
Frekvenser av toner spelas larm melodi
int melodi [] = {660,660,510,660,770,380,510,380,320,440,480,450,
430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,
450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,
620,650,380,430,500,430,500,570,500,760,720}.
varaktighet av toner spelas larm melodi
int längd [] = {200,200,200,200,200,200,200,200,200,200,180,200,
200,200,180,150,200,180,150,180,180,180,180,200,200,200,200,180,
200,200,200,180,150,200,180,150,180,180,180,180,200,200,200,200,
250,250,200,200,200,200,200,200,200,200,200}.
fördröjning mellan toner
int fördröjningstid [] = {175,250,250,150,250,375,387,325,300,350,250,265,
175,250,200,200,175,250,175,275,250,175,175,275,375,300,350,250,265,
175,250,200,200,275,250,175,275,250,175,175,350,250,150,175,175,250,
250,175,175,250,175,150,210,250,150}.
int switchPin = 5;
int pirPin = 6;
int buzzerPin = 9;
Välj alarm antingen set eller klocka läge
int hjälpmedelslägevälja;
heltal att välja vilken del av larmet att ställa
int alarmSelect;
Heltal för ställa in larmet på on eller off
int alarmSetOnInt;
Heltal för inställningen timme för alarm
int alarmHourSet;
Heltal för att ange minuter för alarm
int alarmMinSet;
Heltal som anger om knappen har tryckts
int buttonVal;
Heltal spårning upptäckt rörelse
int motionDetected;
Om larmet är på
booleska alarmOn = false;
Huruvida alam är för närvarande kommer
booleska alarmGoingOff = false;
Booleskt värde som är sant när tiden har gått
booleska alarmCanGoOff = false;
tmElements_t tm;
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
void setup() {
Wire.BEGIN();
Serial.BEGIN(9600);
LCD.BEGIN(16,2);
ställa in bakgrundsljus och första meddelande
lcd.setBacklight(VIOLET);
lcd.setCursor(1,1);
LCD.Print ("Tryck på Markera");
pinMode (pirPin, ingång);
hjälpmedelslägevälja = 0;
alarmSelect = 0;
alarmSetOnInt = 0;
alarmHourSet = -1;
alarmMinSet = -1;
motionDetected = 0;
alarmGoingOff = false;
uint8_t jag = 0;
}
void loop() {
uint8_t knappar = lcd.readButtons();
buttonVal = digitalRead(switchPin);
IF(buttonVal == High) {
LCD.Clear();
alarmOn = false;
alarmCanGoOff = false;
alarmGoingOff = false;
}
Om larmet inte går, skriv normala datum och tid
IF(!alarmGoingOff) {
printDateTime();
}
Om larmet går och det är inte alarmtiden, fortsätta larmet
om (alarmGoingOff & tm. Minut! = alarmMinSet) {
LCD.Clear();
alarmOn =! alarmOn;
alarmGoingOff =! alarmGoingOff;
}
IF(buttons) {
Om select-knappen trycks, välja ett läge
IF(buttons & BUTTON_SELECT) {
IF(modeSelect>1) {
hjälpmedelslägevälja = 0;
}
LCD.Clear();
hjälpmedelslägevälja = hjälpmedelslägevälja + 1.
alarmSelect = 0;
Delay(1000);
IF(modeSelect == 1) {
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Set Alarm");
lcd.setCursor(1,1);
LCD.Print ("Tryck på rätt");
Delay(1000);
}
}
Om läge markerat är larm, aktivera inställningen av larm
IF(modeSelect == 1) {
IF(buttons & BUTTON_RIGHT) {
IF(alarmSelect>2) {
alarmSelect = 0;
}
alarmSelect = alarmSelect + 1.
Delay(1000);
Visa om larmet är på eller av
IF(alarmSelect == 1) {
LCD.Clear();
IF(!alarmOn) {
lcd.setCursor(1,0);
LCD.Print ("Alarm off");
lcd.setCursor(1,1);
LCD.Print ("Tryck vänster");
Delay(1000);
} annat if(alarmOn) {
lcd.setCursor(1,0);
LCD.Print ("larm på");
print2digits(alarmHourSet,10,0);
lcd.setCursor(12,0);
LCD.Print(":");
print2digits(alarmMinSet,13,0);
}
} annat if(alarmSelect == 2) {
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Set timme");
lcd.setCursor(1,1);
LCD.Print ("Tryck upp");
} annat if(alarmSelect == 3) {
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Ange minuter");
lcd.setCursor(1,1);
LCD.Print ("Tryck ner");
}
}
}
Ange om larmet är på eller av
IF(alarmSelect == 1) {
IF(buttons & BUTTON_LEFT) {
alarmOn =! alarmOn;
LCD.Clear();
Delay(1000);
IF(alarmOn) {
LCD.Print ("larm på");
} annat if(!alarmOn) {
LCD.Print ("Alarm Off");
}
}
}
Ange timmar
IF(alarmSelect == 2) {
IF(buttons & BUTTON_UP) {
LCD.Clear();
alarmHourSet = alarmHourSet + 1.
IF(alarmHourSet>24) {
alarmHourSet = 0;
}
Delay(500);
}
print2digits(alarmHourSet,14,0);
}
Minuter
IF(alarmSelect == 3) {
IF(buttons & BUTTON_DOWN) {
LCD.Clear();
alarmMinSet = alarmMinSet + 1.
IF(alarmMinSet>59) {
alarmMinSet = 0;
}
Delay(100);
}
print2digits(alarmMinSet,14,0);
}
}
Larmet kan gå av när alarmtiden är lika med aktuell tid
om (alarmOn & alarmMinSet == tm. Minut & alarmHourSet == tm. Timme & hjälpmedelslägevälja! = 1) {
alarmCanGoOff = sant;
Serial.println ("larm kan gå");
}
Om larmet kan gå av, och klockan är i klockläge, larmet kommer
slocknar efter 3 på varandra följande upptäckter av motion
om (alarmCanGoOff & hjälpmedelslägevälja! = 1) {
Serial.println(alarmCanGoOff);
int pirVal = digitalRead(pirPin);
IF(pirVal == High) {
motionDetected ++;
Serial.println ("rörelse upptäckts").
Delay(1000);
}
IF(pirVal == low) {
motionDetected = 0;
}
IF(alarmCanGoOff) {
om (motionDetected > 2 || tm. Timme == alarmHourSet + 1) {
Alarm();
motionDetected = 0;
}
}
}
}
Metod för larm. Ändras och spelar melodin
void alarm() {
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("WAKE UPPPP!");
alarmGoingOff = sant;
för (int jag = 0; jag < 54; i ++) {
buttonVal = digitalRead(switchPin);
IF(buttonVal!=High) {
Delay(delayTime[i]);
tonen (buzzerPin, melody[i],duration[i]);
}
}
}
Skriv datum och tid
void printDateTime() {
IF(RTC.Read(TM) & hjälpmedelslägevälja == 2) {
print2digits(TM. Timme, 1, 0);
lcd.setCursor(3,0);
LCD.Print(":");
print2digits(TM. Minut, 4, 0);
lcd.setCursor(6,0);
LCD.Print(":");
print2digits(TM. Andra, 7, 0);
print2digits(TM. Månad, 1, 1);
lcd.setCursor(3,1);
LCD.Print("/");
print2digits(TM. Dag 4, 1);
Serial.println (tm. Dagen).
}
}
Skriva ut siffror i ett läge med två siffror (för korrekt klockformat)
void print2digits (int number, int kolumn, int rad) {
om (nummer > = 0 & & nummer < 10) {
lcd.setCursor(column,row);
LCD.Print('0');
lcd.setCursor(column+1,row);
LCD.Print(Number);
}
annars om (nummer > = 10) {
lcd.setCursor(column,row);
LCD.Print(Number);
}
}