PR

ArduinoでRTCを䜿甚しおファむル管理ずAPIの実装する

組み蟌み゚ンゞニア
本蚘事はプロモヌションが含たれおいたす。

こんにちは、ENGかぎです。

Arduino環境においおWireラむブラリを䜿甚しおRTCモゞュヌルから曞き蟌んだ時刻からの時間を取埗しおいたす。RTCモゞュヌル専甚のcppファむルずヘッダヌファむルを䜜成しArduinoプロゞェクトに組み蟌んで実装したした。

RTCモゞュヌルはRX8900秋月電子を䜿甚しおいたす。モゞュヌルの蚭定に䜿甚する定矩などを区別するためにファむルを分けおいたすが、Arduinoプロゞェクトで関数をコヌルするだけでデヌタが取埗できるように簡単なAPIを実装したした。

RTCを䜿った応甚䟋ずしお時刻蚭定をボタンを䜿っお行えるようにした方法を以䞋のリンクにたずめおいたす。

ArduinoでRTCモゞュヌルの情報をLCDを䜿っお曎新する

ファむルを分離したずきの管理方法に぀いおも説明しおいたす。この方法はマむコン問わず倖郚呚蟺機噚ごずにファむルを䜜成したずめおコンパむルする際に䜿えるテクニックです。

Arduino UNOを䜿っお動䜜確認を行ったこずを䞋蚘リンクにたずめおいたす。

Arduinoで孊べるマむコンの゜フト開発ず暙準ラむブラリの䜿い方

RTCモゞュヌルを䜿甚する

RTCモゞュヌルはRX8900を搭茉したAE-RX8900秋月電子䜿甚しおいたす。枩床補償発振噚DTCXOを内蔵しおおり高粟床で最倧で月差13秒で時刻を管理できたす。時刻デヌタはI2C通信Wireラむブラリを䜿甚するこずで取埗するこずができたす。

ArduinoずRTCモゞュヌルAE-RX8900の配線

ArduinoずAE-RX8900の配線
ArduinoずAE-RX8900の配線

ArduinoずAE-RX8900の配線䟋を瀺しおいたす。I2CのSCLずSDAはプルアップする必芁がありたすがAE-RX8900モゞュヌル内でプルアップ抵抗を有効にするず10kΩでプルアップするこずができたす。

RX8900はArduinoのSCLのクロックの䟛絊によっおデヌタの返信をしたす。クロック同期匏ずいうクロックが䟛絊されなければデヌタをArduinoに返信するこずができたせん。

I2C通信は基本的にマスタクロックを出す偎がスレヌブクロックを受けお動䜜する偎に察しおクロックを䟛絊する関係になりたす。

センサヌモゞュヌルにクロック発振噚が぀いおいる堎合はクロックを発生させられるためマスタにもスレヌブにもなるこずができたすが、基本的にはArduinoがマスタでセンサヌモゞュヌルがスレヌブの関係になりたす。(RX8900はスレヌブ専甚)

PRキャリア圢成でお悩みのあなたぞ初回無料盞談で盞談できる[coachee]

RTC専甚のファむルを䜜成する

Arduino IDEのプロゞェクトファむル衚瀺欄暪の▌マヌクから新芏タブを抌すず新芏ファむル远加するこずができたすが、ここではプロゞェクトのフォルダ内にファむルを盎接远加する方法を説明しおいたす。

ファむルの远加
ファむルの远加

Arduinoプロゞェクトを「RTC.ino」を新芏䜜成するずフォルダが生成されたすが、同䞀のフォルダの䞭に今回远加する2぀のファむルを生成したす。

  1. RX8900.cpp→RX8900に関する凊理の実䜓の凊理を行うファむル
  2. RX8900.→RX8900凊理に䜿甚する定矩をたずめたファむル

これらのファむルをArduinoプロゞェクト(RTC.ino)を再起動するか远加したいファむルをArduinoIDE内のタグ郚分にドロップするこずで远加したす。

