ããã«ã¡ã¯ã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ã®é ç·äŸã瀺ããŠããŸããI2Cã®SCLãšSDAã¯ãã«ã¢ããããå¿ èŠããããŸããAE-RX8900ã¢ãžã¥ãŒã«å ã§ãã«ã¢ããæµæãæå¹ã«ãããš10kΩã§ãã«ã¢ããããããšãã§ããŸãã
RX8900ã¯Arduinoã®SCLã®ã¯ããã¯ã®äŸçµŠã«ãã£ãŠããŒã¿ã®è¿ä¿¡ãããŸããïŒã¯ããã¯åæåŒãšããïŒã¯ããã¯ãäŸçµŠãããªããã°ããŒã¿ãArduinoã«è¿ä¿¡ããããšãã§ããŸããã
I2Céä¿¡ã¯åºæ¬çã«ãã¹ã¿ïŒã¯ããã¯ãåºãåŽïŒãã¹ã¬ãŒãïŒã¯ããã¯ãåããŠåäœããåŽïŒã«å¯ŸããŠã¯ããã¯ãäŸçµŠããé¢ä¿ã«ãªããŸãã
ã»ã³ãµãŒã¢ãžã¥ãŒã«ã«ã¯ããã¯çºæ¯åšãã€ããŠããå Žåã¯ã¯ããã¯ãçºçããããããããã¹ã¿ã«ãã¹ã¬ãŒãã«ããªãããšãã§ããŸãããåºæ¬çã«ã¯Arduinoããã¹ã¿ã§ã»ã³ãµãŒã¢ãžã¥ãŒã«ãã¹ã¬ãŒãã®é¢ä¿ã«ãªããŸãã(RX8900ã¯ã¹ã¬ãŒãå°çš)
PRïŒãã£ãªã¢åœ¢æã§ãæ©ã¿ã®ããªããžïŒååç¡æçžè«ã§çžè«ã§ãã[coachee]
RTCå°çšã®ãã¡ã€ã«ãäœæãã
Arduino IDEã®ãããžã§ã¯ããã¡ã€ã«è¡šç€ºæ¬æšªã®âŒããŒã¯ããæ°èŠã¿ããæŒããšæ°èŠãã¡ã€ã«è¿œå ããããšãã§ããŸãããããã§ã¯ãããžã§ã¯ãã®ãã©ã«ãå ã«ãã¡ã€ã«ãçŽæ¥è¿œå ããæ¹æ³ã説æããŠããŸãã

Arduinoãããžã§ã¯ãããRTC.inoããæ°èŠäœæãããšãã©ã«ããçæãããŸãããåäžã®ãã©ã«ãã®äžã«ä»å远å ãã2ã€ã®ãã¡ã€ã«ãçæããŸãã
- RX8900.cppâRX8900ã«é¢ããåŠçã®å®äœã®åŠçãè¡ããã¡ã€ã«
- 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ã§å€ãååŸãæç®ããããã«ããŠããŸãã
privateã§å®£èšããŠããAPIã¯å éšã§ã®åŠçã®ã¿ã«éå®ããŠããããå€éšããåŒã³åºãããšãã§ããŸãããå éšã§æå»ããŒã¿ãBCDæ¹åŒã§ä¿åããããã倿ãããã颿°ãšããŠå®£èšããŠããŸãã10鲿°ããBCD倿ãããšãã®é¢æ°ãåæ§ã§ãã
å®è£ ãã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ããŒã¿ã«å€æããæ¹æ³ããå§ãããŠããŸãã
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èšå®ããããšã§ã¡ã¢ãªç§»åãªã©ã®åŠçãçç¥ã§ããããåŠçæéãçããªããŸãã
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ãç°åžžã«ããå²ã蟌ã¿ãéäžã§éçµ¶ããæã®ãšã©ãŒæ€åºã®ããã®åŠçã远å ããããšãå Žåã«ãã£ãŠã¯å¿ èŠã§ãã

ä»åã¯ãåæå€ãæå®(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ã§åŠã¹ããœããéçº
æåŸãŸã§ãèªãã§ããã ãããããšãããããŸããã


ä»åäœæããAPIã¯æ©èœãåºå®ããŠããŸãããçšéã«å¿ããŠåäœå€æŽãã§ãããã倿°ãæºåããŠå€æ°éšåã倿Žããããšã§èšå®ãåæ ãããããã«ãããšæ©èœãå å®ããŸããä»åã¯APIã®äœãæ¹ãšRX8900ã®åäœã確èªããç®çãªã®ã§æäœéã®åäœåããå®è£ ããŠããŸããã