สร้างเว็บEngine by iGetWeb.com
Cart รายการสินค้า (0)

arduino ติดต่อ DS1307

arduino ติดต่อ DS1307


บทความนี้นำเสนอการเขียนโปรแกรม arduino ติดต่อ IC DS1307 เพื่อเป็น RTC บอกเวลา เหมาะที่จะทำ นาฬิกาตั้งเวลาหรือ แสดงผลเวลาบน LCD

ต่อ R 2.2k เเลt xtal 32.768  ตามภาพด้านบนนะครับ และอย่าลืม ต่อ Battery back up สำหรับไฟเลี้ยงให้ DS1307 ด้วนนะครับ

code ตัวอย่างการทำงานด้านล่างครับ อย่าลืม ใส่ library #include "Wire.h"  ด้วยนะครับ

ดู OUT PUT ทาง serial monitor ครับ

  
#include "Wire.h" 
#define DS1307_I2C_ADDRESS 0x68 
  
// Convert normal decimal numbers to binary coded decimal 
byte decToBcd(byte val) 

  return ( (val/10*16) + (val%10) ); 

  
// Convert binary coded decimal to normal decimal numbers 
byte bcdToDec(byte val) 

  return ( (val/16*10) + (val%16) ); 

  
// Stops the DS1307, but it has the side effect of setting seconds to 0 
// Probably only want to use this for testing 
/*void stopDs1307() 

  Wire.beginTransmission(DS1307_I2C_ADDRESS); 
  Wire.send(0); 
  Wire.send(0x80); 
  Wire.endTransmission(); 
}*/ 
  
// 1) Sets the date and time on the ds1307 
// 2) Starts the clock 
// 3) Sets hour mode to 24 hour clock 
// Assumes you're passing in valid numbers 
void setDateDs1307(byte second,        // 0-59 
                   byte minute,        // 0-59 
                   byte hour,          // 1-23 
                   byte dayOfWeek,     // 1-7 
                   byte dayOfMonth,    // 1-28/29/30/31 
                   byte month,         // 1-12 
                   byte year)          // 0-99 

   Wire.beginTransmission(DS1307_I2C_ADDRESS); 
   Wire.send(0); 
   Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock 
   Wire.send(decToBcd(minute)); 
   Wire.send(decToBcd(hour));      // If you want 12 hour am/pm you need to set 
                                   // bit 6 (also need to change readDateDs1307) 
   Wire.send(decToBcd(dayOfWeek)); 
   Wire.send(decToBcd(dayOfMonth)); 
   Wire.send(decToBcd(month)); 
   Wire.send(decToBcd(year)); 
   Wire.endTransmission(); 

  
// Gets the date and time from the ds1307 
void getDateDs1307(byte *second, 
          byte *minute, 
          byte *hour, 
          byte *dayOfWeek, 
          byte *dayOfMonth, 
          byte *month, 
          byte *year) 

  // Reset the register pointer 
  Wire.beginTransmission(DS1307_I2C_ADDRESS); 
  Wire.send(0); 
  Wire.endTransmission(); 
  
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7); 
  
  // A few of these need masks because certain bits are control bits 
  *second     = bcdToDec(Wire.receive() & 0x7f); 
  *minute     = bcdToDec(Wire.receive()); 
  *hour       = bcdToDec(Wire.receive() & 0x3f);  // Need to change this if 12 hour am/pm 
  *dayOfWeek  = bcdToDec(Wire.receive()); 
  *dayOfMonth = bcdToDec(Wire.receive()); 
  *month      = bcdToDec(Wire.receive()); 
  *year       = bcdToDec(Wire.receive()); 

  
void setup() 

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  Wire.begin(); 
  Serial.begin(9600); 
  
/* 
  // Change these values to what you want to set your clock to. 
  // You probably only want to set your clock once and then remove 
  // the setDateDs1307 call. 
  
  second = 00; 
  minute = 15; 
  hour   = 22; 
  dayOfWeek  = 5; 
  dayOfMonth = 27; 
  month      = 11; 
  year       = 11; 
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
*/ 

  
void loop() 

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
  
  Serial.print(hour, DEC); 
  Serial.print(":"); 
  Serial.print(minute, DEC); 
  Serial.print(":"); 
  Serial.print(second, DEC); 
  Serial.print("  "); 
  Serial.print(month, DEC); 
  Serial.print("/"); 
  Serial.print(dayOfMonth, DEC); 
  Serial.print("/"); 
  Serial.print(year, DEC); 
//  Serial.print("  Day_of_week:"); 
//  Serial.println(dayOfWeek, DEC); 
  
  delay(1000); 

view