07.picoでRTCデモ動作 C言語
07.picoでRTCデモ動作 C言語
picoをインストールした時に出来たサンプル例を確認します。
C:\Pico\pico-examples\rtc
に、以下のの3つのcファイルがあります。
・hello_rtc\hello_rtc.c
・rtc_alarm\rtc_alarm.c
・rtc_alarm_repeat\rtc_alarm_repeat.c
.cmakeとCMakeLists.txtの修正
そのままではコンパイルでエラーになるので、今までのcmakeを見て。次の2ファイルを他からcopyしました。・example_auto_set_url.cmake
・pico_sdk_import.cmake
また、各CMakeLists.txtも修正しました。
C:\Pico\demoRTC\CMakeLists.txt
cmake_minimum_required(VERSION 3.12) #追加include(pico_sdk_import.cmake) #追加
project(pico_examples C CXX ASM) #追加
set(CMAKE_C_STANDARD 11) #追加
set(CMAKE_CXX_STANDARD 17) #追加
set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR}) #追加
pico_sdk_init() #追加
include(example_auto_set_url.cmake) #追加
#if (NOT PICO_NO_HARDWARE) #削除
add_subdirectory(hello_rtc)
add_subdirectory(rtc_alarm)
add_subdirectory(rtc_alarm_repeat)
#endif () #削除
C:\Pico\demoRTC\hello_rtc\CMakeLists.txt
add_executable (hello_rtc hello_rtc.c)target_link_libraries (hello_rtc pico_stdlib hardware_rtc)
pico_enable_stdio_usb (hello_rtc 1) #追加
pico_enable_stdio_uart(hello_rtc 0) #追加
pico_add_extra_outputs(hello_rtc)
example_auto_set_url (hello_rtc)
C:\Pico\demoRTC\rtc_alarm\CMakeLists.txt
add_executable (rtc_alarm rtc_alarm.c)target_link_libraries (rtc_alarm pico_stdlib hardware_rtc)
pico_enable_stdio_usb (rtc_alarm 1) #追加
pico_enable_stdio_uart(rtc_alarm 0) #追加
pico_add_extra_outputs(rtc_alarm)
example_auto_set_url (rtc_alarm)
C:\Pico\demoRTC\rtc_alarm_repeat\CMakeLists.txt
add_executable (rtc_alarm_repeat rtc_alarm_repeat.c)target_link_libraries (rtc_alarm_repeat pico_stdlib hardware_rtc)
pico_enable_stdio_usb (rtc_alarm_repeat 1) #追加
pico_enable_stdio_uart(rtc_alarm_repeat 0) #追加
pico_add_extra_outputs(rtc_alarm_repeat)
example_auto_set_url (rtc_alarm_repeat)
動作
プログラムでprintfを使用しているので、Tera Termを起動しておきます。hello_rtc.c
プログラム内で設定した日時から開始し、0.1秒ごとに時刻表示します。rtc_alarm.c
RTC Alarm!を表示し、設定日時から開始し、アラーム設定日時(5秒後)になると1回だけ次の表示をします。
Alarm Fired At Wednesday 13 January 11:20:05 2020
rtc_alarm_repeat.c
設定日時から開始し、設定間隔(1分)でアラーム表示します。ファイル
hello_rtc.c
// Copyright RaspberryPi Ltd.
// 時刻表示
#include <stdio.h> // 入出力ライブラリ
#include "hardware/rtc.h" // RTC使用
#include "pico/stdlib.h" // 基本ライブラリ
#include "pico/util/datetime.h" // 日付時刻構造を使用
int main() {
stdio_init_all(); // 標準stdioを初期化
printf("Hello RTC!\n"); // 表示
char datetime_buf[256]; // 日付時刻構造buf
char *datetime_str = &datetime_buf[0]; //
datetime_t t = { // 動作開始時刻設定
.year = 2020, // 2020年
.month = 06, // 6月
.day = 05, // 5日
.dotw = 5, // 金曜日 (0:日曜日)
.hour = 15, // 15時
.min = 45, // 45分
.sec = 00 // 0秒
};
rtc_init(); // RTC初期化
rtc_set_datetime(&t); // RTCを指定時間に設定
while (true) { // 永久ループ
rtc_get_datetime(&t); // RTCから現在時刻を取得
datetime_to_str(datetime_str, sizeof(datetime_buf), &t);//datetime_tを文字列に変換(文字buf,bufサイズ,日時)
printf("\r%s ", datetime_str); // 時刻表示
sleep_ms(100); // 0.1秒待つ
}
return 0;
}
rtc_alarm.c
// Copyright RaspberryPi Ltd.
// 指定時間にアラーム1回
#include <stdio.h> // 入出力ライブラリ
#include "hardware/rtc.h" // RTC使用
#include "pico/stdlib.h" // 基本ライブラリ
#include "pico/util/datetime.h" // 日付時刻構造を使用
static volatile bool fired = false; // volatile
static void alarm_callback(void) { // アラーム発生時の処理
datetime_t t = {0}; //
rtc_get_datetime(&t); // RTCから現在時刻を取得
char datetime_buf[256]; // 日付時刻構造buf
char *datetime_str = &datetime_buf[0]; //
datetime_to_str(datetime_str, sizeof(datetime_buf), &t);//datetime_tを文字列に変換(文字buf,bufサイズ,日時)
printf("Alarm Fired At %s\n", datetime_str);//アラーム時刻表示
stdio_flush(); // 標準stdioを初期化
fired = true; // volatile
}
int main() {
stdio_init_all(); // 標準stdioを初期化
sleep_ms(5000); // 5秒待つ
printf("RTC Alarm!\n"); // 表示
datetime_t t = { // 動作開始時刻設定
.year = 2020, // 2020年
.month = 01, // 1月
.day = 13, // 13日
.dotw = 3, // 水曜日 (0:日曜日)
.hour = 11, // 11時
.min = 20, // 20分
.sec = 00 // 0秒
};
rtc_init(); // RTC初期化
rtc_set_datetime(&t); // RTCを指定時間に設定
datetime_t alarm = { // アラーム時刻 5秒後
.year = 2020, // 上のtと同じ
.month = 01, // 上のtと同じ
.day = 13, // 上のtと同じ
.dotw = 3, // 上のtと同じ
.hour = 11, // 上のtと同じ
.min = 20, // 上のtと同じ
.sec = 05 // 上のt+5
};
rtc_set_alarm(&alarm, &alarm_callback);//アラームの設定(時刻,処理内容)
while(!fired); // アラームになるまでループ
return 0;
}
rtc_alarm_repeat.c
// Copyright RaspberryPi Ltd.
// 指定時間後にアラーム 永遠に
#include <stdio.h> // 入出力ライブラリ
#include "hardware/rtc.h" // RTC使用
#include "pico/stdlib.h" // 基本ライブラリ
#include "pico/util/datetime.h" // 日付時刻構造を使用
static volatile bool fired = false; // volatile
static void alarm_callback(void) { // アラーム発生時の処理
datetime_t t = {0}; //
rtc_get_datetime(&t); // RTCから現在時刻を取得
char datetime_buf[256]; // 日付時刻構造buf
char *datetime_str = &datetime_buf[0]; //
datetime_to_str(datetime_str, sizeof(datetime_buf), &t);//datetime_tを文字列に変換(文字buf,bufサイズ,日時)
printf("Alarm Fired At %s\n", datetime_str);//アラーム間隔の表示
stdio_flush(); // 標準stdioを初期化
fired = true; // volatile
}
int main() {
stdio_init_all(); // 標準stdioを初期化
sleep_ms(5000); // 5秒待つ
printf("RTC Alarm Repeat!\n"); // 表示
datetime_t t = { // 動作開始時刻設定
.year = 2020, // 2020年
.month = 01, // 1月
.day = 13, // 13日
.dotw = 3, // 水曜日 (0:日曜日)
.hour = 11, // 11時
.min = 20, // 20分
.sec = 00 // 0秒
};
rtc_init(); // RTC初期化
rtc_set_datetime(&t); // RTCを指定時間に設定
datetime_t alarm = { // 1分に1回のアラーム
.year = -1, // アラームにならない
.month = -1, // アラームにならない
.day = -1, // アラームにならない
.dotw = -1, // アラームにならない
.hour = -1, // アラームにならない
.min = -1, // アラームにならない
.sec = 00 // 00秒でアラーム
};
rtc_set_alarm(&alarm, &alarm_callback);//アラームの設定(時刻,処理内容)
while(1); // 永久ループ 永遠に鳴る
return 0;
}