Real-Time Clock MODULE USING DS1307
ماژول ساعت زمان واقعی با استفاده از DS1307
مدار مجتمع (IC)
نمایشگر LED
ولتاژ ورودی
ولتاژ ورودی
ورودی / خروجی
ورودی / خروجی
ورودی / خروجی

لیست المان های NSE-RMDS
Quantity | Code | Symbol |
---|---|---|
1 | DS1307 | IC |
1 | 32.768KHz | X |
1 | 1K | R |
3 | 4K7 | R |
2 | 22pF | C |
1 | 100nF | C |
1 | 3mm LED | LED |
1 | Battery Holder | BH |
1 | Battery 3V | B |
5pin | 1x5 SIL Right-Angle Male | Pin Header |
4cm x 3cm | Single Side with Solder Mask and Helper | PCB |
در واقع این ماژول ساعت زمان واقعی Real Time Clock(RTC) بوده که از پروتکل سریال I2C پشتیبانی می کند. کارکرد این ماژول براساس کدهای Binary Coded Decimal که اصطلاحا کد BCD نامیده می شود است.
باتری بک آپ قرار گرفته بر روی این ماژول زمانیکه برق در دسترس نیست باعث جلوگیری از عقب افتادن زمان خواهد شد. منبع کلاک این آی سی از یک کریستال ساعت به فرکانس 32.768KHZ استفاده می کند. این آی سی قابل کارکرد در دو حالت 24ساعته و12ساعته AM/PM را دارد همچنین علاوه بر ساعت بصورت ثانیه، دقیقه، ساعت امکان ذخیره تاریخ بصورت روز، هفته، ماه، سال، ایام هفته را نیز دارد. در ضمن اطلاعات نوشته شده بر روی این آی سی تا سال 2100 برنامه ریزی شده است.
ترتیب پایه های پایه های ds1307
پایه ۱ و ۲ ) به کریستال ساعت (۳۲٫۷۶۸khz) متصل می شود.
پایه ۳ ) به باطری وصل می شود.
پایه ۴ ) به زمین است.
پایه ۵ ) SDA ارسال و دریافت اطلاعات از طریق پورت I2C است.
پایه ۶ ) SCL که کلاک هماهنگی بین میکروکنترلر AVR و آی سی ds1307 است.
پایه ۷ ) این پایه خروجی پالس مربعی با فرکانس های 1HZ – 4.096KHZ – 8.192KHZ – 32.768KHZ است که میتوان آن را در کدویژن راهاندازی کرد.
پایه ۸ ) به VCC وصل می شود. ( 5 VOLT )
نکته: پایه های SDA , SCL را باید با مقاومت پول اپ کرد. چرا؟ طبق استاندارد I2C.
برای خواندن و نوشتن اطلاعات از دستورات زیر استفاده میکنیم.(که به صورت کتابخانه باید اضافه شود)
این دستور مقدار اولیه ساعت ، دقیقه و ثانیه را صفر میکند.
/**
Arduino Digital Alarm Clock
bY: Farhad Nikkhah
https://www.NikiSite.com
https://www.nikisite.com/product/nse-7sa4/
https://www.nikisite.com/product/nse-rmds/
https://www.nikisite.com/product/nse-keyx/
*/
//==========================================================================================
#include
#include "Button.h"
#include "AlarmTone.h"
#include "Clock.h"
#include "config.h"
const int COLON_PIN = 13;
const int SPEAKER_PIN = A3;
Button hourButton(A0);
Button minuteButton(A1);
Button alarmButton(A2);
AlarmTone alarmTone;
Clock clock;
SevSeg sevseg;
enum DisplayState {
DisplayClock,
DisplayAlarmStatus,
DisplayAlarmTime,
DisplayAlarmActive,
DisplaySnooze,
};
DisplayState displayState = DisplayClock;
long lastStateChange = 0;
void changeDisplayState(DisplayState newValue) {
displayState = newValue;
lastStateChange = millis();
}
long millisSinceStateChange() {
return millis() - lastStateChange;
}
void setColon(bool value) {
digitalWrite(COLON_PIN, value ? LOW : HIGH);
}
//==========================================================================================
void displayTime() {
DateTime now = clock.now();
bool blinkState = now.second() % 2 == 0;
sevseg.setNumber(now.hour() * 100 + now.minute());
setColon(blinkState);
}
//==========================================================================================
void clockState() {
displayTime();
if (alarmButton.read() == Button::RELEASED && clock.alarmActive()) {
// Read alarmButton has_changed() to clear its state
alarmButton.has_changed();
changeDisplayState(DisplayAlarmActive);
return;
}
if (hourButton.pressed()) {
clock.incrementHour();
}
if (minuteButton.pressed()) {
clock.incrementMinute();
}
if (alarmButton.pressed()) {
clock.toggleAlarm();
changeDisplayState(DisplayAlarmStatus);
}
}
//==========================================================================================
void alarmStatusState() {
setColon(false);
sevseg.setChars(clock.alarmEnabled() ? " on" : " off");
if (millisSinceStateChange() > ALARM_STATUS_DISPLAY_TIME) {
changeDisplayState(clock.alarmEnabled() ? DisplayAlarmTime : DisplayClock);
return;
}
}
//==========================================================================================
void alarmTimeState() {
DateTime alarm = clock.alarmTime();
sevseg.setNumber(alarm.hour() * 100 + alarm.minute(), -1);
if (millisSinceStateChange() > ALARM_HOUR_DISPLAY_TIME || alarmButton.pressed()) {
changeDisplayState(DisplayClock);
return;
}
if (hourButton.pressed()) {
clock.incrementAlarmHour();
lastStateChange = millis();
}
if (minuteButton.pressed()) {
clock.incrementAlarmMinute();
lastStateChange = millis();
}
if (alarmButton.pressed()) {
changeDisplayState(DisplayClock);
}
}
//==========================================================================================
void alarmState() {
displayTime();
if (alarmButton.read() == Button::RELEASED) {
alarmTone.play();
}
if (alarmButton.pressed()) {
alarmTone.stop();
}
if (alarmButton.released()) {
alarmTone.stop();
bool longPress = alarmButton.repeat_count() > 0;
if (longPress) {
clock.stopAlarm();
changeDisplayState(DisplayClock);
} else {
clock.snooze();
changeDisplayState(DisplaySnooze);
}
}
}
//==========================================================================================
void snoozeState() {
sevseg.setChars("****");
if (millisSinceStateChange() > SNOOZE_DISPLAY_TIME) {
changeDisplayState(DisplayClock);
return;
}
}
//==========================================================================================
void setup() {
Serial.begin(115200);
clock.begin();
hourButton.begin();
hourButton.set_repeat(500, 200);
minuteButton.begin();
minuteButton.set_repeat(500, 200);
alarmButton.begin();
alarmButton.set_repeat(1000, -1);
alarmTone.begin(SPEAKER_PIN);
pinMode(COLON_PIN, OUTPUT);
byte digits = 4;
byte digitPins[] = { 2, 3, 4, 5 };
byte segmentPins[] = { 6, 7, 8, 9, 10, 11, 12 };
bool resistorsOnSegments = false;
bool updateWithDelays = false;
bool leadingZeros = true;
bool disableDecPoint = true;
sevseg.begin(DISPLAY_TYPE, digits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
//==========================================================================================
void loop() {
sevseg.refreshDisplay();
switch (displayState) {
case DisplayClock:
clockState();
break;
case DisplayAlarmStatus:
alarmStatusState();
break;
case DisplayAlarmTime:
alarmTimeState();
break;
case DisplayAlarmActive:
alarmState();
break;
case DisplaySnooze:
snoozeState();
break;
}
}
دیدگاهها
پاکسازی فیلترهیچ دیدگاهی برای این محصول نوشته نشده است.