Etape 5: Logiciel : le Code
/ *** * Sunrise Alarm Clock par Ali Shah MakeCourse printemps 2016 ** lorsque LDR le détecte le lever du soleil, il provoquera les servo(hammer attached) faire 50 degrés * et frapper une cloche, comme un alarme de réveil. Comme une sauvegarde le code calcule la durée de l’aube pour l’emplacement * de l’horloge à l’aide de coordonnées de latitude et de longitude et activer l’alarme dans le cas où il n’y a aucun lever * détecté. Ce projet inclut également un module de CCF qui gardera le temps en cas de panne de courant. #include < Wire.h > < Servo.h > de #include #include < TimeLib.h > //works en collaboration avec #include < TimeLord.h > DS1307RTC.h //contains sunrise calculs #include < DS1307RTC.h > //RTC bibliothèque #include < LiquidCrystal_I2C.h > //library pour être utilisé avec écran LCD avec un module V1 YwRobot Arduino LCM1602 IIC joint #define DS1307_ADDRESS 0x68 //RTC addressLiquidCrystal_I2C lcd(0x27,20,4) ; La valeur 0 x 27 l’adresse LCD pour un 16 caractères et affichage de la ligne 2 Servo myservo ; Faire un servo objet int pos = 50 ; Définissant une position servo à 50 degrés int lightPin = A0 ; Connectez le LDR au seuil de broches A0 int = 500 ; Vous définissez le seuil de lumière sur un valeur const int fuseau horaire = -5 ; Définir votre fuseau horaire ; le mien est float const EST LATITUDE = 27.9506 ; Réglez votre latitude et longitude ; les miens sont pour Tampa, FL const float LONGITUDE =-82.4572 ; sillage int = 0 ; drapeau de bool = 1 ; Ici, nous avons un indicateur booléen qui va changer lorsque l'on réalise notre réveil actions int sunriseMin ; minute de ce lever de soleil jours calculé à utiliser pour la comparaison < /p >< p > void setup() {void digitalClockDisplay() ; //digital lheure de la printDigits() Sub temps ; //utility fonction d’affichage de l’horloge numérique : tirages précédents du côlon et menant à 0 Sub sunriseCalc() //calculate sunrise actionAM() Sub //function pour effectuer des actions checkPM() Sub se réveiller ; //for débogage Sub lowLight() ; //function pour afficher la valeur de la sonde si elle est inférieure au seuil de Serial.begin(9600) ; //begin serial communication pinMode (13 SORTIE) ; myservo.Attach(9) ; servo, attaché à la broche 9 lcd.init() ; initialiser le lcd.backlight() lcd ; allumer l’écran LCD rétro-éclairage setSyncProvider(RTC.get) ; fonction permettant d’obtenir le temps de la RTC if(timeStatus()
! = timeSet) {Serial.println ("Impossible de synchroniser avec le CCF");} else {Serial.println ("CCF a définir l’heure système"); digitalClockDisplay();} sunriseCalc() ; } < /p >< p > void loop() {if(wake = 0) {si (isAM()) {Serial.println ("isAM true"); suite = 1; //if it's morning 'réveiller' passera de 0 à 1 drapeau = 0; //we va aussi changer la variable drapeau à 0 Serial.println ("tout d’abord si is running"); //debugging Serial.print ("drapeau:") ; pour le débogage Serial.println(flag) ; pour le débogage}} si (wake = 1 & & drapeau == 0) {//Because wake est 1 et drapeau est 0, et nous pouvons commencer la lumière détection digitalClockDisplay() ; //consistent l’affichage de la l’actuel drapeau de temps = 1; //We va changer le drapeau à 1 parce que les actions de réveil en cours Serial.println(analogRead(lightPin)) ; //readout de la lumière actuelle étant détecté if(analogRead(lightPin) > seuil) {//if la lumière détectée est supérieure à notre seuil : actionAM() ; effectuer des actions Serial.println de réveil (« deuxième si is running") ; débogage} else {drapeau = 0; printDigits(minute()) ; //debugging Serial.println() ; //If aucune lumière n’est détectée pour effectuer des actions, de réveil nous allons vérifier pour voir si l’heure actuelle n’a pas passé sunriseMin + 10 si (sunriseMin < minute()) {//if la minute actuelle valeur est supérieure à la actionAM() de valeur des minutes de lever du soleil ; //perform réveiller drapeau actions = 1 ; Serial.println ("sunrise min est inférieur à l’actuel min") ; débogage de nous faire savoir que la boucle a traversé cette déclaration} lowLight() ; Si il n’y a aucune lumière, nous allons vérifier} delay(1000) ; } Si (isPM()) {checkPM();}} / *** FONCTIONS *** / void sunriseCalc() {TimeLord tardis ; tardis. Fuseau horaire (-4 * 60) ; dire TimeLord quel fuseau horaire votre RTC est synchronisé à. Vous pouvez ignorer la DST tardis. Position (LATITUDE, LONGITUDE) ; dire TimeLord où dans le monde, nous sommes aujourd'hui Byte = {0, 0, 12, 6, 4, 2016} ; stocker la date du jour (à midi) dans un tableau par TimeLord à utiliser si (tardis. SunRise(today)) {/ / si le soleil se lèvera aujourd'hui (il ne pourrait pas, dans l’Arctique [ant]) Serial.print ("lever du soleil:") ; Serial.Print((int) today[tl_hour]) ; Serial.Print(":") ; Serial.Print((int) today[tl_minute]) ; Serial.Print ("AM") ; Serial.println() ; sunriseMin = (int) aujourd'hui [tl_minute] + 10 ; stockage de la valeur de la durée de l’aube + 10 Serial.print ("sunriseMin:") ; Serial.println(sunriseMin) ; }} void digitalClockDisplay() {/ / numérique horloge affichage de l’heure 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 chiffres) {/ / utilitaire de fonction pour l’affichage de l’horloge numérique : imprime les deux points précédents et leader Serial.print(":") 0 ; if(digits < 10) Serial.print('0') ; Serial.Print(digits) ; } void actionAM() {//function qui contient toutes les actions à effectuer lorsqu’il est temps de se lever! digitalWrite (13, HIGH); //turns la LED embarquée sur Serial.println("High") //we imprimer l’état de la quantité de lumière lcd.setCursor(3,0) détecté ; //setting la lcd.print position de curseur ("Wake up Bee"); //printing un message de réveil! lcd.setCursor(2,1) ; lcd.print ("c’est Sunrise!"); lcd.setCursor(0,2) ; //servo actions (pos = 0; pos < = 50; pos += 1) {/ / va de 0 degrés à 50 degrés dans les étapes de 1 degré myservo.write(pos) ; Delay(5) ; {pour (pos = 50; pos > = 0; pos-= 1) {/ / va de 50 degrés à 0 degrés myservo.write(pos) ; delay(5);} pour (pos = 0; pos < = 50; pos += 1) {//0---> 50 répéter myservo.write(pos) ; delay(5);} pour (pos = 50; pos > = 0; pos-= 1) {//50---> 0 répéter myservo.write(pos) ; delay(5);}} void checkPM() {//function qui renvoie une instruction sur le moniteur de la série, s’il est PM; utilisé pour le débogage lcd.noDisplay() ; //turning désactiver l’affichage sur l’écran LCD pour économiser l’énergie Serial.println("isPM() True"); digitalClockDisplay() ; Serial.println(analogRead(lightPin)) ; lecture de la lumière actuelle étant détecté delay(1000) ; } void lowLight() {//if la lumière détectée est inférieure au seuil, nous imprimerons il sur le moniteur série pour garder la trace de celui-ci Serial.println(analogRead(lightPin)) ; //readout de la lumière actuelle étant détectée digitalWrite (13, faible) ; Serial.println("Low") ; myservo.Write(0) ; retour servo à 0 degrés}