رباتیک و هوافضا

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

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

به نام خدا

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

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

 

ماژول DS3231 یک زمان سنج بسیار دقیق وارزان است که به سادگی می توان از آن استفاده کرد. این ماژول برای شمارش ثانیه ، دقیقه ، ساعت ، روز ، ماه و سال کاربرد دارد. برای کار کردن همیشگی این ماژول (حتی زمانی که منبع اصلی مدار قطع می شود) می توان از باتری ساعتی استفاده کرد. از آنجا که ماژول DS3231 در داخل خود نوسان ساز دارد، نیازی به نوسان ساز جداگانه ندارد .

قطعات مورد نیاز:

  • بورد آردوینو
  • ماژول DS3231
  • LCD 16 * 2
  • ۲ عدد میکروسوئیچ
  • پتانسیومتر ۱۰ کیلو اهم
  • مقاومت ۳۳۰ کیلو اهمی
  • باتری سکه ای ۳ ولت
  • برد بورد
  • سیم برد بورد

شماتیک مدار:

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

 

در این مدار از دو میکروسوئیچ به نام های 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
}

 

بیشتر بخوانید...  کنترل ال ای دی با استفاده از رزبری پای و ریموت RF

 

دیدگاه‌ها (2)

*
*

    حمیدرضا مهمان دی 12, 1398 پاسخ

    سلام سایت بسیار خوبی دارید و از اینکه این همه مطالب جالب و آموزنده در اختیار علاقه مندان قرار میدهید از شما سپاس گذارم امیدوارم در همه مراحل موفق باشید

      Admin مدیر کل آبان 14, 1399 پاسخ

      سلام
      تشکر، ممنون از همراهیتون