Inhoudsopgave:

DS1307 en DS3231 real-time klokmodules gebruiken met Arduino: 3 stappen
DS1307 en DS3231 real-time klokmodules gebruiken met Arduino: 3 stappen

Video: DS1307 en DS3231 real-time klokmodules gebruiken met Arduino: 3 stappen

Video: DS1307 en DS3231 real-time klokmodules gebruiken met Arduino: 3 stappen
Video: Урок 99. Создание цифровых часов Arduino с использованием ЖК-дисплея DS3231 и семисегментного дисплея. 2024, Juli-
Anonim
DS1307 en DS3231 real-time klokmodules gebruiken met Arduino
DS1307 en DS3231 real-time klokmodules gebruiken met Arduino
DS1307 en DS3231 real-time klokmodules gebruiken met Arduino
DS1307 en DS3231 real-time klokmodules gebruiken met Arduino

We krijgen steeds verzoeken over het gebruik van DS1307 en DS3231 real-time klokmodules met Arduino uit verschillende bronnen - dus dit is de eerste van een tweedelige tutorial over hoe ze te gebruiken. Voor deze Arduino-tutorial hebben we twee realtime klokmodules om te gebruiken, één gebaseerd op de Maxim DS1307 (de vierkante module) en de DS3231 (de rechthoekige module).

Er zijn twee belangrijke verschillen tussen de IC's op de real-time klokmodules, namelijk de nauwkeurigheid van de tijdregistratie. De DS1307 die in de eerste module wordt gebruikt, werkt erg goed, maar de externe temperatuur kan de frequentie van het oscillatorcircuit beïnvloeden dat de interne teller van de DS1307 aandrijft.

Dit klinkt misschien als een probleem, maar zal er meestal toe leiden dat de klok ongeveer vijf minuten per maand afwijkt. De DS3231 is veel nauwkeuriger, omdat hij een interne oscillator heeft die niet wordt beïnvloed door externe factoren - en dus maximaal een paar minuten per jaar nauwkeurig is. Als je een DS1307-module hebt, voel je dan niet slecht, het is nog steeds een waardevol bord en zal je goed van pas komen. Bij beide modules is een back-upbatterij vereist.

Het is een goed idee om een nieuwe CR2032-batterij te kopen en deze in de module te plaatsen. Naast het bijhouden van de tijd en datum hebben deze modules ook een kleine EEPROM, een alarmfunctie (alleen DS3231) en de mogelijkheid om een blokgolf van verschillende frequenties te genereren - die allemaal het onderwerp zullen zijn van een tweede tutorial.

Stap 1: Uw module aansluiten op een Arduino

Beide modules maken gebruik van de I2C-bus, wat het aansluiten zeer eenvoudig maakt.

Eerst moet je identificeren welke pinnen op je Arduino of compatibele kaarten worden gebruikt voor de I2C-bus - deze staan bekend als SDA (of data) en SCL (of klok). Op Arduino Uno of compatibele boards zijn deze pinnen A4 en A5 voor data en klok; Op de Arduino Mega zijn de pinnen D20 en D21 voor data en klok; En als je een Pro Mini-compatibel gebruikt, zijn de pinnen A4 en A5 voor data en klok, die parallel zijn aan de hoofdpinnen.

DS1307-module

Als je de DS1307-module hebt, moet je de draden aan het bord solderen of op sommige inline-headerpinnen solderen, zodat je jumperdraden kunt gebruiken. Verbind vervolgens de SCL- en SDA-pinnen met uw Arduino en de Vcc-pin met de 5V-pin en GND met GND.

DS3231-module

Het aansluiten van deze module is eenvoudig omdat de header-pinnen in de fabriek op het bord zijn geïnstalleerd. Je kunt eenvoudig opnieuw jumperdraden van SCL en SDA naar de Arduino en opnieuw van de Vcc- en GND-pinnen van de module naar de 5V of 3.3. V en GND van je board. Deze zijn echter aan de andere kant gedupliceerd voor het solderen van uw eigen draden. Beide modules hebben de vereiste pull-up-weerstanden, dus u hoeft er zelf geen toe te voegen. Probeer, zoals alle apparaten die op de I2C-bus zijn aangesloten, de lengte van de SDA- en SCL-draden tot een minimum te beperken.

Stap 2: Lezen en schrijven van de tijd van uw RTC-module

Zodra u uw RTC-module hebt aangesloten. voer de volgende schets in en upload deze. Hoewel de opmerkingen en functies in de schets alleen naar de DS3231 verwijzen, werkt de code ook met de DS1307.

