Schritt 6: Modul1 - Arduino/RTC - Test-Code
Bitte beachten Sie, dass der gesamte Code für dieses Projekt entstand in Arduino 0022. Ich habe noch nicht 1.0.
Ich habe nicht in der Lage, beliebigen Code als .pde Dateien hochladen. Ich weiß nicht warum. Ich habe sie als .txt, die Sie in WordPad öffnen und kopieren/einfügen in die IDE neu benannt oder Sie können sie .pde umbenennen, wenn Sie sie heruntergeladen haben.
HOCHLADEN:
Dieser kleine Ardu "muss keine ausgefallene Auto-Reset-Schaltung. Demzufolge müssen wir die Reset-Taste im richtigen Moment zu drücken. Ich habe eine Reihe von Möglichkeiten für die Zeitmessung dies vorgeschlagen, aber dieses funktioniert gut für mich:
(1) - verbinden Sie die TX- und Rx-Pins Ihre USB-Konverter mit den Headern auf Pin 2 und 3 des Chips (D0 und D1).
(2) - macht dein Board (vom USB-wenn möglich - wenn nicht stellen Sie sicher, dass die Erde-Verbindungen verbunden sind, aber die + 5V nicht!).
(3) - stellen Sie sicher, wählen Sie "Duemilanove/Tiny mit 328" als Target-Board.
(4) - Klicken Sie auf den Upload-Button in der IDE.
(5) - während der Code kompiliert wird, sehen Sie die Statuszeile am unteren Rand der IDE-Fenster.
(6) - Sobald das kleine Fenster am unteren Rand der IDE erzählt Sie die Größe Ihrer kompilierten Skizze, Presse zurücksetzen.
(7) - Tx/Rx auf Ihrem USB-Konverter sollte blinken für eine Weile.
Wenn aus welchem Grund es erste Mal nicht funktioniert, wird es Zeit, nach ca. 30 Sekunden, und Sie es erneut versuchen kannst. Es ist sehr selten, dass es zu mehr als zwei Versuche.
Der angehängte Code wird zunächst die Uhrzeit einstellen und dann die Anzeigezeit im Serial Monitor-Fenster der IDE. In der "Setup"-Routine können Sie es senden ein "R" Zeichen für neu einstellen der Zeit, so dass Sie die Uhr jedes Mal neu einstellen können Sie Ihre 328 zurücksetzen.
Es wird dann fordern Sie schrittweise weniger bedeutende Aspekte der Datum und Uhrzeit und schließlich werden die neuen Einstellungen für Sie zu bestätigen. Es ist nicht sehr anspruchsvoll, so denken Sie bitte daran:
Bei jeder numerische Eingabe es erfordert zwei Dezimalziffern, also für Tag 2 (Dienstag) geben Sie "02" in den serial Monitor.
Wenn Bestätigung etc. angefordert wird, trifft dies spezifisch, so dass um die Uhrzeit eingestellt, nur ein "Y" wird als letzte Antwort.
Sobald die Zeit festgelegt, oder Sie "Q" aus der Einstellung Routine ist, zeigt es die Zeit vom RTC auf den serial Monitor pro Sekunde.
Offensichtlich, sobald die RTC festgelegt ist die Batterie hält es ausgeführt, auch wenn Sie Ihre Ardu abschalten "so können Sie jetzt Ihre eigene Skizze ausgeführt und Peitsche nur wenige Funktionen aus dieser Skizze zu der Zeit, wenn Sie es brauchen. Für die fertige Uhr wir werden stellen Sie die Uhrzeit direkt von der Ardu "aber wir brauchen einige Eingänge und eine Anzeige dafür! Zeit, um ein weiteres Modul zu gelangen...
****************
UGI Dawn-Licht Alarm Clock Skizze.
RTC-Test-Skizze
MIT-Lizenz
UGI Dez 2012
Für Arduino 022 läuft auf ATmega328 geschrieben.
erfordert Drahtbibliothek
Arduino-Pin Anschlüsse:
A4 - 1307 (I2C-Daten)
A5 - 1307 (I2C Clock)
Allgemeine Uhreinstellungen:
< Wire.h > - #include / / Autoteilen analogen pins A4 (SDA - Pin 27) & A5 (SCL-Pin 28) für 2-Draht-Daten.
const Byte DS1307_Address = 0x68;
Byte Sekunden = 45, Oldseconds = 0, Minuten = 52, Stunden = 23, Datum = 8, Monat = 12, Tag = 4, Jahr 11 = schützen = 0; der Standardwert ist nur irgendwo anfangen.
Byte NEWseconds = 45, NEWminutes = 52, NEWhours = 23, NEWdate = 8, NEWmonth = 12, Tageswechsel = 4, NEWyear = 11; Diese sind für die Einstellung.
void setup() {}
Serial.Begin(9600); Serial.println ("DS1307 RTC basierte Uhr - Ugi 2012");
Delay(2000); RTC zu geben, einige Zeit zu begleichen.
Wire.Begin(); Notwendigkeit einer RTC
RTCsetFromSerial(); Die Chance, von Seriennummer jeder Uhrzeit zurückgesetzt. Könnte ein Timeout ermöglichen.
}
void loop() {}
RTCread();
RTCprintTime(); Zeit zu seriell sendet.
Delay(1000);
} / / Ende Hauptschleife
Zeitvariablen Zeit vom RTC eingelesen.
void RTCread() {}
Byte-Daten [11] = {0,0,0,0,0,0,0,0,0,0,0};
Wire.beginTransmission(DS1307_Address);
Wire.Send(0); eingestellten Register zu Beginn
Wire.endTransmission();
Wire.requestFrom (DS1307_Address, (Byte) 10); RTC 7 Byte in Puffer anfordern.
für (Byte _loop = 0; _loop < 10; _loop ++) {}
Data[_loop]=(Wire.Receive());
}
Sekunden = (((Daten [0] & B01110000) >> 4) * 10) + (Daten [0] & B00001111);
Minuten = (((Daten [1] & B01110000) >> 4) * 10) + (Daten [1] & B00001111);
Stunden = (((Daten [2] & B00110000) >> 4) * 10) + (Daten [2] & B00001111);
Tag = (Daten [3] & B00000111);
Datum = (((Daten [4] & B00110000) >> 4) * 10) + (Daten [4] & B00001111);
Monat = (((Daten [5] & B00010000) >> 4) * 10) + (Daten [5] & B00001111);
Jahr = (((Daten [6] & B11110000) >> 4) * 10) + (Daten [6] & B00001111);
}
Aktuelle Uhrzeit an RTC zu schreiben
void RTCwrite() {/ / schreibt alle aktuellen Daten zur RTC - wenn Sie nur schreiben möchten einen Parameter dann nur die Uhr lesen zuerst!
Byte-Daten [7];
Daten [0] = (Sekunden % 10) + ((seconds/10) << 4);
Daten [1] = (Minuten % 10) + ((minutes/10) << 4);
Daten [2] = (Stunden 10 %) + ((hours/10) << 4);
Daten [3] = Tag;
Daten [4] = (Datum % 10) + ((date/10) << 4);
Daten [5] = (Monat 10 %) + ((month/10) << 4);
Daten [6] = (Jahr % 10) + ((year/10) << 4);
Wire.beginTransmission(DS1307_Address);
Wire.Send(0); eingestellten Register zu Beginn
für (Byte _loop = 0; _loop < 7; _loop ++) {}
Wire.Send(Data[_loop]);
}
Wire.endTransmission();
Oldseconds = Sekunden;
} / / Ende schreiben, RTC-Funktion
Drucken Sie aktuelle Uhrzeit auf seriell...
void RTCprintTime() {}
RTCread();
Serial.Print ("Zeit ="); Serial.Print (Stunden, DEC); Serial.Print(":"); Serial.Print (Minuten, DEC); Serial.Print(":"); Serial.println (Sekunden, DEC);
Serial.Print ("Datum ="); Serial.Print (Datum, DEC); Serial.Print("/"); Serial.Print (Monat, DEC); Serial.Print("/20"); Serial.Print (Jahr, DEC);
}
Byte (Byte _val, String _Str) RTCgetSerial {}
Serial.println("");
Serial.println ("***"+ _Str +"***");
Serial.Print ("Aktueller Wert ="); Serial.Print (_val, Dez.); Serial.println ("" + _Str);
Serial.println ("geben Sie neuen Wert (zwei Ziffern, z. B."01"):");
Serial.Flush();
Byte NEW_val =-1;
während (Serial.available() < 2) {}
Delay(50);}
NEW_val = ((Serial.read()-48)*10);
NEW_val = NEW_val + (Serial.read()-48);
Serial.Flush();
Serial.Print ("neuer Wert ="); Serial.Print (NEW_val, DEC); Serial.println ("" + _Str); Serial.println("");
Wenn (NEW_val > = 0) {return NEW_val;}
Else {return _val;}
}
Boolesche RTCconfirm() {}
Serial.println("");
Serial.println("currently:");
RTCprintTime();
Serial.Flush();
Serial.println("");
Serial.println ("ändern? (Y/N): ");
Serial.Print ("Zeit ="); Serial.Print (NEWhours, Dez.); Serial.Print(":"); Serial.Print (NEWminutes, Dez.); Serial.Print(":"); Serial.println (NEWseconds, Dez.);
Serial.Print ("Datum ="); Serial.Print (NEWdate, DEC); Serial.Print("/"); Serial.Print (NEWmonth, Dez.); Serial.Print("/20"); Serial.Print (NEWyear, DEC);
Char _conf =-1;
während (Serial.available() < 1) {}
Delay(50);}
_conf = Serial.read();
Serial.Flush();
Serial.Print ("bestätigen Ziffer ="); Serial.println(_conf);
If(_conf=='Y') {return True;}
Else {return false;}
}
Boolesche RTCsetFromSerial() {}
Erhalten Sie neue Zeiteinstellung von seriellen Anschluss
Serial.Flush(); vermeiden Sie zufällige Daten im Puffer.
Sehen Sie, ob wir aktualisieren möchten
Char _input = 'X';
während (_input! = 'R' & & _input! = 'Q') {}
während (Serial.available() < 1) {}
RTCprintTime(); Wir halten aktuelle Uhrzeit anzeigen und sehen, ob es muss aktualisiert werden.
Serial.println ("Enter"R"von seriellen Eingang neu eingestellt") oder Q beenden Routine einstellen;
Serial.println("");
Delay(1000);
}
_input = Serial.read();
Serial.Flush();
}
Wenn (_input! = ' R'){Serial.println(""); Serial.println ("*** beenden ***"); Serial.println(""); Geben Sie false;}
Serial.println("");
Serial.println ("*** Zurücksetzen RTC ***");
Serial.println("");
RTCprintTime();
NEWyear = RTCgetSerial (Jahr, "Jahre");
RTCprintTime();
Tageswechsel = RTCgetSerial (Tag, "Wochentag");
RTCprintTime();
NEWmonth = RTCgetSerial (Monat, "Monate");
RTCprintTime();
NEWdate = RTCgetSerial (Datum, "Tage des Monats");
RTCprintTime();
NEWhours = RTCgetSerial (Stunden, "Stunden");
RTCprintTime();
NEWminutes = RTCgetSerial (Minuten, "");
RTCprintTime();
NEWseconds = RTCgetSerial (Sekunden, "Sekunden");
Wenn (RTCconfirm()) {}
Sekunden = NEWseconds;
Minuten = NEWminutes;
Stunden = NEWhours;
Datum = NEWdate;
Monat = NEWmonth;
Tag = Tageswechsel;
Jahr = NEWyear;
RTCwrite();
Serial.println ("");
Serial.println ("*** RTC aktualisiert ***");
gibt true zurück;
}
Else {}
Serial.println ("*** Update abgebrochen ***");
}
return false;
}