Stiga och glänsa! -LDR Arduino väckarklocka (5 / 7 steg)
Steg 5: Programvara: koden
/************************************************************************************************************
* Sunrise väckarklocka av Björn Shah MakeCourse våren 2016
*
* När LDR upptäcker soluppgången, kommer att det orsaka servo(hammer attached) att vända 50 grader
* och träffa en klocka, som en vakna upp larmet. Som en backup kommer att koden beräkna soluppgång tid för plats
* på klockan med hjälp av latitud och longitud, och aktivera larmet om det finns ingen soluppgång
* upptäckt. Detta projekt omfattar också en RTC modul som kommer att hålla tiden vid strömavbrott.
***********************************************************************************************************/
#include < Wire.h >
#include < Servo.h >
#include < TimeLib.h > //works i samband med DS1307RTC.h
#include < TimeLord.h > //contains sunrise beräkningar
#include < DS1307RTC.h > //RTC bibliotek
#include < LiquidCrystal_I2C.h > //library som ska användas med LCD med en YwRobot Arduino LCM1602 IIC V1 modul kopplad
#define DS1307_ADDRESS 0x68 //RTC adress
LiquidCrystal_I2C lcd(0x27,20,4); Ange adressen som LCD till 0x27 för en 16 tecken och 2 raders display
Servo myservo; Göra ett servo objekt
int pos = 50; Välja en servo position på 50 grader
int lightPin = A0; Anslut LDR till stift A0
int tröskel = 500. Du ställa in ljus tröskeln till ett värde
CONST int TIMEZONE = -5; Ställa in din tidszon; min är EST
CONST float latitud = 27.9506; Ställa in latitud och longitud; Mina är för Tampa, FL
CONST float longitud =-82.4572;
int vakna = 0; //
bool flagga = 1; Här har vi en boolesk flagga som kommer att förändra när vi utför våra wakeup åtgärder
int sunriseMin; minut av den dagar beräknade soluppgången som ska användas för jämförelse < /p >< p > void setup() {
void digitalClockDisplay(); digital klocka av tiden
void printDigits(); verktyget funktion för digital klocka: utskrifter före kolon och ledande 0
void sunriseCalc(); beräkna soluppgång
void actionAM(); funktion för att utföra vakna upp åtgärder
void checkPM(); för felsökning
void lowLight(); funktion för att Visa sensor värde om det är mindre än tröskelvärdet
Serial.BEGIN(9600); börja seriell kommunikation
pinMode (13, OUTPUT);
myservo.attach(9); servo bifogas pin 9
LCD.init(); initiera lcd
LCD.backlight(); slå på LCD-bakgrundsbelysning
setSyncProvider(RTC.get); funktion för att få tiden från RTC
IF(timeStatus()! = tidInställning) {
Serial.println ("kan inte synkronisera med RTC"); }
annat {
Serial.println ("RTC har angett systemtiden");
digitalClockDisplay(); }
sunriseCalc();
} < /p >< p > void loop() {
IF(Wake = 0) {
om (isAM()) {
Serial.println ("isAM sant");
vakna = 1; om det är morgon "vakna" ändras från 0 till 1
flagga = 0; Vi kommer också att ändra variabeln flagga till 0
Serial.println ("första om körs"); felsökning
Serial.Print ("flagga:"); för felsökning
Serial.println(Flag); för felsökning
}
}
om (vakna = 1 & & flagga == 0) {//Because wake är 1, och flaggan är 0, och vi kan börja ljus upptäckt
digitalClockDisplay(); konsekvent avläsning av den aktuella tiden
Flagga = 1; Vi kommer att ändra flaggan till 1 eftersom wakeup åtgärderna utförs
Serial.println(analogRead(lightPin)); avläsning av aktuella ljuset upptäcks
IF(analogRead(lightPin) > tröskel) {//if den upptäckt är större än vår tröskel:
actionAM(); utföra vakna upp åtgärder
Serial.println ("andra om körs"); felsökning
}
annat {
flagga = 0;
printDigits(minute()); felsökning
Serial.println();
Om inget ljus upptäcks utföra vakna upp åtgärder, kommer att vi kontrollera för att se om nuvarande tid inte klarat sunriseMin + 10
om (sunriseMin < minute()) {//if i nuvarande stund värdet är större än värdet sunrise minut
actionAM(); utföra vakna upp åtgärder
Flagga = 1;
Serial.println ("sunrise min är lägre än nuvarande min"); Felsöka för att låta oss veta att slingan har gått igenom detta uttalande
}
lowLight(); om det finns inget ljus, kommer att vi kontrollera
}
Delay(1000);
}
om (isPM()) {
checkPM();
}
}
/**************************************************** FUNCTIONS ****************************************************/
void sunriseCalc() {
TimeLord tardis;
TARDIS. Tidszon (-4 * 60); berätta TimeLord vilken tidszon ditt RTC synkroniseras till. Du kan ignorera DST
TARDIS. Position (latitud, longitud); Säg TimeLord var i världen vi är
byte i dag [] = {0, 0, 12, 6, 4, 2016}; lagra dag (kl) i en matris för TimeLord att använda
om (tardis. SunRise(today)) {/ / om att solen går upp idag (det kanske inte, i [ant] Arktis)
Serial.Print ("Sunrise:");
Serial.Print((int) today[tl_hour]);
Serial.Print(":");
Serial.Print((int) today[tl_minute]);
Serial.Print ("AM");
Serial.println();
sunriseMin = (int) idag [tl_minute] + 10. lagra värdet av soluppgången tiden + 10
Serial.Print ("sunriseMin:");
Serial.println(sunriseMin);
}
}
void digitalClockDisplay() {
digital klocka av tiden
Serial.Print(Hour());
printDigits(minute());
printDigits(second());
Serial.Print("");
Serial.Print(Day());
Serial.Print("/");
Serial.Print(Month());
Serial.Print("/");
Serial.Print(Year());
Serial.println();
Delay(200);
}
void printDigits (int siffror) {
verktyget funktion för digital klocka: utskrifter före kolon och ledande 0
Serial.Print(":");
IF(digits < 10)
Serial.Print('0');
Serial.Print(digits);
}
void actionAM() {
funktion som innehåller alla åtgärder som ska utföras när det är dags att gå upp!
digitalWrite 13, hög. tänds lysdioden ombord
Serial.println("High"); Vi skriver ut status för mängden blixtreflexer upptäckt
lcd.setCursor(3,0); ställa in markörens position
LCD.Print ("vaknar Bee"); skriva ut en vakna upp meddelande!
lcd.setCursor(2,1);
LCD.Print ("det är soluppgång!");
lcd.setCursor(0,2);
servo åtgärder
för (pos = 0; pos < = 50; pos + = 1) {/ / går från 0 grader till 50 grader i steg om 1 grad
myservo.write(POS);
Delay(5);
}
för (pos = 50; pos > = 0; pos-= 1) {/ / går från 50 grader till 0 grader
myservo.write(POS);
Delay(5);
}
för (pos = 0; pos < = 50; pos + = 1) {//0---> 50 upprepa
myservo.write(POS);
Delay(5);
}
för (pos = 50; pos > = 0; pos-= 1) {//50---> 0 upprepade
myservo.write(POS);
Delay(5);
}
}
void checkPM() {
funktion som returnerar ett uttalande på den seriella bildskärmen om det är PM; för felsökning
lcd.noDisplay(); stänga av displayen på LCD att spara ström
Serial.println("isPM() sant");
digitalClockDisplay();
Serial.println(analogRead(lightPin)); avläsning av aktuella ljuset upptäcks
Delay(1000);
}
void lowLight() {
om ljuset är mindre än tröskelvärdet, vi kommer att skriva ut det på serial monitorn att hålla reda på det
Serial.println(analogRead(lightPin)); avläsning av aktuella ljuset upptäcks
digitalWrite 13, låg.
Serial.println("Low");
myservo.write(0); returnera servo till 0 grader
}