Uno와 함께 RTClib.h 및 TimeLib.h를 사용하고 있습니다.
수일 동안 고군분투했습니다. 사용 가능한 다양한 RTC 라이브러리와이를 Arduino Time Library와 함께 사용하는 방법을 이해하는 데 도움이됩니다.
질문 1 .
루프를 통해 매번 새로운 now () 객체를 생성하지 않으려면 x 초마다 시간 라이브러리를 RTC에 동기화하려면 어떻게해야합니까? RTClib 함수 now.hour now.minute 등을 사용하려고 할 때마다 DateTime now = RTC.now ()를 사용하여 now () 개체를 만들어야합니다.
RTCLib에 동등한 함수가 있습니까? DS1307RTC 라이브러리의 setSyncProvider (RTC.get)로?
setSyncInterval (5000)에 해당하는 항목이 있습니까?
질문 2 .
어떤 RTCLib를 호출해야합니까? 예제에는 여러 가지가 사용됩니다.
< RTClib.h >
” RTClib ” 인용 부호 사용
< RTCLib.h > 대문자 L
그리고 때때로 다음 중 하나를 호출합니다.
RTC_DS1307 RTC
또는 RTC_DS1307 rtc
또는 RTC_DS3231 rtc
질문 3
a. tmElements_t tm은 DS1307RTC 라이브러리의 일부입니까?
b. RTC의 tm.Hour tm.Minute입니까?
c. RTClib.h에도 이에 상응하는 것이 있습니까?
그리고 마지막으로 사용 방법을 보여주기 위해 아래에 몇 가지 코드를 게시했습니다.
#include "RTClib.h" #include <Wire.h> #include <TimeLib.h> RTC_DS1307 RTC; void setup() { Serial.begin(9600); Wire.begin(); //sets up the I2C RTC.begin(); //initializes the I2C to the RTC if (! RTC.begin()) { Serial.println("Couldn"t find RTC"); } // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30)); //Set Arduino Time Library different than RTC time to see which is which setTime(9, 27, 05, 14, 07, 2015); } void loop() { /* // How do I sync Time Library to RTC after x seconds? setSyncProvider(RTC.get); // This is in the DS1307RTC.h Library setSyncInterval(5000); // Are there such functions in RTClib ? */ DateTime now = RTC.now(); // Pulls RTC time into now(). Does not sync with Time Library // Do not want to do this every loop. //Print RTC Time Serial.println(); Serial.print("RTC now.hour "); Serial.println(now.hour()); Serial.print("RTC now.minute "); Serial.println(now.minute()); Serial.print("RTC now.second: "); Serial.println(now.second()); Serial.println(); Serial.println(); //Print Arduino TimeLib Time Serial.print("Time Lib Hour: "); Serial.print(hour()); Serial.println(); Serial.print("Time Lib Min: "); Serial.print(minute()); Serial.println(); Serial.print("Time Lib Sec: "); Serial.print(second()); Serial.println(); Serial.println(); delay(1000); }
2020 년 11 월 5 일 업데이트 됨
거의 이해합니다. 이 코드가 내가 생각하는 작업을 수행하는지 알려주세요. 특히 :
설정에서 :
RTC를 5:10:30으로 설정합니다.
시간 라이브러리를 다음으로 설정합니다. 9:27:05 with setTime ().
DateTime을 사용하여 시간 라이브러리를 RTC 시간으로 설정 하시겠습니까 (9:27:05 쓰기 이상)?
tm.Hour = now를 사용하여 시간 라이브러리 변수를 RTC로 설정합니다. Hour, etc.
In Loop :
5 초마다 hour (), minutes () second ()를 RTC 시간으로 업데이트합니다.
모든 루프가 tm.hour를 hour ()로 업데이트합니다. , 등등.
연속 인쇄에는 tm.Hour, tm.Minute가 하단에 표시된 것처럼 각 루프가 번갈아 표시되므로 여전히 옳지 않다는 것을 알고 있습니다.
#include "RTClib.h" #include <Wire.h> #include <TimeLib.h> RTC_DS1307 RTC; time_t time_provider() { return RTC.now().unixtime(); } tmElements_t tm; //part of Time Library void setup() { //setSyncProvider(time_provider); Serial.begin(9600); Wire.begin(); //sets up the I2C RTC.begin(); //initializes the I2C to the RTC if (! RTC.begin()) { Serial.println("Couldn"t find RTC"); } // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30)); //Set Arduino Time Library different than RTC time 9:27:05 setTime(9, 27, 05, 14, 07, 2015); //Setting Time Library to RTC time DateTime now = RTC.now(); tm.Hour = now.hour(); tm.Minute = now.minute(); tm.Second = now.second(); } void loop() { setSyncProvider(RTC.now); setSyncInterval(5000); //Time Library time updates to RTC every 5 seconds tm.Hour = hour(); tm.Minute = minute(); tm.Second = second(); Serial.print("tm.Hour: "); Serial.print(tm.Hour); Serial.println(); Serial.print("tm.Minute: "); Serial.print(tm.Minute); Serial.println(); Serial.print("tm.Seconds: "); Serial.print(tm.Second); Serial.println(); Serial.println(); delay(1000); }
연속 인쇄 :
tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0
답변
먼저이 라이브러리에 대한 배경 지식을 알려 드리겠습니다.
Time 라이브러리는 다음을 위해 millis()
를 사용합니다. 계시. 이는 상당한 드리프트의 영향을받을 수 있으므로 외부 시간 제공 업체와 주기적으로 동기화 할 수있는 수단을 제공합니다. 따라서 함수 setSyncProvider()
및 setSyncInterval()
.
RTClib는 RTC와의 인터페이스를 의미합니다. 자체적으로 시간 표시를 제공하지 않습니다. RTC의 now()
메서드를 통해 RTC를 쿼리하여 현재 시간을 얻습니다.
이 두 라이브러리는 각각을 훌륭하게 보완 할 수 있습니다. 기타, RTClib는 시간 라이브러리의 시간 공급자로 사용할 수 있으므로 :
// Provide the RTC time to the Time library. time_t time_provider() { return RTC.now().unixtime(); } void setup() { // ... setSyncProvider(time_provider); }
새 now () 객체를 생성하지 않으려면 […]
실제로는 DateTime
개체라고합니다.
[]
예, DateTime
클래스 . tmElements_t
구조와 달리 DateTime
의 데이터 필드는 공개 및 액세스하려면 접근자를 사용해야합니다. year()
, month()
, day()
…
대체 시간 표시 방법
Arduino Uno를 사용하고 있으므로 세 번째 시간 표시 방법이 있습니다. 고려하고 싶다. 모든 루프 반복 (RTClib)에서 RTC를 쿼리하거나 millis()
(시간 라이브러리)로 RTC 판독 값을 보간하는 대신 RTC의 1Hz 출력을 인터럽트 핀으로 라우팅 할 수 있습니다. ISR에서 초를 세십시오. avr-libc 타이밍 코드 는 이러한 방식으로 시간을 표시하도록 설계되었습니다. 모두 요약하면 다음과 같습니다.
// Initialize the system time from the RTC. set_system_time(RTC.now().secondstime()); // Keep the time in sync using the 1 Hz output of the RTC. pinMode(pin1Hz, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(pin1Hz), system_tick, FALLING);
자세한 내용은 예제 스케치를 참조하세요. RTClib와 함께 제공되는 interrupts1Hz.ino
편집 1 : 댓글에 답하기
RTC에서 [Arduino 인터럽트 핀]은 어떤 핀에 연결 되나요?
사용중인 RTC에 따라 다릅니다. 질문의 코드에서 알 수 있듯이 “DS1307″이라고 가정하겠습니다. RTC의 데이터 시트 를 살펴보세요.6 페이지에는 “핀 설명”이라는 제목의 테이블이 있습니다. 이 표에서 :
핀 : 7
이름 : SQW / OUT
기능 : 구형파 / 출력 드라이버. 활성화되면 SQWE 비트가 1로 설정되고 SQW / OUT 핀은 4 개의 구형파 주파수 (1Hz, 4kHz, 8kHz, 32kHz) 중 하나를 출력합니다. SQW / OUT 핀은 오픈 드레인이며 외부 풀업 저항이 필요합니다. SQW / OUT은 V CC 또는 V BAT 가 적용된 상태에서 작동합니다. 풀업 전압은 V CC 의 전압에 관계없이 최대 5.5V가 될 수 있습니다. 사용하지 않는 경우이 핀은 부동 상태로 둘 수 있습니다.
RTC 모듈 을 사용하는 경우 이 핀이 모듈의 커넥터에서 노출되는 위치를 확인합니다.
어쨌든,
RTC.writeSqwPinMode(DS1307_SquareWave1HZ);
수정 2 : 질문 업데이트에 대한 주석 :
// Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30));
정답입니다.
// Set Arduino Time Library different than RTC time 9:27:05 setTime(9, 27, 05, 14, 07, 2015);
올 바릅니다. 날짜는 2015-07-14입니다.
// Setting Time Library to RTC time DateTime now = RTC.now(); tm.Hour = now.hour(); tm.Minute = now.minute(); tm.Second = now.second();
아니요. tm
변수. 시간 라이브러리가 현재 시간을 가지고 있다는 생각에는 영향을 미치지 않습니다. tm
의 날짜 필드는이 시점에서 초기화되지 않았으며 유효하지 않을 수 있습니다 (예 : 23 개월, 125 일).
setSyncProvider(RTC.now);
이것은 올바르지 않으며 컴파일러 경고를 생성해야합니다. setSyncProvider()
는 현재 시간을 Unix 시간 (time_t
유형의 단순 정수)으로 반환하는 함수를 예상합니다. 현재 시간을 DateTime
유형으로 분류 된 형식 (년, 월 …)으로 반환하는 함수를 제공하고 있습니다. Time 라이브러리는이를 이해하지 못하고 18:00:00과 같은 쓰레기를 생성 할 수 있습니다.
RTC.now()
에서 반환 된 시간은 Unix 시간으로 변환 될 수 있습니다. unixtime()
메소드로. 이것이 내가 time_provider()
함수를 제공 한 이유입니다.
또한 setSyncProvider()
를 호출해서는 안됩니다. 모든 루프 반복에서 setSyncInterval()
. setup()
에서 한 번에 모두 수행합니다.
// Time Library time updates to RTC every 5 seconds tm.Hour = hour(); tm.Minute = minute(); tm.Second = second();
다시 말하지만 tm
변수 만 업데이트합니다. 시간 라이브러리가 현재 시간이라고 생각하는 값에는 영향을 미치지 않습니다.
답변
DS1307RTC 라이브러리의 setSyncProvider (RTC.get)와 동일한 기능이 RTCLib에 있습니까?
setSyncInterval (5000)
이것들은 TimeLib 함수입니다. “에 해당하는 ” TimeLib를 사용하고 있기 때문입니다 .
첫 번째는 함수에 대한 포인터를 기대합니다. time_t
를 반환합니다. 그 함수에있는 것은 당신에게 달려 있습니다.
어떤 RTCLib를 호출해야합니까? 예에서 사용되는 몇 가지가 있습니다.
대문자는 헤더 파일의 이름과 일치해야합니다. Windows는 상관하지 않으며 OS X는 일반적으로 상관하지 않지만 구성 할 수 있습니다. Linux는 신경을 실행 하며 일치해야합니다. 코드를 이식 가능하게하려면 대소 문자를 파일과 동일하게 유지해야합니다.
때로는 다음 중 하나를 호출 할 수도 있습니다.
p>
물리적 RTC와 일치하는 개체를 만들어야합니다.
a. tmElements_t tm은 DS1307RTC 라이브러리의 일부입니까?
아니요. TimeLib의 일부입니다.
b. RTC의 tm.Hour tm.Minute입니까?
호출되는 함수에 의해 할당되는 모든 것입니다. 변수 일뿐입니다. 무엇이든 포함 할 수 있습니다.
c. RTClib.h에 동등한 것이 있습니까?
아니요. 그러나 TimeLib를 사용한다면 거기에있을 필요가 없습니다.
따라서 :
- 사용하려는 라이브러리 (예 : RTCLib)를 통해 RTC에서 시간을 가져와 초 수를 계산하는 함수를 만들어야합니다. 00:00:00 01/01/1970부터
time_t
로 반환됩니다. - TimeLib “의
-
setSyncInterval()
로 동기화 빈도를 설정합니다.
댓글
-
now
는now
개체를 할당 한 시점의 RTC에서 보낸 시간입니다..hour()
는 해당 객체에 포함 된 시간입니다.hour()
는 TimeLib 라이브러리의 시간입니다. 예. setSyncProvider ()는 ‘ 아무것도 RTC에 보내지 않고 정기적으로 RTC에서 시간을 가져와 현재 시간으로 TimeLib를 업데이트합니다. - It ‘보다 조금 더 복잡합니다. TimeLib는
millis()
를 사용합니다. 시간을 추적합니다.setSyncInterval()
에 따라 시간에 대한 내부 아이디어를 정기적으로 업데이트합니다.hour()
를 요청할 때 마지막으로setSyncInterval()
에서 지정한 실시간 시간이 지난 후 더 많은 시간이 지나면 RTC로부터의 시간. 그렇지 않으면 자체 내부 계산에 따라 시간이 생각 하는 것을 알려줄뿐입니다. - 제공된 도움으로 게시물을 업데이트했습니다. 거의 이해했습니다.
- ‘ 동기화 공급자와 간격을 계속 변경하고 있기 때문입니다. 설정시 한 번만 설정하고 다시는 설정하지 않습니다.
- 그렇습니다. ‘
tmElements_t
구조체가 전혀 필요하지 않지만 ‘ 간단한 숫자입니다.tmElements_t
는 다른 함수로 전달하려는 경우 모두 함께 묶는 편리한 방법입니다.Serial.print(hour());