Stap 6: Module1 - Arduino/RTC - Test Code
Wees u ervan bewust dat alle van de code voor dit project werd geschreven in Arduino 0022. Ik heb niet geprobeerd 1.0 nog.
Ik heb niet geweest kundig voor elke code als .pde-bestanden uploaden. Ik weet niet waarom. Ik heb hen opnieuw genoemd als .txt die u kunt openen in WordPad en kopiëren/plakken in de IDE of u kunt deze namen wijzigen .pde wanneer u ze hebt gedownload.
UPLOADEN:
Deze kleine Ardu' hoeft niet een fancy auto-reset-circuit. Dientengevolge moeten we druk op de reset-schakelaar op het juiste moment. Ik heb een aantal manieren voorgesteld voor timing dit gezien, maar deze werkt goed voor mij:
1) - de Tx en Rx pinnen uit uw USB converter verbinden met de headers op pin 2 en 3 van de chip (D0 en D1).
2) - macht je board (van de USB-indien mogelijk - indien niet zorg ervoor dat de verbindingen van de aarde uitmaken maar de + 5V zijn niet!).
3) - merk zekere u uitgezocht "Duemilanove/Tiny met ' 328" als uw targetbord.
4) - Klik op de upload-knop in de IDE.
5) - terwijl de code wordt gecompileerd, Bekijk de statusregel onder aan het venster van de IDE.
6) - zodra het kleine venster op de bodem van de winde vertelt u de grootte van uw gecompileerde schets, druk op reset.
7) - de Tx/Rx lampjes op uw USB omvormer moeten flash voor een tijdje.
Als het niet eerste keer werkt voor welke reden dan ook, het zal time-out na ongeveer 30 seconden en u kunt het opnieuw proberen. Het is zeer zeldzaam gaat om meer dan twee pogingen.
De bijgevoegde code zal in eerste instantie de tijd instellen en vervolgens de tijd weergeven in het venster Serial Monitor van de IDE. In de 'setup' routine kunt u het een "R"-teken voor het opnieuw instellen van de tijd, zodat u kunt opnieuw het instellen van de klok elke keer dat u opnieuw uw '-328.
Het zal u dan vragen om geleidelijk minder belangrijke aspecten van de datum en tijd en tot slot weer de nieuwe instellingen voor u om te bevestigen. Het is niet zeer geavanceerde, dus vergeet niet:
Bij elke numerieke invoer het vereist twee decimale cijfers, dus voor dag 2 (dinsdag) Voer "02" in de seriële monitor.
Wanneer bevestiging enz wordt aangevraagd, is dit geval specifieke, dus voor het instellen van de klok, alleen een "Y" als het definitieve antwoord doen zal.
Zodra de tijd set of u "Q" uit de routine van de instelling is zal vervolgens tonen de tijd van de RTC naar de seriële monitor elke seconde.
Natuurlijk, zodra de RTC ligt de batterij zal houden lopen zelfs wanneer u power-down uw ardu' dus kunt u nu uitvoeren van uw eigen schets en zweep slechts een paar functies van deze schets om de tijd wanneer je het nodig hebt. Voor de afgewerkte klok zal stellen we de tijd direct uit de Ardu' maar we moeten sommige ingangen en een display voor dat! Tijd om verder te gaan naar een andere module...
****************
Ugi van Dawn-Light Alarm klok schets.
RTC Test schets
MIT licentie
Ugi Dec 2012
Geschreven voor Arduino-022 op ATmega328 uitgevoerd.
vereist draad bibliotheek
Arduino Pin aansluitingen:
A4 - 1307 (I2C gegevens)
A5 - 1307 (I2C klok)
Algemene klokinstellingen:
#include < Wire.h > - / / usees analoge pinnen A4 (SDA - pin 27) & A5 (SCL-pin 28) voor de 2-draads gegevens.
Const byte DS1307_Address = 0x68;
byte seconden = 45, oldseconds = 0, minuten = 52, uren = 23, datum = 8, maand = 12, dag = 4 jaar = 11, beschermen = 0; standaardinstelling is gewoon ergens beginnen.
byte NEWseconds = 45, NEWminutes = 52, NEWhours = 23, implementatiedatum = 8, NEWmonth = 12, NEWday = 4, NEWyear = 11; Dit zijn voor de instelling.
VOID Setup {}
Serial.begin(9600); Serial.println ("DS1307 RTC gebaseerd klok - Ugi 2012");
delay(2000); RTC geven wat tijd om af te wikkelen.
Wire.begin(); Noodzaak voor RTC
RTCsetFromSerial(); Tijd instellen van seriële elke kans opnieuw instellen. Kan leiden tot een timeout.
}
void loop {}
RTCread();
RTCprintTime(); tijd aan serial stuurt.
delay(1000);
} / / Einde van de hoofdlus
Tijd van de RTC leest in tijdvariabelen.
VOID RTCread() {}
bytegegevens [11] = {0,0,0,0,0,0,0,0,0,0,0};
Wire.beginTransmission(DS1307_Address);
Wire.send(0); ingestelde register naar begin
Wire.endTransmission();
Wire.requestFrom (DS1307_Address, (byte) 10); 7 bytes voor aanvragen van RTC in buffer.
voor (byte _loop = 0; _loop < 10; _loop ++) {}
data[_loop]=(Wire.receive());
}
seconden = ((([0] gegevens & B01110000) >> 4) * 10) + (gegevens [0] & B00001111);
minuten = (((gegevens [1] & B01110000) >> 4) * 10) + (gegevens [1] & B00001111);
uren = (((gegevens [2] & B00110000) >> 4) * 10) + (gegevens [2] & B00001111);
dag = (gegevens [3] & B00000111);
datum = (((gegevens [4] & B00110000) >> 4) * 10) + (gegevens [4] & B00001111);
maand = (((gegevens [5] & B00010000) >> 4) * 10) + (gegevens [5] & B00001111);
jaar = (((gegevens [6] & B11110000) >> 4) * 10) + (gegevens [6] & B00001111);
}
Huidige tijd schrijven naar RTC
VOID RTCwrite() {/ / schrijft alle huidige gegevens naar RTC - als u alleen wilt schrijven één parameter dan enkel de klok eerst lezen!
bytegegevens [7];
gegevens [0] = (10 seconden %) + ((seconds/10) << 4);
gegevens [1] = (10 minuten %) + ((minutes/10) << 4);
gegevens [2] = (10 uur %) + ((hours/10) << 4);
gegevens [3] = dag;
gegevens [4] = (datum % 10) + ((date/10) << 4);
gegevens [5] (maand 10%) = + ((month/10) << 4);
gegevens [6] (jaar 10%) = + ((year/10) << 4);
Wire.beginTransmission(DS1307_Address);
Wire.send(0); ingestelde register naar begin
voor (byte _loop = 0; _loop < 7; _loop ++) {}
Wire.send(data[_loop]);
}
Wire.endTransmission();
oldseconds = seconden;
} / / RTC schrijven beëindigen
Huidige tijd naar seriële afdrukken...
VOID RTCprintTime() {}
RTCread();
Serial.Print ("Time ="); Serial.Print (uren, DEC); Serial.Print(":"); Serial.Print (minuten, DEC); Serial.Print(":"); Serial.println (seconden, DEC);
Serial.Print ("datum ="); Serial.Print (datum, DEC); Serial.Print("/"); Serial.Print (maand, DEC); Serial.Print("/20"); Serial.Print (jaar, DEC);
}
byte RTCgetSerial (byte _val, String _Str) {}
Serial.println("");
Serial.println ("***"+ _Str +"***");
Serial.Print ("huidige waarde ="); Serial.Print (_val, DEC); Serial.println ("" + _Str);
Serial.println ("Geef nieuwe waarde (bijvoorbeeld '01' met twee cijfers):");
Serial.Flush();
byte NEW_val = -1;
terwijl (Serial.available() < 2) {}
delay(50);}
NEW_val = ((Serial.read()-48)*10);
NEW_val = NEW_val + (Serial.read()-48);
Serial.Flush();
Serial.Print ("nieuwe waarde ="); Serial.Print (NEW_val, DEC); Serial.println ("" + _Str); Serial.println("");
Als (NEW_val > = 0) {return NEW_val;}
else {return _val;}
}
Booleaanse RTCconfirm() {}
Serial.println("");
Serial.println("currently:");
RTCprintTime();
Serial.Flush();
Serial.println("");
Serial.println ("wijziging? (Y/N): ");
Serial.Print ("time ="); Serial.Print (NEWhours, DEC); Serial.Print(":"); Serial.Print (NEWminutes, DEC); Serial.Print(":"); Serial.println (NEWseconds, DEC);
Serial.Print ("datum ="); Serial.Print (implementatiedatum, DEC); Serial.Print("/"); Serial.Print (NEWmonth, DEC); Serial.Print("/20"); Serial.Print (Nieuwjaar, DEC);
char _conf = -1;
terwijl (Serial.available() < 1) {}
delay(50);}
_CONF = Serial.read();
Serial.Flush();
Serial.Print ("bevestigen cijfer ="); Serial.println(_CONF);
if(_CONF=='Y') {return true;}
else {return false;}
}
Booleaanse RTCsetFromSerial() {}
Krijgen nieuwe tijdinstelling van seriële poort
Serial.Flush(); Vermijd willekeurige gegevens in de buffer.
Zie als we willen bijwerken
char _input = 'X';
terwijl (_input! = 'R' & & _input! = 'Q') {}
terwijl (Serial.available() < 1) {}
RTCprintTime(); We houden van de huidige tijd weer te geven en zien of deze bijwerken moet.
Serial.println ("Enter 'R' door ingang voor seriële opnieuw instellen") of Q te stoppen met het instellen van de routine;
Serial.println("");
delay(1000);
}
_input = Serial.read();
Serial.Flush();
}
Als (_input! = ' R'){Serial.println(""); Serial.println ("*** stoppen ***"); Serial.println(""); return false;}
Serial.println("");
Serial.println ("*** resetten RTC ***");
Serial.println("");
RTCprintTime();
Nieuwjaar = RTCgetSerial (jaar, "jaar");
RTCprintTime();
NEWday = RTCgetSerial (dag, "dag van de week");
RTCprintTime();
NEWmonth = RTCgetSerial (maand, "maanden");
RTCprintTime();
Implementatiedatum = RTCgetSerial (datum, "dagen van de maand");
RTCprintTime();
NEWhours = RTCgetSerial (uren, "Uren");
RTCprintTime();
NEWminutes = RTCgetSerial (minuten, "");
RTCprintTime();
NEWseconds = RTCgetSerial (seconden, "Seconden");
Als (RTCconfirm()) {}
seconden = NEWseconds;
minuten = NEWminutes;
uren = NEWhours;
datum = implementatiedatum;
maand = NEWmonth;
dag = NEWday;
jaar = Nieuwjaar;
RTCwrite();
Serial.println ("");
Serial.println ("*** RTC bijgewerkt ***");
return true;
}
else {}
Serial.println ("*** Update geannuleerd ***");
}
return false;
}