Arduino で printf() を使いたい

という話を目にしたので,ちょろりと書いてみた.

コード

以下のコードを sketch の void setup() の前にコピペするだけです.

size_t devprintf ( Print *dev, const char *fmt, ... )
{
  va_list ap;
  char buf[80];

  va_start ( ap, fmt );
  vsnprintf ( buf, sizeof(buf), fmt, ap );
  va_end ( ap );

  return dev->print ( buf );
}

長さも長さなので,著作権うんぬんは特に主張しません. 改変・再配布は自由にどうぞ.

使用例

シリアル出力と LCD に秒数を表示し続けるプログラムです.

#include <LiquidCrystal.h>

size_t devprintf ( Print *dev, const char *fmt, ... )
{
  va_list ap;
  char buf[80];

  va_start ( ap, fmt );
  vsnprintf ( buf, sizeof(buf), fmt, ap );
  va_end ( ap );

  return dev->print ( buf );
}

LiquidCrystal lcd ( 2, 3, 4, 5, 6, 7, 8 );

void setup() {
  Serial.begin(115200);
  lcd.begin ( 16, 2 );
}

void loop() {
   unsigned s = millis() / 1000;
    
   devprintf ( &Serial, "%05u sec.\r\n", s );
   
   lcd.setCursor ( 0, 0 );
   devprintf ( &lcd, "%05u sec.", s );
    
   delay ( 1000 );
}

使っているのは loop() 内に2箇所あって

devprintf ( &Serial, "%05u sec.\r\n", s );

devprintf ( &lcd, "%05u sec.", s );

です.

シリアル出力だけでなくて,標準ライブラリを使った LCD 出力にも使えます. ちなみに LCD は,こんなものを使いました.

実行すると,シリアルからはこんな↓出力が

スクリーンショット_2020-06-18_11-29-39.png

LCD にはこんな↓出力が表示されます.

IMG_20200618_105429.jpg

添付ファイル: fileスクリーンショット_2020-06-18_11-29-39.png 148件 [詳細] fileIMG_20200618_105429.jpg 211件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-18 (木) 11:39:43 (497d)