ふと一日の気圧変化を記録に残そうと思ったときに、Arduinoには正確な時間計測の方法がなさそうだとなり、Processingで測定データを受信し、時刻を付与してファイルに記録、といようなことをしてみた。
Arduino側プログラム
MPL3115Aに設定して値を読み込む。今回は標高に換算したデータを出力するようにしています。
タイマー割り込みを使って0.25秒に一回、データをシリアル通信で吐き出しています。もっと遅くてもよかったと今では思ってる。
#include#include #define OverSample 128.0 #include "SparkFunMPL3115A2.h" //Create an instance of the object MPL3115A2 myPressure; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); float Altitude = 0; float Ondo = 0; float Pressure = 0; float tempAltitude = 0; ISR(TIMER1_COMPA_vect) { digitalWrite(13, !digitalRead(13)); Serial.begin(9600); // Start serial for output Serial.print(Ondo,3); Serial.print(" "); Serial.println(Altitude,3); Serial.end(); } void setup() { pinMode(13, OUTPUT); TCCR1A = 0; TCCR1B = 0; TCCR1B |= (1 << WGM12) | (1 << CS12); //CTCmode //prescaler to 256 OCR1A = 156250-1; TIMSK1 |= (1 << OCIE1A); lcd.clear(); lcd.begin(16,2); lcd.setCursor(0,0); lcd.print("Hello! Wait!"); lcd.setCursor(0,1); lcd.print("OverSample:"); lcd.print(OverSample); Wire.begin(); // Join i2c bus // delay(100); // Configure the sensor myPressure.setModeAltimeter(); // Measure altitude above sea level in meters //myPressure.setModeBarometer(); // Measure pressure in Pascals from 20 to 110 kPa myPressure.setOversampleRate(7); // Set Oversample to the recommended 128 myPressure.enableEventFlags(); // Enable all three pressure and temp event flags } void loop(){ myPressure.begin(); // Get sensor online for(int i = 0; i< 10; i++){ Altitude = myPressure.readAltitude(); // Pressure = myPressure.readPressure(); Ondo = myPressure.readTemp(); } while(1){ Altitude = Altitude * (OverSample-1)/OverSample + myPressure.readAltitude()/OverSample; // Pressure = Pressure * (OverSample-1)/OverSample + myPressure.readPressure()/OverSample; Ondo = Ondo* (OverSample-1)/OverSample + myPressure.readTemp()/OverSample; lcd.clear(); lcd.setCursor(0,0); lcd.print(Ondo, 2); lcd.print("C"); lcd.setCursor(7,0); lcd.print(Altitude, 2); lcd.print("m"); } }
Processing側プログラム
import processing.serial.*; PrintWriter file; Serial myPort; // set Serial port to String inString; // string to read from serial port int lf = 10; // ASCII \n void setup() { file = createWriter("balomatic_tester"+nf(year(),4)+nf(month(),2)+nf(day(),2)+"_"+nf(hour(),2)+nf(minute(),2)+".log"); size(200,200); printArray(Serial.list()); myPort = new Serial(this,Serial.list()[1], 9600); myPort.bufferUntil(lf); } void draw() { } void serialEvent(Serial p) { inString = p.readString(); String now; now = nf(year(),4)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2)+":"+nf(minute(),2)+":"+nf(second(),2)+" "; print(now); print(inString); file.print(now + inString); } void keyPressed(){ println(key); if(key == 'f'){ file.flush(); } else if(key == 'q'){ file.flush(); file.close(); exit(); } }
void keyPressed()でやっているのは、fキーを押したときにはファイルをフラッシュ(ディスクに書き出す)を実施、qをクリックしたら実行中止、というようなことになっています。
これでProcessing側でデータを受信して、ファイルに吐き出していく。コンソールには次のようにログが出てきます。