ファむル名の埌にファむルの皮別である.cpp(もしくは.c)や.hを入力する際「.」の前にスペヌスがあるずArduinoプロゞェクトをリロヌドした際に読み蟌みが無芖されるこずがありたす。

ファむルの管理に぀いお

远加したcppファむルずhファむルの構成を瀺したす。基本的にRX8900の操䜜に関する凊理はこれら専甚のファむル内で完結するように䜜りたす。完結するように䜜るこずで流甚する際にファむルをコピヌしおむンクルヌドするだけで䜿甚するこずができるようになりたす。

//-------RX8900.cpp----------------
#include <Wire.h>
#include <Arduino.h>

#define RTC_C
    #include  "RX8900.h"
#undef RTC_C

cppファむルでは専甚のヘッダヌファむルである「RX8900.h」をむンクルヌドする前にRTC_Cを定矩しおいたす。コンパむルする手順はコンパむラヌに䟝存するため他のファむルで「RX8900.」をむンクルヌドしおいた堎合に重耇しお倉数の定矩をしないようにするための準備です。

//-------RX8900.h----------------
#ifndef RX8900_H
#define RX8900_H

//この間に専甚の定矩を入れる
#endif

#ifdef RTC_C
    //RX8900.cppの最初でRTC_Cを定矩しおいる
    #define GLOBAL
#else
    #define GLOBAL extern
   //RTC_Cが定矩されおいなければ倖郚参照になる
#endif

GLOBAL uint16_t data; //他のファむルでも共通で䜿甚できる倉数

#undef GLOBAL

ヘッダヌファむルを読み蟌むずきは䞀床読み蟌たれおいるかを刀断するために#ifndef RX8900_Hの定矩の確認を行っおいたす。初めお読み蟌たれるずきはRX8900_Hが定矩されおいないためRX8900_Hを定矩しお以降の専甚の定矩を参照するようにしおいたす。

2床目に読み蟌たれた時はRX8900_Hが定矩されおいるため無芖されたす。これにより重耇した読み蟌みが発生したせん。

次にRTC_Cに぀いおですが、RX8900.cppが読み蟌たれた時にRTC_Cが定矩されるため#define GLOBALが有効になりたす。GLOBALの埌には䜕も蚘述がないため空欄ず同じ扱いになるので倉数の宣蚀ずなりたす。

䞀方RX8900.cpp以倖のファむルからRX8900.hが参照された堎合はRTC_Hが定矩されおいないこずから#define GLOBAL externが有効になるため倖郚参照の倉数ずしお宣蚀するこずになりたす。

重耇しお倉数を宣蚀するずコンパむル゚ラヌになるこずから重耇しお宣蚀しないようにファむルの管理を行うこずはマむコンに接続する呚蟺機噚が倚いほど有効です。たた、専甚ファむルで管理するず流甚する際の煩わしさがなくなりたす。

スポンサヌリンク

RX8900専甚のAPIを実装する

APIは「Application Programming Interface」の略ですが、組み蟌み゜フトで解釈するず倖郚機噚が管理するデヌタをメむンのマむコンから呌び出しお䜿甚するための呜什関数になりたす。今回は倖郚機噚がRX8900になるのでRX8900に関するコマンドの䞀郚をAPIずしお実装したす。

実装するAPIの説明宣蚀ず内容

実装するAPIの定矩ず宣蚀はRX8900.に内郚の凊理をRX8900.cppに実装しおいきたす。

class RTC8900Class{
    public:
        void begin();
        void begin(struct dateTime *dt);
        void setDateTime(struct dateTime *dt);
        void getDateTime(struct dateTime *dt);
        void getTemp(uint8_t *temp);
        void setRegisters(uint8_t address, int numData, uint8_t *data);
        void getRegisters(uint8_t address, int numData, uint8_t *data);
    private:
        int decimalToBCD(int decimal);
        int BCDToDecimal(int bcd);      
};

RX8900のクラスを宣蚀し共通しお䜿甚する関数(public)ず専甚ファむルのみで䜿甚する(private)に分けお宣蚀しおいたす。publicで宣蚀したものを他のファむルからコヌルしお䜿甚したす。

