Hallo an alle, vorweg möchte ich sagen dass ich was den Arduino angeht ein absoluter Anfänger bin smiley Nachdem ich erst ein wenig mit meinem UNO rumexperimentiert habe, wollte ich nun mein erstes Programm schreiben. Das Programm sollte z.B. Um 8.00 Uhr eine LED Lampe langsam hochdimmen (so über ne halbe stunde) und um 18Uhr wieder langsam runter. Nachdem ich durch jede Menge googeln den Arduino dazu bekommen habe die Uhrzeit (DS1307) auf meinem LCD anzuzeigen, stellt sich jetzt das Problem, dass ich nicht weiß wie ich beim Dimmen die delay Funktion umgehe weil dann ja sonst meine Uhr während des Dimmens stehen bleibt. Das zweite ist dass ich nicht weiß wie ich den dann hochgedimmten ausgang dann angeschalten lasse obwohl er ja jede sekunde den loop wiederholt und die Zeit abruft. Wenn mir jemand helfen kann, freue ich mich smiley Grüße Bruzzzler #include "LCD4Bit_mod.h" #include "Wire.h" int ledPin = 3; // LED Pin setzen #define DS1307_I2C_ADDRESS 0x68 // I2C Adresse char buffer[20] = ""; // Speicherbereich für Datenkonvertierung LCD4Bit_mod lcd = LCD4Bit_mod(2); // LCD-Display /*********************************************************************** ***************************** * Konvertierung BCD-kodierter Dezimalzahl */ byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } /*********************************************************************** ***************************** * Zeit und Datum aus DS1307 auslesen und konvertieren */ void getDateDs1307(int date[]) { Wire.beginTransmission(DS1307_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten Wire.write(0x00); // Registerzeiger auf 0 setzen Wire.endTransmission(); // I2C-Kommunikation beenden Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten date[ 0 ] = bcdToDec(Wire.read() & 0x7f); // Sekunden date[ 1 ] = bcdToDec(Wire.read()); // Minuten date[ 2 ] = bcdToDec(Wire.read() & 0x3f); // Stunden date[ 3 ] = bcdToDec(Wire.read()); // Wochentag date[ 4 ] = bcdToDec(Wire.read()); // Tag date[ 5 ] = bcdToDec(Wire.read()); // Monat date[ 6 ] = bcdToDec(Wire.read()); // Jahr } /*********************************************************************** ***************************** */ void setup() { Wire.begin(); // I2C-Bus einrichten lcd.init(); // LCD-Anzeige initialisieren lcd.clear(); lcd.printIn( "DS1307 - Uhr" ); } /*********************************************************************** ***************************** */ void loop() { int datum[ 7 ]; getDateDs1307( datum ); // Datum und Uhrzeit aus DS1307 holen lcd.cursorTo(2, 0); // Datum und Uhrzeit in 2. Zeile schreiben if( datum[ 4 ] < 10 ) lcd.printIn( "0" ); lcd.printIn( itoa( datum[ 4 ], buffer, 10 ) ); lcd.printIn( "." ); if( datum[ 5 ] < 10 ) lcd.printIn( "0" ); lcd.printIn( itoa( datum[ 5 ], buffer, 10 ) ); lcd.printIn( "." ); /* if( datum[ 6 ] < 10 ) lcd.printIn( "0" ); lcd.printIn( itoa( datum[ 6 ], buffer, 10 ) ); */ lcd.printIn( " " ); if( datum[ 2 ] < 10 ) lcd.printIn( "0" ); lcd.printIn( itoa( datum[ 2 ], buffer, 10 ) ); lcd.printIn( ":" ); if( datum[ 1 ] < 10 ) lcd.printIn( "0" ); lcd.printIn( itoa( datum[ 1 ], buffer, 10 ) ); lcd.printIn( ":" ); if( datum[ 0 ] < 10 ) lcd.printIn( "0" ); lcd.printIn( itoa( datum[ 0 ], buffer, 10 ) ); lcd.printIn( " " ); /*********************************************************************** ***************************** Tageslichtsteuerung */ //Morgens if ( datum[ 2 ] >= 10 ) // Stunde if ( datum[ 1 ] >= 2 ) // Minute if ( ledPin <1){ for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { analogWrite(3, fadeValue); delay(30); } } { delay(1000); // grobes Sekundenraster für Anzeige } }
Johannes schrieb: > (DS1307) auf meinem LCD anzuzeigen, stellt sich jetzt das Problem, dass > ich nicht weiß wie ich beim Dimmen die delay Funktion umgehe weil dann > ja sonst meine Uhr während des Dimmens stehen bleibt. Das hast du völlig richtig erkannt, dass dein delay das Problem ist. Aber. Im Grunde ist das ja kein Problem. Du musst von deiner for-Schleife weg! Denn: Du weisst, dass du um 7:00 einen Dimmgrad von 0 haben sollst. Liegt die Uhrzeit zwischen 7:00 und 7:01 dann brauchst du einen Dimmgrad von 1%. Liegt die Uhrzeit zwischen 7:01 und 7:02, dann brauchst du einen Dimmgrad von 2% etc. etc. D.h. anstelle dass du in einer for-schleife durchdimmst, machst du (Programmskizze) void loop() { if( Uhrzeit < 7 Uhr früh ) Dimmgrad = 0 else if( Urzeit < 7:01 früh ) Dimmgrad = 1 else if( Uhrzeit < 7:02 früh Dimmgard = 2 ... } d.h. du siehst dir einfach bei jedem Aufruf von loop die aktuelle Uhrzeit an und leitest daraus her, wie der Dimmgrad zu dieser Uhrzeit sein muss. Da loop immer wieder erneut aufgerufen wird, verändert sich auch die dann jeweils festgestellte aktuelle Uhrzeit. Hinweis: Du wirst natürlich nicht da jetzt 100 if-Abfragen machen, sondern dir überlegen, wie du aus der Uhrzeit den Dimmgrad ERRECHNEN kannst. Aber das Prinzip ist dasselbe: Die momentan aktuelle Uhrzeit verrät dir, wie die LED genau zu diesem Zeitpunkt gedimmt sein muss. Du musst dir nur überlegen, wie du das rechnen musst. Also: Papier und Bleistift raus und mal ein wenig rumgerechnet. Wenn du die Vorgabe hast, dass du einen Zahlenwert innerhalb von 30 Minuten von 0 auf 100 bringen sollst und ich frage dich, welcher Wert 11 Minuten und 43 Sekunden nach Beginn der ganzen Aktion dann vorliegt, wie berechnest du das? > Das zweite ist dass ich nicht weiß wie ich den dann hochgedimmten > ausgang dann angeschalten lasse obwohl er ja jede sekunde den loop > wiederholt und die Zeit abruft. Das Problem erledigt sich dann ganz von alleine :-) (und ps: die delays schmeisst du alle raus. Versprochen?)
Karl Heinz Buchegger schrieb: > Hinweis: Du wirst natürlich nicht da jetzt 100 if-Abfragen machen, > sondern dir überlegen, wie du aus der Uhrzeit den Dimmgrad ERRECHNEN > kannst. Aber das Prinzip ist dasselbe: Die momentan aktuelle Uhrzeit > verrät dir, wie die LED genau zu diesem Zeitpunkt gedimmt sein muss. Du > musst dir nur überlegen, wie du das rechnen musst. Also: Papier und > Bleistift raus und mal ein wenig rumgerechnet. Wenn du die Vorgabe hast, > dass du einen Zahlenwert innerhalb von 30 Minuten von 0 auf 100 bringen > sollst und ich frage dich, welcher Wert 11 Minuten und 43 Sekunden nach > Beginn der ganzen Aktion dann vorliegt, wie berechnest du das? Und noch ein Hinweis: Die ganze Rechnung vereinfacht sich extrem, wenn du nicht mit einem bunten Mix aus Minuten und Sekunden an die Sache rangehst, sondern zuerst mal alles auf einen kleinsten gemeinsammen Nenner bringst. zb Sekunden. 30 Minuten sind 1800 Sekunden und 11 Minuten 43 sind 703 Sekunden. Wenn also nach 1800 Sekunden ein bei 0 beginnender Wert 1800 erreicht haben soll, welchen Wert hast du dann nach 703 Sekunden? -> Dreisatz.
OK super tipp. 100Stufen*703sek/1800sek = 39 Stufen aber wie bekomm ich das ins programm weil das ja nur immer als uhrzeit 10sekunden ausgiebt dann wieder von vorne anfängt?
Johannes schrieb: > OK super tipp. 100Stufen*703sek/1800sek = 39 Stufen > > aber wie bekomm ich das ins programm weil das ja nur immer als uhrzeit > 10sekunden ausgiebt dann wieder von vorne anfängt? Ja, macht ja nichts. Du hast eine andere Uhrzeit. Dann macht eben der µC mit dieser neuen Uhrzeit wieder dieselbe Berechnung, nur mit anderen Zahlenwerten. Dazu hat man ja Variablen, in denen diese Zahlenwerte stehen. Damit man a = b * 300 / c; schreiben kann und je nachdem, welche WErte konkret in b bzw. c stehen, kommt dann ein anderes Ergebnis raus.
1 | void loop() { |
2 | |
3 | int datum[ 7 ]; |
4 | |
5 | getDateDs1307( datum ); // Datum und Uhrzeit aus DS1307 holen |
6 | |
7 | |
8 | .... jetzt hast du die aktuelle Uhrzeit. |
9 | .... Mach was damit. |
10 | .... Zb ausrechnen wie die LED genau jetzt, zu diesem Zeitpunkt |
11 | .... gedimmt sein muss |
12 | |
13 | ....
|
Hier
1 | date[ 0 ] = bcdToDec(Wire.read() & 0x7f); // Sekunden |
2 | date[ 1 ] = bcdToDec(Wire.read()); // Minuten |
3 | date[ 2 ] = bcdToDec(Wire.read() & 0x3f); // Stunden |
hast du dir die für den aktuellen Zeitpunkt relevanten Werte geholt. Ergo
1 | void loop() |
2 | {
|
3 | int datum[ 7 ]; |
4 | int licht; |
5 | char str[30]; |
6 | |
7 | getDateDs1307( datum ); // Datum und Uhrzeit aus DS1307 holen |
8 | |
9 | // von Mitternacht bis 8 Uhr (7:59:59)
|
10 | // ist das Licht aus
|
11 | if( data[2] < 8 ) { |
12 | licht = 0; |
13 | }
|
14 | |
15 | // von 8 Uhr, bis 8 Uhr 30 berechnet sich eine Dimmstufe
|
16 | // hochdimmen!
|
17 | else if( data[2] == 8 && data[1] < 30 ) { |
18 | ....
|
19 | licht = ...... deine Formel |
20 | }
|
21 | |
22 | // von 8:30 bis 17:59:59 ist das Licht an
|
23 | else if( data[2] < 18 ) |
24 | Licht = 255; |
25 | |
26 | // von 6 bis halb 7 wird wieder eine Dimmstufe berechnet
|
27 | // aber diesmal runterdimmen!
|
28 | else if( data[2] == 18 && data[1] < 30 ) { |
29 | ....
|
30 | licht = ....... deine Formel |
31 | }
|
32 | |
33 | // und für den Rest des Tages (kann dann nur noch nach halb 7 sein)
|
34 | // wird das Licht abgedreht
|
35 | else
|
36 | licht = 0; |
37 | |
38 | // jetzt noch schnell die Lampe tatsächlich anhand der
|
39 | // vorher bestimmten Werte einstellen
|
40 | analogWrite( 3, licht ); |
41 | |
42 | // ... und der Benutzer will auch sehen wie spät es ist
|
43 | sprintf( str, "%02d-%02d-%02d %02d:%02d:%02d, |
44 | data[4], data[5], data[6],
|
45 | data[2], data[1], data[0] );
|
46 | lcd.cursorTo( 1, 0 );
|
47 | lcd.printIn( str );
|
48 | |
49 | // ... bzw. er will auch sehen, wie hell es gerade sein sollte
|
50 | sprintf( str, "Lichtstufe: %3d", licht ); |
51 | lcd.cursorTo( 2, 0 );
|
52 | lcd.printIn( str );
|
53 | |
54 | // und das wars für diesen Durchgang
|
55 | // in bälde wird loop() das nächste mal aufgerufen und dann
|
56 | // beginnt das ganze Spielchen wieder von vorne.
|
57 | // allerdings mit einer etwas anderen Uhrzeit :-)
|
58 | }
|
Danke sehr für die geniale hilfe komm mir gerade vor wie ein depp aber bei mir kommen nur Fehlermeldungen :(
Johannes schrieb: > Danke sehr für die geniale hilfe komm mir gerade vor wie ein depp aber > bei mir kommen nur Fehlermeldungen :( Dann lies die Fehlermeldungen und behebe die Ursachen. Ein Fehler nach dem anderen. Fang bei der ersten Fehlermeldung an. Ich tippe hier die Programme direkt ein. D.h. das kann schon sein, dass ich den einen oder anderen Tippfehler (und sei es nur eine Gross/Kleinschreibung) drinnen habe. Das Ziel ist ja auch nicht, dass ich dir ein fertiges Programm liefere, dass du nur auf deinen µC brennen musst. Das Ziel ist, dass du verstehst wie und warum ich bestimmte Dinge tue und da das Prinzip verstehen und anwenden kannst. Und manchmal ist es nun mal einfacher, dieses Prinzip mit Code zu verdeutlichen anstelle das ich mir da den Mund fusselig rede. (und deine Ausgabe war ja wirklich nicht sauber programmiert. Da gibt es einfachere Methoden, auch wenn die ein wenig Resourcen verbrauchen. Aber wer seinen µC 1 Sekunde lang Däumchen drehen lässt, kann es sich auch leisten den Komfort von sprintf in Anspruch zu nehmen)
Und noch was. Hier
1 | else if( data[2] == 8 && data[1] < 30 ) { |
2 | ....
|
3 | licht = ...... deine Formel |
4 | }
|
wartet noch Arbeit auf dich. Das Erstellen der Berechnung nehm ich dir nämlich nicht ab. Etwas musst du schon auch dazutun.
ja schon klar aber trotzdem danke für deine Hilfe. ja sauber programmieren ist so ne sache :) Steh ja noch ganz am Anfang hab davor noch nie einen Controller programmiert
So hab jetzt alles fast am laufen und auch die Formel. Allerdings berechnet er die Lichtstufe falsch aber warum? Ich vermute das liegt daran dass ich nur minuten berechne und da auch nachkommastellen vorkommen
1 | #include "LCD4Bit_mod.h" |
2 | #include "Wire.h" |
3 | |
4 | int ledPin = 3; // LED Pin setzen |
5 | |
6 | #define DS1307_I2C_ADDRESS 0x68 // I2C Adresse |
7 | |
8 | char buffer[20] = ""; // Speicherbereich für Datenkonvertierung |
9 | |
10 | LCD4Bit_mod lcd = LCD4Bit_mod(2); // LCD-Display |
11 | |
12 | /**************************************************************************************************** |
13 | * Konvertierung BCD-kodierter Dezimalzahl |
14 | */ |
15 | byte bcdToDec(byte val) |
16 | { |
17 | return ( (val/16*10) + (val%16) ); |
18 | } |
19 | |
20 | /**************************************************************************************************** |
21 | * Zeit und Datum aus DS1307 auslesen und konvertieren |
22 | */ |
23 | void getDateDs1307(int date[]) |
24 | { |
25 | Wire.beginTransmission(DS1307_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten |
26 | Wire.write(0x00); // Registerzeiger auf 0 setzen |
27 | Wire.endTransmission(); // I2C-Kommunikation beenden |
28 | Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten |
29 | |
30 | date[ 0 ] = bcdToDec(Wire.read() & 0x7f); // Sekunden |
31 | date[ 1 ] = bcdToDec(Wire.read()); // Minuten |
32 | date[ 2 ] = bcdToDec(Wire.read() & 0x3f); // Stunden |
33 | date[ 3 ] = bcdToDec(Wire.read()); // Wochentag |
34 | date[ 4 ] = bcdToDec(Wire.read()); // Tag |
35 | date[ 5 ] = bcdToDec(Wire.read()); // Monat |
36 | date[ 6 ] = bcdToDec(Wire.read()); // Jahr |
37 | } |
38 | |
39 | /**************************************************************************************************** |
40 | */ |
41 | void setup() { |
42 | Wire.begin(); // I2C-Bus einrichten |
43 | |
44 | lcd.init(); // LCD-Anzeige initialisieren |
45 | lcd.clear(); |
46 | lcd.printIn( "DS1307 - Uhr" ); |
47 | |
48 | |
49 | } |
50 | |
51 | /**************************************************************************************************** |
52 | */ |
53 | void loop() { |
54 | |
55 | int datum[ 7 ]; |
56 | int licht; |
57 | char str[30]; |
58 | |
59 | |
60 | getDateDs1307( datum ); // Datum und Uhrzeit aus DS1307 holen |
61 | |
62 | int a = 255; |
63 | int b = datum[1]*60; |
64 | int c = 1800; |
65 | |
66 | |
67 | // von Mitternacht bis 8 Uhr (7:59:59) |
68 | // ist das Licht aus |
69 | if( datum[2] < 8 ) { |
70 | licht = 0; |
71 | } |
72 | |
73 | // von 8 Uhr, bis 8 Uhr 30 berechnet sich eine Dimmstufe |
74 | // hochdimmen! |
75 | else if( datum[2] == 8 && datum[1] < 30 ) { |
76 | licht = a * b / c; |
77 | } |
78 | |
79 | // von 8:30 bis 17:59:59 ist das Licht an |
80 | else if( datum[2] < 18 ){ |
81 | licht = 255; |
82 | } |
83 | // von 6 bis halb 7 wird wieder eine Dimmstufe berechnet |
84 | // aber diesmal runterdimmen! |
85 | else if( datum[2] == 18 && datum[1] < 30 ) { |
86 | licht = a * b / c; |
87 | } |
88 | |
89 | // und für den Rest des Tages (kann dann nur noch nach halb 7 sein) |
90 | // wird das Licht abgedreht |
91 | else |
92 | licht = 0; |
93 | |
94 | // jetzt noch schnell die Lampe tatsächlich anhand der |
95 | // vorher bestimmten Werte einstellen |
96 | analogWrite( 3, licht ); |
97 | |
98 | // ... und der Benutzer will auch sehen wie spät es ist |
99 | sprintf( str, "%02d-%02d-%02d%02d:%02d:%02d", |
100 | datum[4], datum[5], datum[6], |
101 | datum[2], datum[1], datum[0] ); |
102 | lcd.cursorTo( 1, 0 ); |
103 | lcd.printIn( str ); |
104 | |
105 | // ... bzw. er will auch sehen, wie hell es gerade sein sollte |
106 | sprintf( str, "Lichtstufe: %3d", licht ); |
107 | lcd.cursorTo( 2, 0 ); |
108 | lcd.printIn( str ); |
109 | } |
Also ich meine jetzt beim hochdimmen beim Runterdimmen bin ich grad noch an der Formel
Johannes schrieb: > So hab jetzt alles fast am laufen und auch die Formel. Allerdings > berechnet er die Lichtstufe falsch aber warum? Ich vermute vermute nicht. Du hast ein LCD. Auf dem kann man sich Werte ausgeben lassen, bzw. die Werte aus denen sie entstehen, wenn einem nicht klar ist, wie ein Wert zustande kommt. Was bedeutet 'falsch'? Kommt 384 raus oder -38. Oder was? > das liegt > daran dass ich nur minuten berechne und da auch nachkommastellen > vorkommen Nichts und niemand hindert dich daran, dass du hier b = data[1] * 60; auch noch die aktuellen Sekunden mit dazurechnest. PS: Es ist immer gut, wenn man Variablen einen Namen gibt, der ihrer Funktion entspricht, denn nur durch betrachten von licht = a * b / c; kann man nicht nachvollziehen, was du da eigentlich rechnest. Steht da aber licht = maximalLicht * DimmSekunde / GesamtDimmSekunden; dann kann man das schon besser nachvollziehen. Und da im restlichen Programm momenan sowieso die maximale Helligkeit mit 255 vorgegeben ist und die Dauer der Dimmzeit mit 30 Minuten festgelegt ist, kannst du gerne auch hier licht = 255 * DimmSekunde / ( 60 * 30 ); schreiben, was das Lesen der Formel (momentan) vereinfacht. PS: Du wirst wohl hier else if( datum[2] == 8 && datum[1] < 30 ) { licht = a * b / c; } und hier // von 6 bis halb 7 wird wieder eine Dimmstufe berechnet // aber diesmal runterdimmen! else if( datum[2] == 18 && datum[1] < 30 ) { licht = a * b / c; } andere Formeln brauchen. Denn das eine mal wird das Licht ja heller (dimmt also von dunkel nach hell), während es am Abend genau in die andere Richtung dimmt: von hell nach dunkel. Das ist aber der genau gegensätzliche Vorgang, daher kann das nicht dieselbe Formel sein.
mit fehler meine ich dass zum beispiel bei 8:15 als Lichstufe -18 rauskommt
Hab die Sekunden jetzt noch dazu genommen in meiner Rechnung allerdings keine änderung. Nach Lichtstufe 7 kommt 15 dann -5 und so weiter
Im übrigen ist es manchmal sehr erhellend, wenn man sich mal die Berechnung rausgreift, Werte einsetzt und nachsieht, was da passiert int b = datum[1]*60; licht = 255 * b / 1800; Sagen wir mal b sei ganz am Anfang. Die Minuten seien also noch 0. 0 mal 60 macht 0 255*0/1800 macht 0/1800 macht 0 Ein WErt in der Mitte. Sagen wir 15 MInuten 15 mal 60 macht 900 255*900/1800 macht 229500/1800 ^ | möööp, möööp, mööp Overflow Da ist ein Zwischenergebnis, welches den Bereich -32768 bis 32767 überschreitet. Wenn du int rechnest, müssen auch alle Zwischenergebnisse im int Bereich sein! Ein long (32 Bit Ganzzahl) geht bis 2147483648. Da würden die 229500 nach reinpassen. Was ist mit dem Extremwert von 30 Minuten? 30 mal 60 macht 1800. Das mal 255 macht 495000. Geht sich also auch noch aus. Also: macht man die Sekunden seit Beginn der Dimmung zu einem long anstelle eines int, dann geht sich das aus long SekundenSeitDimmstart = data[1] * 60 + data[0]; ... licht = 255 * SekundenSeitDimmstart / 1800;
Karl Heinz Buchegger schrieb: > licht = 255 * SekundenSeitDimmstart / 1800; Dadurch dass SekundenSeitDimmstart ein long ist, erzwinge ich, dass die Multiplikation mit 255 ebenfalls im Zahlenraum long gerechnet wird (also als 32 Bit Multiplikation), und damit kann dann auch das Ergebnis keinen Overflow mehr produzieren.
ja jetzt scheint es zu gehen :) Vielen Vielen Dank Mach mich jetzt noch ans runter dimmen. Danke für die Hilfe und das dazugelernte wissen
Johannes schrieb: > ja jetzt scheint es zu gehen :) Vielen Vielen Dank > > Mach mich jetzt noch ans runter dimmen. Pst. Runterdimmen ist im Prinzip der genau gleiche Vorgang gegengleich. D.h. anstelle von 0 muss in deiner 'Formel' 255 rauskommen. Anstelle von 1 muss 254 rauskommen Anstelle von 2 muss 253 rauskommen 3 252 4 251 ... Merkst du was? Die erste und die zweite Zahl ergeben addiert wieder die 255. Wenn du also die Berechnung genau gleich wie im ersten Fall machst und dieses Ergebnis dann von 255 abziehst, dann .....
und schönen Gruß an deine Fische :-) Das wird doch ein Aquariendimmer, oder nicht?
Ja solls Aquarium dimmen :) Super haut jetzt alles hin. Danke
Hallo habe auch ein problem mit meiner steuerung könnt ihr mir vll helfen? ich weis nicht wie ich meinem board den befehl geb das wenn es zb 8:00uhr ist das meine led auf pin 9 hochdimmt. wäre voll nett wenn ihr mir helfen könnt. MFG Andi // ######################################################################## ##### // # // # Scriptname : DS1307_Test.pde // # Author : Peter Schmelzer, Oliver Kraus // # Date : 2011-04-08 // # Editor : Lauren from DFRobot // # Date : 30.12.2011 // # Description: // # Test file for the DS1307new library. Assumes that you have a DS1307 // # connected to the I2C-Bus of your Arduino and that it has a battery backup. // # Update the library and sketch to compatible with IDE V1.0 and earlier // # Version : 1.0 // ######################################################################## ##### // ********************************************* // INCLUDE // ********************************************* #include <Wire.h> // For some strange reasons, Wire.h must be included here #include <DS1307new.h> // ********************************************* // DEFINE // ********************************************* // ********************************************* // VARIABLES // ********************************************* uint16_t startAddr = 0x0000; // Start address to store in the NV-RAM uint16_t lastAddr; // new address for storing in NV-RAM uint16_t TimeIsSet = 0xaa55; // Helper that time must not set again // ********************************************* // SETUP // ********************************************* void setup() { pinMode(2, INPUT); // Test of the SQW pin, D2 = INPUT digitalWrite(2, HIGH); // Test of the SQW pin, D2 = Pullup on int ledPin = 9; //INT------------------------------------------------------------------- -------- pinMode(ledPin, OUTPUT); //mode------------------------------------------------------------------ ------ Serial.begin(9600); /* PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!! NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0 TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56! */ RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08 /* Uncomment the next 2 lines if you want to SET the clock Comment them out if the clock is set. DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK AFTER SETTING THE CLOCK ONCE. */ // TimeIsSet = 0xffff; // RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); /* Control the clock. Clock will only be set if NV-RAM Address does not contain 0xaa. DS1307 should have a battery backup. */ RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); // 54 auf 55 stellen und datum + Zeiteinstellen if (TimeIsSet != 0xaa55) { RTC.stopClock(); RTC.fillByYMD(2011,4,8); RTC.fillByHMS(22,7,0); RTC.setTime(); TimeIsSet = 0xaa55; RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); RTC.startClock(); } else { RTC.getTime(); } /* Control Register for SQW pin which can be used as an interrupt. */ RTC.ctrl = 0x00; // 0x00=disable SQW pin, 0x10=1Hz, // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz RTC.setCTRL(); Serial.println("DS1307 Testsketch"); Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\""); uint8_t MESZ; MESZ = RTC.isMEZSummerTime(); Serial.print("MEZ=0, MESZ=1 : "); Serial.println(MESZ, DEC); Serial.println(); } // ********************************************* // MAIN (LOOP) // ********************************************* void loop() { int ledPin = 9; // hier ist mein Problem-------------------------------------------- pinMode(ledPin, OUTPUT); RTC.getTime(); if (time) { digitalWrite(ledPin, HIGH); } if ( 20 > DN_H ) if (RTC.minute < 34) {digitalWrite(ledPin, HIGH); } if (RTC.hour < 20) {digitalWrite(ledPin, LOW); } //mode bis hier ------------------------------------------------------------------------ RTC.getTime(); if (RTC.hour < 10) // correct hour if necessary { Serial.print("0"); Serial.print(RTC.hour, DEC); } else { Serial.print(RTC.hour, DEC); } Serial.print(":"); if (RTC.minute < 10) // correct minute if necessary { Serial.print("0"); Serial.print(RTC.minute, DEC); } else { Serial.print(RTC.minute, DEC); } Serial.print(":"); if (RTC.second < 10) // correct second if necessary { Serial.print("0"); Serial.print(RTC.second, DEC); } else { Serial.print(RTC.second, DEC); } Serial.print(" "); if (RTC.day < 10) // correct date if necessary { Serial.print("0"); Serial.print(RTC.day, DEC); } else { Serial.print(RTC.day, DEC); } Serial.print("-"); if (RTC.month < 10) // correct month if necessary { Serial.print("0"); Serial.print(RTC.month, DEC); } else { Serial.print(RTC.month, DEC); } Serial.print("-"); Serial.print(RTC.year, DEC); // Year need not to be changed Serial.print(" "); switch (RTC.dow) // Friendly printout the weekday { case 1: Serial.print("MON"); break; case 2: Serial.print("TUE"); break; case 3: Serial.print("WED"); break; case 4: Serial.print("THU"); break; case 5: Serial.print("FRI"); break; case 6: Serial.print("SAT"); break; case 7: Serial.print("SUN"); break; } Serial.print(" seconds since 1.1.2000:"); Serial.print(RTC.time2000, DEC); uint8_t MESZ = RTC.isMEZSummerTime(); Serial.print(" MEZ=0, MESZ=1 : "); Serial.print(MESZ, DEC); Serial.print(" - Address in NV-RAM is: "); RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t)); Serial.print(lastAddr, HEX); lastAddr = lastAddr + 1; // we want to use it as addresscounter for example RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t)); RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); if (TimeIsSet == 0xaa55) // check if the clock was set or not { Serial.println(" - Clock was set!"); } else { Serial.println(" - Clock was NOT set!"); } delay(1000); // wait a second }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.