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;
}