ผู้เขียน หัวข้อ: ตัวอย่าง KidBright with Arduino IDE : อ่านค่า RTC  (อ่าน 763 ครั้ง)

Watchara A.

  • Administrator
  • Sr. Member
  • *****
  • กระทู้: 306
  • Point: +0/-0
  • E25FGL / (alias : E22MHS,E22AAA)
    • ดูรายละเอียด
    • TSE Official Web
ตัวอย่าง KidBright with Arduino IDE : อ่านค่า RTC
« เมื่อ: มีนาคม 29, 2019, 02:17:11 PM »
ตัวอย่าง KidBright with Arduino IDE : อ่านค่า RTC

ตัวอย่างนี้เป็นการอ่านค่าเวลา และตั้งเวลา ด้วย Realtime Clock Module (RTC) บน KidBright และ ส่งค่าผ่าน Serial กลับมาที่ Serial Monitor ของ Arduino

MCP7941x บน KidBright ทำหน้าที่เป็น RTC ต่อกับ I2C Bus ที่ I2C1 ด้วย Address 0x6F

Sourcecode จะแสดงเวลาผ่าน Serial Monitor ทุก 1 วินาที

โค๊ด: [Select]
#include <Wire.h>

#define MCP7941x_RTC_I2C_ADDR 0x6F
#define RTC_LOCATION 0x00
#define WireSend(x) Wire1.write(x)
#define WireReceive() Wire1.read()

byte decToBcd(byte val)
{
 return ( (val/10*16) + (val%10) );
}


byte bcdToDec(byte val)
{
 return ( (val/16*10) + (val%16) );
}

void setDateTime(
  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
{
  Wire1.beginTransmission(MCP7941x_RTC_I2C_ADDR);
  WireSend(RTC_LOCATION);
 
  WireSend(decToBcd(second) & 0x7f);              // set seconds and disable clock (01111111)
  WireSend(decToBcd(minute) & 0x7f);              // set minutes (01111111)
  WireSend(decToBcd(hour) & 0x3f);                // set hours and to 24hr clock (00111111)
  WireSend(0x08 | (decToBcd(dayOfWeek) & 0x07));  // set the day and enable battery backup (00000111)|(00001000)
  WireSend(decToBcd(dayOfMonth) & 0x3f);          // set the date in month (00111111)
  WireSend(decToBcd(month) & 0x1f);               // set the month (00011111)
  WireSend(decToBcd(year));                       // set the year (11111111)
 
  Wire1.endTransmission();

  // Start Clock:
  Wire1.beginTransmission(MCP7941x_RTC_I2C_ADDR);
  WireSend(RTC_LOCATION);
  WireSend(decToBcd(second) | 0x80);     // set seconds and enable clock (10000000)
  Wire1.endTransmission();
}


void enableClock()
{
  // Get the current seconds value as the enable/disable bit is in the same
  // byte of memory as the seconds value:
  Wire1.beginTransmission(MCP7941x_RTC_I2C_ADDR);
  WireSend(RTC_LOCATION);
  Wire1.endTransmission();

  Wire1.requestFrom(MCP7941x_RTC_I2C_ADDR, 1);
 
  int second = bcdToDec(WireReceive() & 0x7f);  // 01111111

  // Start Clock:
  Wire1.beginTransmission(MCP7941x_RTC_I2C_ADDR);
  WireSend(RTC_LOCATION);
  WireSend(decToBcd(second) | 0x80);     // set seconds and enable clock (10000000)
  Wire1.endTransmission();
}

void getDateTime(
  byte *second,
  byte *minute,
  byte *hour,
  byte *dayOfWeek,
  byte *dayOfMonth,
  byte *month,
  byte *year)
{
  Wire1.beginTransmission(MCP7941x_RTC_I2C_ADDR);
  WireSend(RTC_LOCATION);
  Wire1.endTransmission();

  Wire1.requestFrom(MCP7941x_RTC_I2C_ADDR, 7);
 
  // A few of these need masks because certain bits are control bits
  *second     = bcdToDec(WireReceive() & 0x7f);  // 01111111
  *minute     = bcdToDec(WireReceive() & 0x7f);  // 01111111
  *hour       = bcdToDec(WireReceive() & 0x3f);  // 00111111
  *dayOfWeek  = bcdToDec(WireReceive() & 0x07);  // 01111111
  *dayOfMonth = bcdToDec(WireReceive() & 0x3f);  // 00111111
  *month      = bcdToDec(WireReceive() & 0x1f);  // 00011111
  *year       = bcdToDec(WireReceive());         // 11111111
}

void displayDateTime(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
  if (hour < 10) {
    Serial.print("0");
  }

  Serial.print(hour, DEC);
  Serial.print(":");

  if (minute < 10) {
    Serial.print("0");
  }

  Serial.print(minute, DEC);
  Serial.print(":");

  if (second < 10) {
    Serial.print("0");
  }

  Serial.print(second, DEC);
  Serial.print("  ");

  if (dayOfMonth < 10) {
    Serial.print("0");
  }

  Serial.print(dayOfMonth, DEC);
  Serial.print("/");

  if (month < 10) {
    Serial.print("0");
  }

  Serial.print(month, DEC);
  Serial.print("/");

  Serial.print(year, DEC);

  Serial.print(" (");

  switch (dayOfWeek) {
    case 1:
      Serial.print("Sunday");
      break;

    case 2:
      Serial.print("Monday");
      break;

    case 3:
      Serial.print("Tuesday");
      break;

    case 4:
      Serial.print("Wednesday");
      break;

    case 5:
      Serial.print("Thursday");
      break;

    case 6:
      Serial.print("Friday");
      break;

    case 7:
      Serial.print("Saturday");
      break;
  }

  Serial.println(")");
}

void setup() {
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  //while (!Serial);
  Serial.begin(9600);

  Wire1.begin(4, 5);

  second = 0;
  minute = 59;
  hour = 23;
  dayOfWeek = 3;   // 1 = Sunday, 7 = Saturday
  dayOfMonth = 8;
  month = 11;
  year = 11;
  setDateTime(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
  getDateTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  displayDateTime(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}

void loop() {
 
 byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
 
  getDateTime(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  delay(500);
  // Display the Date/Time on the serial line:
  displayDateTime(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
  delay(500);
}

แก้ไขเพิ่มเติมจาก : PIEAcademy - NETPIE-KidBright-Workshop2018
« แก้ไขครั้งสุดท้าย: มีนาคม 29, 2019, 02:30:54 PM โดย Watchara A. »
วัชระ อมศิริ
คณะวิศวกรรมศาสตร์ มหาวิทยาลัยธรรมศาสตร์
99 หมู่ 18 ตำบลคลองหนึ่ง อำเภอคลองหลวง
จังหวัดปทุมธานี 12120
awatchar@engr.tu.ac.th

หมายเหตุ : การแนะนำทางเทคนิคต่างๆ เป็นการแนะนำอย่างง่ายให้มีความเหมาะสมกับการนำไปใช้ของนักเรียน อาจอธิบายไม่ถูกต้องชัดเจนตามหลักวิชาการ ขออภัยมา ณ ที่นี้

lightroomsek

  • บุคคลทั่วไป
ตัวอย่าง KidBright with Arduino IDE อ่านค่า RTC
« ตอบกลับ #1 เมื่อ: กันยายน 10, 2019, 11:38:14 PM »
magnificent idea