Stap 4: Programma de klok
Hoe te programmeren van elk onderdeel:Real timerklok
Na het uitvoeren van de eerste SetTime, is het zeer makkelijk te gebruiken van de DS1307. Zorg ervoor dat de Time.h en de DS1307RTC.h bestanden omvatten en de instructie "tmElements_t tm;". Om te lezen de tijd van de klok, maken een indien verklaring zeggen "if(RTC.read(tm))" om te controleren als de RTC-tijd kan worden gelezen. Binnen dat als verklaring kunt u een drankje van de tijd door het schrijven van een van de volgende handelingen:
TM. Uur
TM. Minuut
TM. Dag
TM. Maand
TM. Jaar
Zoemer
De Arduino tone() functie gebruiken om notities van andere frequentie en duur spelen op mijn piëzo-zoemer. Pin 9 fungeert als een output naar de zoemer. De tone-functie moet als volgt worden geschreven:
Toon (pin, frequentie, duur);
Ik vond dat de beste manier om te spelen en het gehele nummer 3 om arrays te maken die waarvan afzonderlijke items werden gebruikt in een for-lus. Een array was voor de frequenties van elke noot, een voor de duur van elke noot was en de laatste was voor de pauzes tussen de noten. Ik vond al deze informatie voor de Super Mario theme song van de post door opnieuw op dit forum:
http://Arduino.CC/Forum/index.php/topic, 8409.0.html
Hij of zij gebruikt een aparte Tone library in zijn of haar code, zodat ik de frequenties, de duur en de pauzes gewoon in mijn eigen arrays gekopieerd. Ik voegde ook 100 milliseconden aan elke pauze en duur, omdat de melodie een beetje snel was.
LCD-Display
Download de Adafruit RGB LCD Shield bibliotheek vinden op de volgende link:
https://github.com/adafruit/Adafruit-RGB-LCD-Shield-Library
Opnemen in uw code, Adafruit_MCP23017.h en Adafruit_RGBLCDShield.h om te manipuleren het LCD schild.
Hoe het uiteindelijke product zou moeten werken:
Het eerste scherm op het LCD-scherm moet lezen "Druk op Select". Op de select knop te drukken gaat de klok van normale modus Set Alarm klok of terug naar de klok. Eenmaal in de alarmmodus instellen krijgt op de juiste knop te drukken u instellen het alarm in- of uitschakelen (gecontroleerd door de linkerknop), stelt u het uur van het alarm (gecontroleerd door de knop omhoog) of instellen van de minuut van het alarm (gecontroleerd door de knop omlaag). Geen zorgen als deze niet vrij nog zinvol. Elke stap heeft instructies op die knop druk langs de weg.
Zodra het alarm gaat af, kunt u het uitschakelen door simpelweg op de extra knop (gekoppeld aan de voorkant van mijn klok).
De volledige code:
Mijn lus is vrij gecompliceerd, maar de klok werkt! Hebt u suggesties over hoe om te vereenvoudigen van de code, laat het me weten. Ik vond het moeilijkst te programma die de knop indrukt als afzonderlijke acties en om de klok voor het afdrukken van de datum en tijd zodat het zou voortdurend bijwerken.
Hopelijk zult u kunnen begrijpen in geval u wil tweaks voor uw eigen aan de klok!
#include < DS1307RTC.h >
#include < Time.h >
#include < Wire.h >
#include < Adafruit_MCP23017.h >
#include < Adafruit_RGBLCDShield.h >
Code voor een slaap cyclus wekker
Maakt gebruik van PIR bewegingsmelder LCD schild, knop, piëzo-zoemer, Real timerklok
Deze #defines maken het gemakkelijk om de kleur van de achtergrondverlichting instellen
#define RED 0x1
#define gele 0x3
#define groen 0x2
#define TEAL 0x6 gemaakt
#define BLUE 0x4
#define VIOLET 0x5
#define WHITE 0x7
Frequenties van tonen gespeeld in alarm melodie
int melodie [] {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};
duur van tonen gespeeld in alarm melodie
int [van duur] = {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};
de wachttijd tussen de tonen
int delayTime [] {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;
Hiermee selecteert u alarm ofwel set of klok modus
int modeSelect;
geheel getal kiezen welk deel van het alarm instellen
int alarmSelect;
Geheel getal voor het instellen van het alarm op of af
int alarmSetOnInt;
Geheel getal voor de instelling uur voor alarm
int alarmHourSet;
Geheel getal voor minuten voor alarm instellen
int alarmMinSet;
Geheel getal dat aangeeft of de knop is ingedrukt
int buttonVal;
Geheel getal tracking gedetecteerd motion
int motionDetected;
Ongeacht of het alarm is ingeschakeld
Boole alarmOn = false;
Wel of niet het alam is momenteel afgaan
Boole alarmGoingOff = false;
Boolean-waarde die geldt zodra de alarmtijd is verstreken
Boole alarmCanGoOff = false;
tmElements_t tm;
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
VOID Setup {}
Wire.begin();
Serial.begin(9600);
LCD.begin(16,2);
set achtergrondverlichting en een eerste bericht
lcd.setBacklight(VIOLET);
lcd.setCursor(1,1);
LCD.Print ("druk op selecteren");
pinMode (pirPin, INPUT);
modeSelect = 0;
alarmSelect = 0;
alarmSetOnInt = 0;
alarmHourSet = -1;
alarmMinSet = -1;
motionDetected = 0;
alarmGoingOff = false;
uint8_t ik = 0;
}
void loop {}
uint8_t knoppen = lcd.readButtons();
buttonVal = digitalRead(switchPin);
if(buttonVal == High) {}
LCD.Clear();
alarmOn = false;
alarmCanGoOff = false;
alarmGoingOff = false;
}
Als de wekker gaat niet af, de normale datum en tijd afdrukken
if(!alarmGoingOff) {}
printDateTime();
}
Als het alarm gaat af en het is niet de alarmtijd, blijven het alarm
Als (alarmGoingOff & tm. Minuut! = alarmMinSet) {}
LCD.Clear();
alarmOn =! alarmOn;
alarmGoingOff =! alarmGoingOff;
}
if(buttons) {}
Als de select-knop wordt ingedrukt, kies een modus
if(Buttons & BUTTON_SELECT) {}
if(modeSelect>1) {}
modeSelect = 0;
}
LCD.Clear();
modeSelect = modeSelect + 1;
alarmSelect = 0;
delay(1000);
if(modeSelect == 1) {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Set Alarm");
lcd.setCursor(1,1);
LCD.Print ("druk op rechts");
delay(1000);
}
}
Als modus hebt geselecteerd, is alarm set, waarmee u kunt alarm instellen
if(modeSelect == 1) {}
if(Buttons & BUTTON_RIGHT) {}
if(alarmSelect>2) {}
alarmSelect = 0;
}
alarmSelect = alarmSelect + 1;
delay(1000);
Tonen of alarm in- of uitschakelen
if(alarmSelect == 1) {}
LCD.Clear();
if(!alarmOn) {}
lcd.setCursor(1,0);
LCD.Print ("Alarm uitschakelen");
lcd.setCursor(1,1);
LCD.Print ("pers links");
delay(1000);
} else if(alarmOn) {}
lcd.setCursor(1,0);
LCD.Print ("Alarm op");
print2digits(alarmHourSet,10,0);
lcd.setCursor(12,0);
LCD.Print(":");
print2digits(alarmMinSet,13,0);
}
} else if(alarmSelect == 2) {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Set Hour");
lcd.setCursor(1,1);
LCD.Print ("druk op UP");
} else if(alarmSelect == 3) {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("Set Minutes");
lcd.setCursor(1,1);
LCD.Print ("press DOWN");
}
}
}
Instellen of alarm in- of uitschakelen is
if(alarmSelect == 1) {}
if(Buttons & BUTTON_LEFT) {}
alarmOn =! alarmOn;
LCD.Clear();
delay(1000);
if(alarmOn) {}
LCD.Print ("Alarm op");
} else if(!alarmOn) {}
LCD.Print ("Alarm Off");
}
}
}
Vaste uren
if(alarmSelect == 2) {}
if(Buttons & BUTTON_UP) {}
LCD.Clear();
alarmHourSet = alarmHourSet + 1;
if(alarmHourSet>24) {}
alarmHourSet = 0;
}
delay(500);
}
print2digits(alarmHourSet,14,0);
}
Minuten in te stellen
if(alarmSelect == 3) {}
if(Buttons & BUTTON_DOWN) {}
LCD.Clear();
alarmMinSet = alarmMinSet + 1;
if(alarmMinSet>59) {}
alarmMinSet = 0;
}
delay(100);
}
print2digits(alarmMinSet,14,0);
}
}
Wekker kan afgaan zodra de alarmtijd gelijk aan de huidige tijd is
Als (alarmOn & alarmMinSet == tm. Minute & alarmHourSet == tm. Uur & modeSelect! = 1) {}
alarmCanGoOff = true;
Serial.println ("alarm kunt afgaan");
}
Als de wekker kan afgaan en de klok in de klok is, zal het alarm
na 3 opeenvolgende detecties voor motion afgaan
Als (alarmCanGoOff & modeSelect! = 1) {}
Serial.println(alarmCanGoOff);
int pirVal = digitalRead(pirPin);
if(pirVal == High) {}
motionDetected ++;
Serial.println ("bewegingsdetectie");
delay(1000);
}
if(pirVal == low) {}
motionDetected = 0;
}
if(alarmCanGoOff) {}
Als (motionDetected > 2 || tm. Uur == alarmHourSet + 1) {}
alarm();
motionDetected = 0;
}
}
}
}
Methode voor alarm. Verandert weergave en speelt de melodie
ongeldig alarm() {}
LCD.Clear();
lcd.setCursor(1,0);
LCD.Print ("WAKE UPPPP!");
alarmGoingOff = true;
for (int i = 0; ik < 54; i ++) {}
buttonVal = digitalRead(switchPin);
if(buttonVal!=High) {}
delay(delayTime[i]);
Toon (buzzerPin, melody[i],duration[i]);
}
}
}
afdrukken van de datum en tijd
ongeldig printDateTime() {}
if(RTC.Read(TM) & modeSelect == 2) {}
print2digits(TM. Uur, 1, 0);
lcd.setCursor(3,0);
LCD.Print(":");
print2digits(TM. Minuut 4, 0);
lcd.setCursor(6,0);
LCD.Print(":");
print2digits(TM. Tweede, 7, 0);
print2digits(TM. Maand, 1, 1);
lcd.setCursor(3,1);
LCD.Print("/");
print2digits(TM. Dag 4, 1);
Serial.println (tm. Dag);
}
}
Print getallen in een locatie met behulp van twee cijfers (voor juiste kloknotatie)
VOID print2digits (int number, int-kolom, int rij) {}
Als (nummer > = 0 & & nummer < 10) {}
lcd.setCursor(column,row);
LCD.Print('0');
lcd.setCursor(column+1,row);
LCD.Print(Number);
}
anders als (nummer > = 10) {}
lcd.setCursor(column,row);
LCD.Print(Number);
}
}