Arduinoにつないだセンサからの値をパソコンで記録する(8)

Arduinoにつないだセンサからの値をパソコンで記録する(7)の続きです。
ついに(いちおうの)終着点、Processingでのファイル出力まできました。

Processingで文字列(テキスト)をファイルに保存するのに、まずはsaveStrings()という関数を使ってスケッチを作りました。(リンク先は英語です)
たいていのプログラム言語だと、ファイルの出力は

  • ファイルを書き込みモードで開いて
  • ファイルに出力して
  • ファイルを閉じる

という作業が必要になりますが、ProcessingでsaveStrings()を使っている分には「開く」-「閉じる」という作業は不要のようです。おそらくsaveStrings()するたびに開いて閉じているんでしょう。

saveStrings()の書式は
saveStrings(ファイル名, 文字列の配列)
ということで、文字列の配列の要素を一つ一行で書き出してくれる関数です。あと、毎回ファイルは上書きされます。
そこで値が来るたびに文字列に変換して配列に格納して、一からファイルに書き出すというスケッチになりました。

しかし、どう考えても無駄が多すぎるのでちゃんと調べたら、ファイルを開いて書き出して最後に閉じるという普通の方法も使えることがわかったので修正しました。あぶないあぶない。saveStrings()はおそらくテキストをためておいて、なんかの拍子に一気に書き出す時に使うのでしょう。

毎回書き出すスケッチは
ファイルを開く → createWriter() (リンク先英語)
ファイルに書き出し → println()
ファイルを閉じる → close()
を使って作ります。

まずは簡単なサンプルプログラムを挙げます。

PrintWriter output;  // PrintWriter型のオブジェクトを宣言

void setup() {
  output = createWriter("test.txt");  // ファイル名test.txtでファイルを開く
  output.println("aaa");  // aaa(改行)と出力
  output.println("bbb");  // bbb(改行)と出力
  output.flush();  // 出力バッファに残っているデータを全て書き出し
  output.close();  // ファイルを閉じる
}

まず、PrintWriter型のオブジェクトを宣言します。ここではoutputという名前にしましたが(なぜかというとcreateWriter()のサンプルソースにそうあったからです)別にわかりやすければなんでもいいでしょう。

そして、setup()の中で”test.txt”を書き込みモードで開いてoutput に紐付けしました。
その後output.printlnで出力したのですが、ここではサンプルなのでsetupを使ったのであって、実際に使う時はloop()の中で使うことになるでしょう。output.printlnは普通のprintlnをファイルに対して行う(ファイルに文字列を出力する)と思えばよいと思います。

最後にoutput.flush()で書き込みバッファの内容を全て書き出してから、output.close()でファイルを閉じます。

これを今までのソースファイルにくっつけるとこんな感じでしょうか。

import processing.serial.*;
Serial myPort;  // myPortのところは好きな名前でOK
String datastr;  // datastrという名前の文字列型変数を宣言(この記事の下の方で出てきます)
PrintWriter output;  // PrintWriter型のオブジェクトを宣言
int count = 1;  // カウンタを宣言して初期化

void setup()
{
  println(Serial.list());  // 使えるポート一覧
  myPort = new Serial(this, Serial.list()[0], 9600); // myPortを最初のシリアルポート、9600bpsに設定
  myPort.clear();
  output = createWriter("log.txt");  // ファイル名log.txtでファイルを開く
}

void draw() {
  if (count>100) {  // カウンタが100超えていたら終了
    output.flush();  // 出力バッファに残っているデータを全て書き出し
    output.close();  // ファイルを閉じる
    exit();
  }
  count++; // カウントアップ

  if ( myPort.available() > 0) {
    delay(100);
    datastr = myPort.readString();
    int[] tempdata = int(split(datastr, ','));
    String datetimestr = nf(year(),2)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2) + ":" + nf(minute(),2) + ":" + nf(second(),2);
    String tempstr = String.format("% 4.1f,% 4.1f",tempdata[0],tempdata[1]) ;
    output.println(datetimestr + "," + tempstr );
  }
}

困ったのは、前回までのスケッチには始まりはあっても終わりがないので、いつファイルを閉じたらいいのかわからない点です。
そこで、1つデータを出力したら1増えるカウンタを作って、100回出力したら止まるようにしました。

[連載リンク]
Arduinoにつないだセンサからの値をパソコンで記録する(1)
Arduinoにつないだセンサからの値をパソコンで記録する(2)
Arduinoにつないだセンサからの値をパソコンで記録する(3)
Arduinoにつないだセンサからの値をパソコンで記録する(4)
Arduinoにつないだセンサからの値をパソコンで記録する(5)
Arduinoにつないだセンサからの値をパソコンで記録する(6)
Arduinoにつないだセンサからの値をパソコンで記録する(7)
Arduinoにつないだセンサからの値をパソコンで記録する(8) この記事です

Processingをはじめよう (Make: PROJECTS)
Casey Reas Ben Fry
オライリージャパン
売り上げランキング: 22,469
Access to Materials -デザイン/アート/建築のためのマテリアルコンピューティング入門
脇田 玲
ビー・エヌ・エヌ新社
売り上げランキング: 191,203
カテゴリー: AVR, ソースコード, Mac, Windows タグ: , , パーマリンク

Arduinoにつないだセンサからの値をパソコンで記録する(8) への7件のフィードバック

  1. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(5) | Ukkari blog

  2. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(6) | Ukkari blog

  3. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(7) | Ukkari blog

  4. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(4) | Ukkari blog

  5. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(2) | Ukkari blog

  6. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(3) | Ukkari blog

  7. ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(1) | Ukkari blog

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中