Clock  時鐘、時間

[材料]

Arduino主板 x 1

麵包板 x 1

DS1307RTC x 1


[函式庫]

TimeLib.h:https://github.com/PaulStoffregen/Time

DS1307RTC.h:https://github.com/PaulStoffregen/DS1307RTC

[DS1307RTC腳位]

SCL -->  A5

SDA  -->  A4

VCC  -->  5V

GND  -->  GND

其他都不用插

設定時間(第一次使用)


/*

DS1307RTC_1SetTime


SQ --> 不用插

DS --> 不用插

SCL --> A5

SDA --> A4

VCC --> 5V

GND --> GND

BAT --> 不用插

*/


#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>


const char *monthName[12] = {

  "Jan", "Feb", "Mar", "Apr", "May", "Jun",

  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};


tmElements_t tm;


void setup() {

  bool parse=false;

  bool config=false;


  // get the date and time the compiler was run

  if (getDate(__DATE__) && getTime(__TIME__)) {

    parse = true;

    // and configure the RTC with this info

    if (RTC.write(tm)) {

      config = true;

    }

  }


  Serial.begin(9600);

  while (!Serial) ; // wait for Arduino Serial Monitor

  delay(200);

  if (parse && config) {

    Serial.print("DS1307 configured Time=");

    Serial.print(__TIME__);

    Serial.print(", Date=");

    Serial.println(__DATE__);

  } else if (parse) {

    Serial.println("DS1307 Communication Error :-{");

    Serial.println("Please check your circuitry");

  } else {

    Serial.print("Could not parse info from the compiler, Time=\"");

    Serial.print(__TIME__);

    Serial.print("\", Date=\"");

    Serial.print(__DATE__);

    Serial.println("\"");

  }

}


void loop() {

}


bool getTime(const char *str)

{

  int Hour, Min, Sec;


  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;

  tm.Hour = Hour;

  tm.Minute = Min;

  tm.Second = Sec;

  return true;

}


bool getDate(const char *str)

{

  char Month[12];

  int Day, Year;

  uint8_t monthIndex;


  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;

  for (monthIndex = 0; monthIndex < 12; monthIndex++) {

    if (strcmp(Month, monthName[monthIndex]) == 0) break;

  }

  if (monthIndex >= 12) return false;

  tm.Day = Day;

  tm.Month = monthIndex + 1;

  tm.Year = CalendarYrToTm(Year);

  return true;

}


讀取時間(之後使用)


/*

DS1307RTC_2ReadTime


SQ --> 不用插

DS --> 不用插

SCL --> A5

SDA --> A4

VCC --> 5V

GND --> GND

BAT --> 不用插


 */

#include <Wire.h>

#include <TimeLib.h>

#include <DS1307RTC.h>


void setup() {

  Serial.begin(9600);

  while (!Serial) ; // wait for serial

  delay(200);

  Serial.println("DS1307RTC Read Test");

  Serial.println("-------------------");

}


void loop() {

  tmElements_t tm;


  if (RTC.read(tm)) {

    Serial.print("Ok, Time = ");

    print2digits(tm.Hour);

    Serial.write(':');

    print2digits(tm.Minute);

    Serial.write(':');

    print2digits(tm.Second);

    Serial.print(", Date (D/M/Y) = ");

    Serial.print(tm.Day);

    Serial.write('/');

    Serial.print(tm.Month);

    Serial.write('/');

    Serial.print(tmYearToCalendar(tm.Year));

    Serial.println();

  } else {

    if (RTC.chipPresent()) {

      Serial.println("The DS1307 is stopped.  Please run the SetTime");

      Serial.println("example to initialize the time and begin running.");

      Serial.println();

    } else {

      Serial.println("DS1307 read error!  Please check the circuitry.");

      Serial.println();

    }

    delay(9000);

  }

  delay(1000);

}


void print2digits(int number) {

  if (number >= 0 && number < 10) {

    Serial.write('0');

  }

  Serial.print(number);

}


[問題]

1.  利用LCD顯示時間。

2.  同時顯示時間和溫度、濕度。