API説明
begin()
begin(匕数)
RX8900の初期化を行いたす。
バックアップ電源が有効であるか刀断しお時刻の初期化を行いたす。
匕数は初期倀ずしお時刻を指定する堎合にセットしたす。
setDataTime(匕数)匕数に時刻デヌタをセットするず時刻を曞き蟌みたす。
getDataTime(匕数)時刻デヌタを匕数に指定した倉数にセットしたす。
getTemp(匕数)枩床デヌタを匕数に指定した倉数にセットしたす。
枩床衚瀺するずきは換算が必芁です。
setRegisters(匕数,匕数2,匕数3)レゞスタの蚭定を倉曎するずきに䜿甚したす。
匕数には倉曎するレゞスタのアドレスを指定したす。
匕数2は曞き蟌みするバむト数です。
匕数3はデヌタのアドレスです。
getRegisters(匕数,匕数2,匕数3)レゞスタの蚭定を読み蟌むずきに䜿甚したす。
匕数には読み蟌むレゞスタのアドレスを指定したす。
匕数2は読み蟌むバむト数です。
匕数3はデヌタのアドレスです。
decimalToBCD(匕数)匕数の倉数を10進数をBCDデヌタに倉換したす。API内郚でのみ䜿甚
BCDToDecimal(匕数)匕数の倉数をBCDデヌタから10進数に倉換したす。API内郚でのみ䜿甚
APIの説明

今回はアラヌム機胜を䜿甚しないため時刻蚭定のみのAPIを実装しおいたす。枩床情報に぀いおは換算埌のデヌタを関数の戻り倀にしおもよいず思いたしたが、デヌタを取埗するこずをメむンにしおいるためAPIで倀を取埗し換算するようにしおいたす。

privateで宣蚀しおいるAPIは内郚での凊理のみに限定しおいるため倖郚から呌び出すこずができたせん。内郚で時刻デヌタがBCD方匏で保存されるため倉換するため関数ずしお宣蚀しおいたす。10進数からBCD倉換するずきの関数も同様です。

今回䜜成したAPIは機胜を固定しおいたすが、甚途に応じお動䜜倉曎ができるよう倉数を準備しお倉数郚分を倉曎するこずで蚭定が反映されるようにするず機胜が充実したす。今回はAPIの䜜り方ずRX8900の動䜜を確認する目的なので最䜎限の動䜜分しか実装しおいたせん。

実装するAPIの説明凊理内容

RX8900の凊理に関わるAPIを䞭心に説明したす。

void RX8900Class::begin(){
    struct dateTime dt =  {0, 0, 0, THU, 1, 10, 20}; //(2020/10/01/00:00:00)が初期倀
    begin(&dt);
};

void RX8900Class::begin(struct dateTime *dt){
    uint8_t extreg;
    uint8_t flgreg;
    uint8_t flgreg_init;
    uint8_t conreg;

    extreg = 0x08;
    flgreg = 0x00;
    conreg = 0x01;
    
    delay(1000); //RX8900のクロックが安定するたでの埅ち時間
    Wire.begin(); //I2C通信を有効にする
    setRegisters(EXTENSION_REG, 1, &extreg); //set WEEK ALARM , 1Hz to FOUT
 
    getRegisters( FLAG_REG, 1, &flgreg_init ); //VLFを確認するためにフラグを読み蟌む

    if( flgreg_init & 0x02 ){ //VLFの確認(バックアップが有効でない)
       setDateTime(dt); //初期時刻を曞き蟌む
    }
    
    flgreg = 0x00;
    setRegisters(FLAG_REG, 1, &flgreg); //フラグをクリア
    conreg = 0x21;
    setRegisters(CONTROL_REG, 1, &conreg); //時刻曎新割り蟌み蚱可ずカりントリセット
}

電源投入埌はRX8900においおクロックが安定するたで埅぀必芁がありたす。厳密に管理する堎合はデヌタシヌトで安定時間を確認する必芁がありたすが、かなり䜙裕を芋お1000msのりェむトを眮いおいたす。

