*Arduino で printf() を使いたい [#o7cb01fd]

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

** コード [#l5a93ada]

以下のコードを 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 );
 }

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

** 使用例 [#ab921690]

シリアル出力と 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 は,こんなものを使いました.

#af_amazon(B07WKV9KZW)

実行すると,シリアルからはこんな↓出力が
#ref(スクリーンショット_2020-06-18_11-29-39.png,center,30%)
LCD にはこんな↓出力が表示されます.
#ref(IMG_20200618_105429.jpg,center,10%)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS