
به نام خدا
ساخت ساعت با نمایش زمان و تاریخ با استفاده از آردوینو و ماژول DS3231

ماژول DS3231 یک زمان سنج بسیار دقیق وارزان است که به سادگی می توان از آن استفاده کرد. این ماژول برای شمارش ثانیه ، دقیقه ، ساعت ، روز ، ماه و سال کاربرد دارد. برای کار کردن همیشگی این ماژول (حتی زمانی که منبع اصلی مدار قطع می شود) می توان از باتری ساعتی استفاده کرد. از آنجا که ماژول DS3231 در داخل خود نوسان ساز دارد، نیازی به نوسان ساز جداگانه ندارد .
قطعات مورد نیاز:
- بورد آردوینو
- ماژول DS3231
- LCD 16 * 2
- ۲ عدد میکروسوئیچ
- پتانسیومتر ۱۰ کیلو اهم
- مقاومت ۳۳۰ کیلو اهمی
- باتری سکه ای ۳ ولت
- برد بورد
- سیم برد بورد
شماتیک مدار:

در این مدار از دو میکروسوئیچ به نام های B1 و B2 متصل به پین های ۸ و ۹ آردوینو استفاده شده. میکروسوئیچ B1 برای انتخاب بین پارامتر های زمان(دقیقه ، ساعت ، روز ، ماه و سال) و میکروسوئیچ B2 برای افزایش پارامتر انتخاب شده است.
کد های آردوینو:
در کد های این پروژه از کتابخانه ای استفاده نکرده ایم . راه ارتباطی بین ماژول و آردوینو پروتکل I2C می باشد. کتابخانه Wire برای راه اندازی همین پروتکل استفاده شده.
سیستم کاری ماژول DS3231 در مبنای باینری (BCD) است، کد های زیر برای تبدیل این مبنا به ده دهی و بلعکس استفاده می شود.(مثال برای دقیقه)
تبدیل باینر به ده دهی : (minute = (minute >> 4) * 10 + (minute & 0x0F);
تبدیل ده دهی به باینری : (minute = ((minute / 10) << 4) + (minute % 10);
void DS3231_display() : این تابع زمان و تقویم را (که قبلا به مبنای ده دهی تبدیل شده اند) نمایش می دهد.
void blink_parameter() : این تابع مانند وقفه عمل می کند و تنها زمانی اتفاق می افتد که یکی از میکروسوئیچ ها زده شود. وقتی در حال تغییر یکی از پارامتر ها هستیم این تابع باعث می شود تا آن پارامتر چشمک بزند. طرز کار این تابع به اینصورت است که به جای پارامتر در حال تغییر دو جای خالی (space) به مدت ۲۵۰ میلی ثانیه ظاهر میشود که باعث ناپدید شدن پارامتر از روی صفحه می شود سپس پارامتر به مدت ۲۵۰ میلی ثانیه دوباره پدیدار می شود. تکرار این چرخه، حس چشمک زدن پارامتر را به ما می دهد.
دانلود کد برنامه ساخت ساعت با نمایش زمان و تاریخ با استفاده از آردوینو و ماژول DS3231 :
دانلود فایل/ Real time clock and calendar with set buttons using DS3231 and Arduino
// include LCD library code
#include <LiquidCrystal.h>
// include Wire library code (needed for I2C protocol devices)
#include <Wire.h>
// LCD module connections (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup() {
pinMode(8, INPUT_PULLUP); // button1 is connected to pin 8
pinMode(9, INPUT_PULLUP); // button2 is connected to pin 9
// set up the LCD's number of columns and rows
lcd.begin(16, 2);
Wire.begin(); // Join i2c bus
}
char Time[] = "TIME: : : ";
char Calendar[] = "DATE: / /20 ";
byte i, second, minute, hour, date, month, year;
void DS3231_display(){
// Convert BCD to decimal
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
// End conversion
Time[12] = second % 10 + 48;
Time[11] = second / 10 + 48;
Time[9] = minute % 10 + 48;
Time[8] = minute / 10 + 48;
Time[6] = hour % 10 + 48;
Time[5] = hour / 10 + 48;
Calendar[14] = year % 10 + 48;
Calendar[13] = year / 10 + 48;
Calendar[9] = month % 10 + 48;
Calendar[8] = month / 10 + 48;
Calendar[6] = date % 10 + 48;
Calendar[5] = date / 10 + 48;
lcd.setCursor(0, 0);
lcd.print(Time); // Display time
lcd.setCursor(0, 1);
lcd.print(Calendar); // Display calendar
}
void blink_parameter(){
byte j = 0;
while(j < 10 && digitalRead(8) && digitalRead(9)){
j++;
delay(25);
}
}
byte edit(byte x, byte y, byte parameter){
char text[3];
while(!digitalRead(8)); // Wait until button (pin #8) released
while(true){
while(!digitalRead(9)){ // If button (pin #9) is pressed
parameter++;
if(i == 0 && parameter > 23) // If hours > 23 ==> hours = 0
parameter = 0;
if(i == 1 && parameter > 59) // If minutes > 59 ==> minutes = 0
parameter = 0;
if(i == 2 && parameter > 31) // If date > 31 ==> date = 1
parameter = 1;
if(i == 3 && parameter > 12) // If month > 12 ==> month = 1
parameter = 1;
if(i == 4 && parameter > 99) // If year > 99 ==> year = 0
parameter = 0;
sprintf(text,"%02u", parameter);
lcd.setCursor(x, y);
lcd.print(text);
delay(200); // Wait 200ms
}
lcd.setCursor(x, y);
lcd.print(" "); // Display two spaces
blink_parameter();
sprintf(text,"%02u", parameter);
lcd.setCursor(x, y);
lcd.print(text);
blink_parameter();
if(!digitalRead(8)){ // If button (pin #8) is pressed
i++; // Increament 'i' for the next parameter
return parameter; // Return parameter value and exit
}
}
}
void loop() {
if(!digitalRead(8)){ // If button (pin #8) is pressed
i = 0;
hour = edit(5, 0, hour);
minute = edit(8, 0, minute);
date = edit(5, 1, date);
month = edit(8, 1, month);
year = edit(13, 1, year);
// Convert decimal to BCD
minute = ((minute / 10) << 4) + (minute % 10);
hour = ((hour / 10) << 4) + (hour % 10);
date = ((date / 10) << 4) + (date % 10);
month = ((month / 10) << 4) + (month % 10);
year = ((year / 10) << 4) + (year % 10);
// End conversion
// Write data to DS3231 RTC
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0); // Send register address
Wire.write(0); // Reset sesonds and start oscillator
Wire.write(minute); // Write minute
Wire.write(hour); // Write hour
Wire.write(1); // Write day (not used)
Wire.write(date); // Write date
Wire.write(month); // Write month
Wire.write(year); // Write year
Wire.endTransmission(); // Stop transmission and release the I2C bus
delay(200); // Wait 200ms
}
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 7); // Request 7 bytes from DS3231 and release I2C bus at end of reading
second = Wire.read(); // Read seconds from register 0
minute = Wire.read(); // Read minuts from register 1
hour = Wire.read(); // Read hour from register 2
Wire.read(); // Read day from register 3 (not used)
date = Wire.read(); // Read date from register 4
month = Wire.read(); // Read month from register 5
year = Wire.read(); // Read year from register 6
DS3231_display(); // Diaplay time & calendar
delay(50); // Wait 50ms
}
سلام سایت بسیار خوبی دارید و از اینکه این همه مطالب جالب و آموزنده در اختیار علاقه مندان قرار میدهید از شما سپاس گذارم امیدوارم در همه مراحل موفق باشید
سلام
تشکر، ممنون از همراهیتون