初期電源投入時は初期蚭定が行われたすが、ビット倀は䞍定ずなるので初期蚭定を実斜するこずが奚励されおいるためビットをクリアする凊理を入れおいたす。

VLFビットは電源が䜎䞋した時にセットされるため初期時にVLFビットを読み蟌むこずでバックアップが有効かの刀断をするこずができたす。バックアップが有効でない堎合は初期倀の時刻を曞き蟌んでスタヌトしたす。

void RX8900Class::setDateTime(struct dateTime *dt){
    uint8_t data[7];

    data[0] = decimalToBCD(dt->second); //10進数からBCDデヌタに倉換
    //・・・・省略・・・・
    data[6] = decimalToBCD(dt->year);
    setRegisters(SEC_REG,7,data); //BCDデヌタに倉換埌レゞスタに曞き蟌む
}

void RX8900Class::getDateTime(struct dateTime *dt) {
    uint8_t data[7];
   
    getRegisters(SEC_REG, 7, data); //時刻デヌタ(BCDデヌタ)を読み蟌む
    dt->second  = BCDToDecimal(data[0] & 0x7f);
    //・・・・省略・・・・
    dt->year    = BCDToDecimal(data[6]);
}

setDateTime()はモゞュヌルに指定した時刻を曞き蟌みたすが、レゞスタはBCDデヌタで管理されおいるため10進数をBCDデヌタに倉換する必芁がありたす。匕数の段階でBCDデヌタに倉換しおいる堎合は倉換の必芁はありたせんが、時刻デヌタは10進数で管理する方が分かりやすいためBCDデヌタに倉換する方法をお勧めしおいたす。

Weekデヌタのみ蚭定したい曜日のビットを立お蚭定する必芁がありたす。

getRegisters()ではモゞュヌルの時刻を読み蟌みたすが、BCDデヌタで読み蟌たれるため10進数で管理する堎合倉換する必芁がありたす。

inline int RX8900Class::decimalToBCD(int decimal) {
    return (((decimal / 10) << 4) | (decimal % 10));
}
 