#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // Converteer normale decimale getallen naar binair gecodeerde decimale byte decToBcd(byte val) { return((val/10*16) + (val%10)); } // Converteer binair gecodeerde decimalen naar normale decimale getallen byte bcdToDec(byte val) { return((val/16*10) + (val%16)); } void setup() { Wire.begin(); Serieel.begin(9600); // stel hier de begintijd in: // DS3231 seconden, minuten, uren, dag, datum, maand, jaar // setDS3231time (30, 42, 21, 4, 26, 11, 14); } void setDS3231time (byte seconde, byte minuut, byte uur, byte dayOfWeek, byte dayOfMonth, byte maand, byte jaar) {// stelt tijd- en datumgegevens in op DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven(0); // stel de volgende invoer in om te beginnen bij het secondenregister Wire.write (decToBcd (second)); // stel seconden in Wire.write (decToBcd (minuut)); // stel minuten in Wire.write (decToBcd (uur)); // stel uren in Wire.write (decToBcd (dayOfWeek)); // dag van de week instellen (1 = zondag, 7 = zaterdag) Wire.write (decToBcd (dayOfMonth)); // datum instellen (1 tot 31) Wire.write (decToBcd (maand)); // set maand Wire.write (decToBcd (jaar)); // jaar instellen (0 tot 99) Wire.endTransmission(); } void readDS3231time (byte *seconde, byte *minuut, byte *uur, byte *dayOfWeek, byte *dayOfMonth, byte *maand, byte *jaar) { Wire.beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven(0); // stel de DS3231-registeraanwijzer in op 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // verzoek zeven bytes aan gegevens van DS3231 vanaf register 00h *second = bcdToDec(Wire.read() & 0x7f); *minuut = bcdToDec(Wire.read()); *uur = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *maand = bcdToDec(Wire.read()); *jaar = bcdToDec(Wire.read()); } void displayTime() { byte seconde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar; // gegevens ophalen van DS3231 readDS3231time (&seconde, &minuten, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // stuur het naar de seriële monitor Serial.print (uur, DEC); // converteer de bytevariabele naar een decimaal getal wanneer weergegeven Serial.print(":"); if (minuut <10) { Serial.print("0"); } Serial.print (minuut, DEC); Serial.print(":"); if (seconde<10) { Serial.print("0"); } Serial.print (tweede, DEC); Serieel.print(" "); Serial.print(dayOfMonth, DEC); Serieel.print("/"); Serial.print (maand, DEC); Serieel.print("/"); Serial.print (jaar, DEC); Serial.print(" Dag van de week: "); switch(dayOfWeek){ geval 1: Serial.println("zondag"); pauze; geval 2: Serial.println ("maandag"); pauze; geval 3: Serial.println ("dinsdag"); pauze; geval 4: Serial.println ("woensdag"); pauze; geval 5: Serial.println ("donderdag"); pauze; geval 6: Serial.println ("vrijdag"); pauze; geval 7: Serial.println ("zaterdag"); pauze; } } void loop() { displayTime(); // toon de real-time klokgegevens op de seriële monitor, vertraging (1000); // elke seconde }

Er kan veel code zijn, maar het valt goed uiteen in hanteerbare delen.

Het bevat eerst de Wire-bibliotheek, die wordt gebruikt voor I2C-buscommunicatie, gevolgd door het definiëren van het busadres voor de RTC als 0x68. Deze worden gevolgd door twee functies die decimale getallen converteren naar BCD (binair gecodeerd decimaal) en vice versa. Deze zijn nodig omdat de RTC IC's in BCD werken, niet in decimalen.

De functie setDS3231time() wordt gebruikt om de klok in te stellen. Het gebruik ervan is heel eenvoudig, vul eenvoudig de waarden van jaar tot seconde in en de RTC zal vanaf die tijd starten. Als u bijvoorbeeld de volgende datum en tijd wilt instellen – woensdag 26 november 2014 en 21:42 uur en 30 seconden – gebruikt u:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Stap 3:

Merk op dat de tijd is ingesteld met 24-uurs tijd en dat de vierde parameter de "dag van de week" is. Dit valt tussen 1 en 7, wat respectievelijk zondag tot en met zaterdag is. Deze parameters zijn bytewaarden als u uw eigen variabelen vervangt.

Als je de functie eenmaal hebt uitgevoerd, is het verstandig om deze vooraf te laten gaan met // en je code opnieuw te uploaden, zodat de tijd niet opnieuw wordt ingesteld nadat de stroom is uitgezet of de micrcontroller is gereset. De tijd van uw RTC lezen Is net zo eenvoudig, in feite kan het proces netjes worden gevolgd binnen de functie displayTime(). U moet zeven bytevariabelen definiëren om de gegevens van de RTC op te slaan, en deze worden vervolgens ingevoegd in de functie readDS3231time(). Als uw variabelen bijvoorbeeld zijn:

byte seconde, minuut, uur, dayOfWeek, dayOfMonth, maand, jaar;

… u ze zou verversen met de huidige gegevens van de RTC door gebruik te maken van:

readDS3232time(&seconde, &minuut, &uur, &dayOfWeek, &dayOfMonth, &maand, &jaar);

Vervolgens kunt u de variabelen naar eigen inzicht gebruiken, van het verzenden van de tijd en datum naar de seriële monitor zoals de voorbeeldschets doet - tot het omzetten van de gegevens in een geschikte vorm voor allerlei soorten uitvoerapparaten.

Om te controleren of alles werkt, voert u de juiste tijd en datum in de demonstratieschets in, uploadt u deze, becommentarieert u de functie setDS3231time() en uploadt u deze opnieuw. Open vervolgens de seriële monitor en u zou een lopende weergave van de huidige tijd en datum moeten krijgen.

Vanaf dit punt beschikt u nu over de softwaretools om gegevens in te stellen en op te halen uit uw realtimeklokmodule, en we hopen dat u begrijpt hoe u deze goedkope modules kunt gebruiken.

U kunt meer te weten komen over de specifieke realtime klok-IC's op de website van de fabrikant - DS1307 en DS3231.

Dit bericht aangeboden door pmdway.com - alles voor makers en elektronica-enthousiastelingen, met gratis levering wereldwijd.

Aanbevolen: