注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!
リアルタイムクロック
UNO R4 WiFiのマイクロコントローラー(RA4M1)にはRTC(リアルタイムクロック)が統合されています。RTCは、バッテリーなどのバックアップ電源によって、メインの電源が切断されていても動作することができる自律的な時計モジュールです。これにより、RTCは、家庭用オートメーションシステムでのタイムスケジュールされたタスクの実行や、データログ記録アプリケーションでのデータポイントのタイムスタンプ付けなど、様々なアプリケーションで非常に柔軟に使用できます。
注釈
UNO R4 WiFiには、ボードが電源を失ってもオンボードRTCの動作を維持するVRTCピンがあります。この機能を利用するためには、VRTCピンに1.6Vから3.6Vの電圧を適用してください。
定期的な繰り返しタスク
特定のユースケースでは、定期的に特定のタスクを実行する必要があります。周期的な割り込みを設定するためには、まず周期的なコールバック関数を初期化する必要があります。以下は、周期的な割り込みを使用して2秒ごとにLEDを点滅させるArduinoコードの例です。
コードのアップロード
03-rtc.ino ファイルを elite-explorer-kit-main\r4_new_feature\03-rtc で開くか、以下のコードをArduino IDEに貼り付けてください。
1/*
2 This code is for an Arduino Uno R4 board and it toggles an LED on and
3 off every 2 seconds using a Real Time Clock (RTC) for timing. It initializes
4 the RTC, sets a specific time, and establishes a periodic callback to toggle
5 the LED state. When the callback is triggered, it toggles the LED and outputs
6 a debugging message to the serial monitor.
7
8 Board: Arduino Uno R4
9*/
10
11// Include the RTC library
12#include "RTC.h"
13
14volatile bool irqFlag = false; // Flag to indicate a periodic callback.
15bool ledState = false; // Current LED state: true for ON and false for OFF
16const int led = LED_BUILTIN; // Pin number for the built-in LED
17
18void setup() {
19 pinMode(led, OUTPUT); // Configure the LED pin as output
20
21 Serial.begin(9600);
22
23 // Initialize the RTC
24 RTC.begin();
25
26 // Set an arbitrary time to the RTC (required for RTC.setPeriodicCallback to work)
27 RTCTime mytime(30, Month::JUNE, 2023, 13, 37, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE);
28 RTC.setTime(mytime);
29
30 // Set the periodic callback to trigger every 2 seconds
31 if (!RTC.setPeriodicCallback(periodicCallback, Period::ONCE_EVERY_2_SEC)) {
32 Serial.println("ERROR: periodic callback not set");
33 }
34}
35
36void loop() {
37 // Check if the periodic callback has been triggered
38 if (irqFlag) {
39 Serial.println("Timed CallBack"); // Output a debugging message
40 ledState = !ledState; // Toggle the LED state
41 digitalWrite(led, ledState); // Update the LED
42 irqFlag = false; // Reset the flag
43 }
44}
45
46// This is the callback function to be passed to RTC.setPeriodicCallback()
47void periodicCallback() {
48 // Set the flag to true to indicate the callback has been triggered
49 irqFlag = true;
50}
コードの説明
コンポーネントとライブラリの初期化
#include "RTC.h" volatile bool irqFlag = false; bool ledState = false; const int led = LED_BUILTIN; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); RTC.begin(); }
#include "RTC.h": RTCライブラリを含めます。volatile bool irqFlag = false;: ボライルなブール型フラグを宣言します。volatileは、割り込みによって安全に変数にアクセスまたは変更できることを保証します。volatileの詳細については、 Arduinoのvolatileドキュメント を参照してください。bool ledState = false;: LEDの状態を追跡するためのブール型を宣言します。const int led = LED_BUILTIN;: 内蔵LEDピンのための定数を宣言します。pinMode(led, OUTPUT);: LEDピンを出力に設定します。Serial.begin(9600);: シリアル通信を9600ボーで初期化します。RTC.begin();: RTCを初期化します。
リアルタイムクロックの設定
RTCTime mytime(30, Month::JUNE, 2023, 13, 37, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE); RTC.setTime(mytime);
RTCTime mytime(...);: 特定の日付と時刻で初期化されたRTCTimeオブジェクトを作成します。RTC.setTime(mytime);: 初期化された時刻でRTCを設定します。
定期的なコールバックの設定と確認
if (!RTC.setPeriodicCallback(periodicCallback, Period::ONCE_EVERY_2_SEC)) { Serial.println("ERROR: periodic callback not set"); } void loop() { if (irqFlag) { Serial.println("Timed CallBack"); ledState = !ledState; digitalWrite(led, ledState); irqFlag = false; } } void periodicCallback() { irqFlag = true; }
RTC.setPeriodicCallback(...);: 2秒ごとにトリガーされる定期的なコールバックを設定します。期間は以下の列挙で指定できます:ONCE_EVERY_2_SECONCE_EVERY_1_SECN2_TIMES_EVERY_SECN4_TIMES_EVERY_SECN8_TIMES_EVERY_SECN16_TIMES_EVERY_SECN32_TIMES_EVERY_SECN64_TIMES_EVERY_SECN128_TIMES_EVERY_SECN256_TIMES_EVERY_SEC
void loop() {...}: コールバックがトリガーされたかどうかを確認します。トリガーされていれば、LEDの状態をトグルします。void periodicCallback() {...}: トリガーされたときに``irqFlag = true``を設定するコールバック関数です。
参照