목차
WAT-DS3231 모듈
DS3231 Real Time Clock Module은 날짜,시간을 관리해주는 모듈입니다. 시간 오차가 거의 없으며 정확합니다. (직접 1달 동안 테스트를 해보았는데 오차는 1초 미만이었습니다.)
아두이노와 WAT-DS3231 모듈로 현재 시간 설정, 시간을 읽는 예제입니다.
부품 목록
부품명 | 아두이노 UNO R3 | |
---|---|---|
기능 | 아두이노 모듈 | |
수량 | 1 | |
아두이노 UNO R3 |
부품명 | WAT-DS3221 RealTime Clock Module | |
---|---|---|
기능 | RealTime Clock | |
수량 | 1 EA | |
RealTime Clock |
소스코드
최신 소스코드는 [파일]=>[예제]=>[WhiteAT UNO]=> [DS3231] 에 있으며
라이브러리는 아두이노 개발환경(https://docs.whiteat.com/?page_id=5449) 을 참조하세요
/* WAT-DS3231 를 UNO 에 연결하여 날짜, 시간, 온도를 읽어 오는 예제입니다. 출처: http://whiteat.com/Arduino 부품 . Arduino UNO R3 : https://kit128.com/goods/view?no=337 . DS3231 모듈 : https://kit128.com/goods/view?no=680 . CR2032 백업배터리: https://kit128.com/goods/view?no=301 */ #include <Wire.h> // DS3231 I2C Address #define DS3231_I2C_ADDRESS 104 // 데이터핀 연결 // SCL - pin A5 // SDA - pin A4 byte seconds, minutes, hours, day, date, month, year; char weekDay[4]; byte tMSB, tLSB; float temp3231; void setup() { Wire.begin(); Serial.begin(115200); Serial.println("Arduino Examples - DS3231 Real Time Clock Module"); Serial.println(" https://docs.whiteat.com/?p=7960"); // 날짜, 시간 설정할 때만 사용해야 한다. // setDefaultTime(); } void loop() { getNowTime(); Serial.print(weekDay); Serial.print(", 20"); if (year < 10) Serial.print("0"); Serial.print(year, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(date, DEC); Serial.print(" - "); Serial.print(hours, DEC); Serial.print(":"); Serial.print(minutes, DEC); Serial.print(":"); Serial.print(seconds, DEC); Serial.print(" - Temp: "); Serial.println(getTemperature()); delay(1000); } // BCD 로 변환 (Binary Coded Decimal) byte decToBcd(byte val) { return ((val / 10 * 16) + (val % 10)); } void setDefaultTime() { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x00); Wire.write(decToBcd(00)); // second Wire.write(decToBcd(05)); // minute Wire.write(decToBcd(13)); // hour Wire.write(decToBcd(1)); // 1: sunday, 2: monday, 7: saturday Wire.write(decToBcd(22)); // date Wire.write(decToBcd(01)); // month Wire.write(decToBcd(19)); // year Wire.endTransmission(); } void getNowTime() { Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address Wire.write(0x00); // start at register 0 Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes if (Wire.available()) { seconds = Wire.read(); // get seconds minutes = Wire.read(); // get minutes hours = Wire.read(); // get hours day = Wire.read(); date = Wire.read(); // get date month = Wire.read(); // get month year = Wire.read(); // get year seconds = (((seconds & B11110000) >> 4) * 10 + (seconds & B00001111)); // convert BCD to decimal minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111)); // convert BCD to decimal hours = (((hours & B00110000) >> 4) * 10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode) day = (day & B00000111); // 1-7 date = (((date & B00110000) >> 4) * 10 + (date & B00001111)); // 1-31 month = (((month & B00010000) >> 4) * 10 + (month & B00001111)); //msb7 is century overflow year = (((year & B11110000) >> 4) * 10 + (year & B00001111)); } switch (day) { case 1: strcpy(weekDay, "Sun"); break; case 2: strcpy(weekDay, "Mon"); break; case 3: strcpy(weekDay, "Tue"); break; case 4: strcpy(weekDay, "Wed"); break; case 5: strcpy(weekDay, "Thu"); break; case 6: strcpy(weekDay, "Fri"); break; case 7: strcpy(weekDay, "Sat"); break; } } float getTemperature() { //temp registers (11h-12h) get updated automatically every 64s Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB = Wire.read(); //2's complement int portion tLSB = Wire.read(); //fraction portion temp3231 = (tMSB & B01111111); //do 2's math on Tmsb temp3231 += ((tLSB >> 6) * 0.25); //only care about bits 7 & 8 } else { //error! no data! } return temp3231; }
결과
2019년 1월 22일 13:05:00 로 시간을 설정하고,
1초마다 시간이 변경되는 것을 확인 할 수 있습니다.
백업 배터리를 이용하면 아두이노 전원이 차단되어도 시간이 유지됩니다.
제품 구매
Arduino UNO R3 은 https://kit128.com/goods/view?no=337 에서
WAT-DS3231 RealTimeClock 모듈은 https://kit128.com/goods/view?no=680 에서
CR2032 백업배터리는 https://kit128.com/goods/view?no=301 에서 구매하실 수 있습니다.
.