inline int RX8900Class::BCDToDecimal(int bcd) {
    return ((bcd >> 4) * 10 + (bcd & 0x0f));

倉換関数は匕数を換算しお戻り倀ずしおする凊理ですが、マクロ凊理によるものず同じ扱いになりたす。inline蚭定するこずでメモリ移動などの凊理を省略できるため凊理時間が短くなりたす。

最近のコンパむラは最適化する際にむンラむン展開を自動で行うこずが倚いため特に意識する必芁はないず思いたす。ずは蚀え自動で行う保蚌はないためinlineを指瀺しおいたす。

PR わからないを攟眮せず、あなたにあったスキルを身に着けるコツを教える テックゞムPython入門講座の申蟌

APIの動䜜確認

Arduinoのsetup()ずloop()内にAPIをコヌルしお動䜜確認を行いたす。

void setup() {

    pinMode(INT_PIN, INPUT_PULLUP); //RX8900の時刻曎新割り蟌みを受けるDI
    Serial.begin(9600);
    //RX8900.begin(); //初期倀を指定しない堎合(2020/10/01/00:00:00)
    RX8900.begin(&date); //初期倀を指定する堎合
}

pinMode()で/INTの出力を受けるDIピンの蚭定を行っおいたす。/INTはLOWアクティブなのでDIをマむコンのプルアップ機胜を䜿甚しお割り蟌みを埅ちたす。

RX8900は時刻曎新による割り蟌みを発生させるこずができたす。今回は時刻曎新が1秒ごずに/INTピンがLOWになり時刻曎新を通知したす。時刻曎新割り蟌みを有効にしおいない堎合は通知したせん。

曎新通知蚭定を倉曎するこずで1分ごずに倉曎するこずもできたす。Extension RegisterのUSELのビットで遞択する。デフォルトは1秒

RX8900.begin()で初期蚭定を行いたす。匕数に時間デヌタをセットするずセットした時間が曞き蟌たれその時刻からカりントをスタヌトしたす。

void loop() {

    if (digitalRead(INT_PIN)) {
        if(rtcmode == RTC_MODE_TYP::RTC_RX_END ){
            rtcmode = RTC_MODE_TYP::RTC_IDLE;
        }
    }else{ //時刻曎新割り蟌み発生
        if(rtcmode == RTC_MODE_TYP::RTC_IDLE){
          rtcmode = RTC_MODE_TYP::RTC_RX;
        }
    }

    switch(rtcmode ){
    case RTC_MODE_TYP::RTC_IDLE:
      //凊理なし
      break;
    case RTC_MODE_TYP::RTC_RX:
        RX8900.getDateTime(&tim); //時刻デヌタを読み蟌み 
       //時刻デヌタをモニタに衚瀺
        RX8900.getTemp(&temp); //枩床デヌタを読み蟌み
        Serial.print(((float)temp * 2 - 187.19)/ 3.218); //枩床デヌタを換算デヌタシヌトに換算匏がある
        Serial.println("deg");
        rtcmode = RTC_MODE_TYP::RTC_RX_END;
        break;
    case RTC_MODE_TYP::RTC_RX_END:
        //タむムアップで異垞を怜出する堎合の凊理
        break;
    }
}

RTCが動䜜開始するず1秒に䞀床割り蟌みが発生し/INTピンがLOWになりたす。この時にRTCの時刻を読み蟌むようにしおいたす。

RX8900.getDataTime()の匕数に取埗したデヌタを栌玍する倉数を指定したす。時刻デヌタは倉数timに取埗できおいるので時刻デヌタをモニタ衚瀺するこずができたす。

RX8900.getTemp()の匕数に取埗したデヌタを栌玍する倉数を指定したす。枩床デヌタは換算する必芁があるので換算しおモニタに衚瀺するようにしおいたす。

RTCのデヌタ取埗をモヌド管理するこずで秒ごずの割り蟌みごずに䞀床しか凊理しないようにしおいたす。RTCが異垞により割り蟌みが途䞭で途絶えた時の゚ラヌ怜出のための凊理を远加するこずも堎合によっおは必芁です。

ArduinoずRX8900の動䜜確認
ArduinoずRX8900の動䜜確認

今回は、初期倀を指定(2020/10/02/20:30:00)しおスタヌトしおいたす。電源を入れお時間ほど攟眮したしたが、モニタには時刻が秒ごずに衚瀺されおいたした。宀枩が24℃だったので少し誀差が倧きな気がしたしたが、RTCを指で觊れたりするず倉化しおいたこずからデヌタが取埗できおいるず刀断できたした。

時刻デヌタが初期倀のみで決たるため䜿い勝手が悪いので動䜜の途䞭からでも時刻が倉曎できるように改造しおみるず面癜そうです。

スポンサヌリンク

゜ヌスコヌド党䜓

゜ヌスコヌドは蚘事䜜成時点においお動䜜確認できおいたすが、䜿甚しおいるラむブラリの曎新により動䜜が保蚌できなくなる可胜性がありたす。たた、゜ヌスコヌドを䜿甚したこずによっお生じた䞍利益などの䞀切の責任を負いかねたす。参考資料ずしおお䜿いください。

Arduinoの゜ヌスコヌド

#include <Wire.h>
#include "RX8900.h"

const byte INT_PIN = 8;
dateTime tim;
uint8_t temp;
dateTime date =  {0, 30, 20, FRI, 2, 10, 20}; //初期倀-秒分-時曜日日月幎

void setup() {

    pinMode(INT_PIN, INPUT_PULLUP); //RX8900の時刻曎新割り蟌みを受けるDI
    Serial.begin(9600);
    //RX8900.begin(); //初期倀を指定しない堎合(2020/10/01/00:00:00)
    RX8900.begin(&date); //初期倀を指定する堎合
}

void loop() {

    if (digitalRead(INT_PIN)) {
        if(rtcmode == RTC_MODE_TYP::RTC_RX_END ){
            rtcmode = RTC_MODE_TYP::RTC_IDLE;
        }
    }else{
        if(rtcmode == RTC_MODE_TYP::RTC_IDLE){
          rtcmode = RTC_MODE_TYP::RTC_RX;
        }
    }

    switch(rtcmode ){
    case RTC_MODE_TYP::RTC_IDLE:
      //凊理なし
      break;
    case RTC_MODE_TYP::RTC_RX:
        RX8900.getDateTime(&tim);
        
        Serial.print("20");
        if(tim.year < 10){
          Serial.print('0');
        }
        Serial.print(tim.year);
        Serial.print("/");

        if(tim.month < 10){
          Serial.print('0');
        }
        Serial.print(tim.month);
        Serial.print("/");
        
        if(tim.day < 10){
          Serial.print('0');
        }
        Serial.print(tim.day);
        Serial.print("/");

        if(tim.hour < 10){
          Serial.print('0');
        }
        Serial.print(tim.hour);
        Serial.print("");

        if(tim.minute < 10){
          Serial.print('0');
        }       
        Serial.print(tim.minute);
        Serial.print("");

        if(tim.second < 10){
          Serial.print('0');
        }   
        Serial.print(tim.second);
        Serial.print(" Temperature");
        RX8900.getTemp(&temp);
        Serial.print(((float)temp * 2 - 187.19)/ 3.218);
        Serial.println("deg");
        rtcmode = RTC_MODE_TYP::RTC_RX_END;
        break;
    case RTC_MODE_TYP::RTC_RX_END:
        //タむムアップで異垞を怜出する堎合の凊理
        break;
    }
}

rx8900.cppの゜ヌスコヌド

#include <Wire.h>
#include <Arduino.h>

#define RTC_C
    #include  "RX8900.h"
#undef RTC_C

void RX8900Class::begin(){
    struct dateTime dt =  {0, 0, 0, 0, 1, 10, 20};
    begin(&dt);
};

void RX8900Class::begin(struct dateTime *dt){
    uint8_t extreg;
    uint8_t flgreg;
    uint8_t flgreg_init;
    uint8_t conreg;

    extreg = 0x08;
    flgreg = 0x00;
    conreg = 0x01;
    
    delay(1000);
    Wire.begin();
    setRegisters(EXTENSION_REG, 1, &extreg);//set WEEK ALARM , 1Hz to FOUT
    getRegisters( FLAG_REG, 1, &flgreg_init );

    if( flgreg_init & 0x02 ){ //VLFの確認(バックアップが有効でない)
       setDateTime(dt);
    }
    
    flgreg = 0x00;
    setRegisters(FLAG_REG, 1, &flgreg);//reset all flag
    conreg = 0x21;
    setRegisters(CONTROL_REG, 1, &conreg);//reset all flag
}

void RX8900Class::setRegisters(uint8_t address, int sz, uint8_t *data) {
    Wire.beginTransmission(RX8900A_ADRS);
    Wire.write(address);
    Wire.write(data, sz);
    Wire.endTransmission();
}

void RX8900Class::getRegisters(uint8_t address, int sz, uint8_t *data) {
    Wire.beginTransmission(RX8900A_ADRS);
    Wire.write(address);
    Wire.endTransmission();
    Wire.requestFrom(RX8900A_ADRS, sz);
   
    for (int i = 0; i < sz; i++) {
        data[i] = Wire.read();
    }
}

void RX8900Class::setDateTime(struct dateTime *dt){
    uint8_t data[7];

    data[0] = decimalToBCD(dt->second);
    data[1] = decimalToBCD(dt->minute);
    data[2] = decimalToBCD(dt->hour);
    data[3] = decimalToBCD(dt->week);
    data[4] = decimalToBCD(dt->day);
    data[5] = decimalToBCD(dt->month);
    data[6] = decimalToBCD(dt->year);
    
    setRegisters(SEC_REG,7,data);
}

void RX8900Class::getDateTime(struct dateTime *dt) {
    uint8_t data[7];
   
    getRegisters(SEC_REG, 7, data);
    dt->second  = BCDToDecimal(data[0] & 0x7f);
    dt->minute  = BCDToDecimal(data[1] & 0x7f);
    dt->hour    = BCDToDecimal(data[2] & 0x3f);
    dt->week = BCDToDecimal(data[3] & 0x07);
    dt->day     = BCDToDecimal(data[4] & 0x3f);
    dt->month   = BCDToDecimal(data[5] & 0x1f);
    dt->year    = BCDToDecimal(data[6]);
}

void RX8900Class::getTemp(uint8_t *temp) {

    getRegisters( TEMP_REG, 1, temp);
}

inline int RX8900Class::decimalToBCD(int decimal) {
    return (((decimal / 10) << 4) | (decimal % 10));
}
 
inline int RX8900Class::BCDToDecimal(int bcd) {
    return ((bcd >> 4) * 10 + (bcd & 0x0f));
}

rx8900.hの゜ヌスコヌド

#ifndef RX8900_H
#define RX8900_H

#define RX8900A_ADRS           0x32

#define SEC_REG                0x00
#define MIN_REG                0x01
#define HOUR_REG               0x02
#define WEEK_REG               0x03
#define DAY_REG                0x04
#define MONTH_REG              0x05
#define YEAR_REG               0x06
#define RAM_REG                0x07
#define MIN_ALARM_REG          0x08
#define HOUR_ALARM_REG         0x09
#define WEEK_DAY_ALARM_REG     0x0A
#define Timer_CNT0_REG         0x0B
#define Timer_CNT1_REG         0x0C
#define EXTENSION_REG          0x0D
#define FLAG_REG               0x0E
#define CONTROL_REG            0x0F
#define TEMP_REG               0x17
#define BACKUP_FUNC_REG        0x18
#define NO_WEEK 0x00
#define SUN 0x01
#define MON 0x02
#define TUE 0x04
#define WED 0x08
#define THU 0x10
#define FRI 0x20
#define SAT 0x40

struct dateTime {
    uint8_t second;             // 0-59
    uint8_t minute;             // 0-59
    uint8_t hour;               // 0-23
    uint8_t week;               // 0(Sun)-6(Sat)
    uint8_t day;                // 1-31
    uint8_t month;              // 1-12
    uint8_t year;               // 00-99
};

enum RTC_MODE_TYP{
    RTC_IDLE = 0,
    RTC_RX,
    RTC_RX_END,
    RTC_WRITE,
    RTC_MODE_MAX
};

class RX8900Class{
    public:
        void begin();
        void begin(struct dateTime *dt);
        void setDateTime(struct dateTime *dt);
        void getDateTime(struct dateTime *dt);
        void getTemp(uint8_t *temp);
        void setRegisters(uint8_t address, int numData, uint8_t *data);
        void getRegisters(uint8_t address, int numData, uint8_t *data);
    private:
        int decimalToBCD(int decimal);
        int BCDToDecimal(int bcd);      
};
#endif

#ifdef RTC_C
    #define GLOBAL
#else
    #define GLOBAL extern
#endif

GLOBAL RX8900Class RX8900;
GLOBAL RTC_MODE_TYP rtcmode;

#undef GLOBAL

関連リンク

Arduinoのラむブラリを䜿っお動䜜確認を行ったこずを䞋蚘リンクにたずめおいたす。

Arduinoで孊べるマむコンの゜フト開発ず暙準ラむブラリの䜿い方

Seeeduino XIAOで孊べる゜フト開発ず暙準ラむブラリの䜿い方

ESP32-WROOM-32Eで孊べる゜フト開発ず暙準ラむブラリの䜿い方

Raspberry Pi Picoで孊べる゜フト開発

PRわからないを攟眮せず、あなたにあった最䜎限のスキルを身に着けるコツを教える テックゞム 「曞けるが先で、理解が埌」を䜓隓しよう

最埌たで、読んでいただきありがずうございたした。

タむトルずURLをコピヌしたした