Prog Shield RTC DS3231

Fra HTX Arduino
Spring til navigation Spring til søgning
DS3231 Real Time Clock Modul

Dette er et Real Time Clock modul af typen DS3231, der aflæses via I2C.

Her beskrives kort hvordan man kan læse fra modulet ved hjælp af Arduinoen.

Software

Biblioteket der anvendes ligger på GitHub[1]. Biblioteket downloades og installeres som beskrevet under Arduinos biblioteker.

Til test anvendes rtc_ds3231 der kommer med som eksempel til biblioteket.

Her gennemgås kun dele af modulet - hvis det ikke fungerer, så kan det være fordi Lithium batteriet skal skiftes.

Anvendelsen af softwaren

Som alle andre biblioteker skal der sættes de grundlæggende ting op for at kontakte biblioteket. Der sættes en del variable op, der danner grundlag for kommunikationen. Der anvendes ikke objekter, men blot simple funktioner til at varetage de ting som modulet kan.

#include <Wire.h>
#include "ds3231.h"
#include "rtc_ds3231.h"

#define BUFF_MAX 128

uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 5000;

Inde i setup() skal der sættes gang i den serielle port til test ved hjælp af begin-metoden, og modulet initialiseres som vist her:

void setup() {
    Serial.begin(9600);
    Wire.begin();
    DS3231_init(DS3231_INTCN);
    memset(recv, 0, BUFF_MAX);
    Serial.println("GET time");
}

I loop() læses tiden hvert 5. sekund, det gøres med følgende kode:.

void loop() {
    struct ts t;

    // show time once in a while
    if ((now - prev > interval) && (Serial.available() <= 0)) {
        DS3231_get(&t);

        // there is a compile time option in the library to include unixtime support
#ifdef CONFIG_UNIXTIME
        snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d %ld", t.year,
             t.mon, t.mday, t.hour, t.min, t.sec, t.unixtime);
#else
        snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
             t.mon, t.mday, t.hour, t.min, t.sec);
#endif

        Serial.println(buff);
        prev = now;
    }
}

Ud over dette samles en streng op, indtil den afsluttes med CR og LF (skal indstilles i Serial Monitor). Når der er modtaget en streng, så forsøges den tolket i funktionen parse_cmd() der kan fortolke en del forskellige ting - man kan bl.a. indstille tiden med TssmmhhWddmmyyyy, så uret kan stilles korrekt.

Yderligere muligheder i softwaren

Der ligger yderligere muligheder i biblioteket man kan anvende, hvis man ønsker andre måder at anvende Real Time Clocken på:

void DS3231_init(const uint8_t creg);
void DS3231_set(struct ts t);
void DS3231_get(struct ts *t);

void DS3231_set_addr(const uint8_t addr, const uint8_t val);
uint8_t DS3231_get_addr(const uint8_t addr);

// control/status register
void DS3231_set_creg(const uint8_t val);
void DS3231_set_sreg(const uint8_t val);
uint8_t DS3231_get_sreg(void);

// aging offset register
void DS3231_set_aging(const int8_t val);
int8_t DS3231_get_aging(void);

// temperature register
float DS3231_get_treg(void);

// alarms
void DS3231_set_a1(const uint8_t s, const uint8_t mi, const uint8_t h, const uint8_t d,
                   const uint8_t * flags);
void DS3231_get_a1(char *buf, const uint8_t len);
void DS3231_clear_a1f(void);
uint8_t DS3231_triggered_a1(void);

void DS3231_set_a2(const uint8_t mi, const uint8_t h, const uint8_t d, const uint8_t * flags);
void DS3231_get_a2(char *buf, const uint8_t len);
void DS3231_clear_a2f(void);
uint8_t DS3231_triggered_a2(void);

// helpers
uint32_t get_unixtime(struct ts t);
uint8_t dectobcd(const uint8_t val);
uint8_t bcdtodec(const uint8_t val);
uint8_t inp2toi(char *cmd, const uint16_t seek);

En del af disse funktioner er vist i koden, mens andre kan anvendes hvis man har lyst.

Hardware

Princippet i Real Time Clocken er at den har en 32768 Hz krystal-oscillator kørende uanset om der er strøm til kredsløbet, eller om det kører på det indbyggede Lithium batteri.

Oscillatoren tæller et register med sekunder frem, og dette overloader videre til minutter osv. så der kan læses tidspunkt og dato i modulet.

Kommunikationen med modulet sker gennem I2C.

Layout

DS3231RTC modulets placering på programmerings-shieldet kan ses her:
Layout-DS3231RTC.png
Placering af DS3231RTC - skal vende rigtigt

Referencer

  1. DS3231RTC bibliotek placeret ved GitHub
Programmerings-Shield
Programmerings-Shield Analogt Keyboard - Display - LED'er - Trykknapper - Analog - LM35 - Fugt Sensor - Servo Motor - RF-Transmitter - RF-Receiver - LED-Matrix - RFID-læser - IR-Modtager - GPS1 - GPS2 - Step Motor - Matrix Tastatur - Ultralyd Afstandsmåler - XY Joystick - LED Strip
I2C Enheder I2C Display - Barometer BMP085 - Barometer BMP180 - Accelerometer MMA7660 - Gyroskop MPU6050 - Kompas HMC5883 - Real Time Clock DS1307 - Real Time Clock DS3231 - I2C
Grundlæggende Oversigt - Monteringsvejledning - Testprogram - Programmering Shield Gammel version