MPL3115A2を使う上での注意点をまとめる。またArdunoでデータを送出してパソコン側ではProcessingというソフトでデータを受信し、テキストファイルに保存する。
MPL3115A2は上のように実装、ちょっとホコリがたまっちゃった。奥に見える基盤は5VのArduinoと3.3VのMPL3115A2のレベルシフタ。
Arduino側プログラム
#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;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
//timer割り込み設定
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (1 <
OCR1A = 312500-1;
TIMSK1 |= (1 <
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 as Master
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
//はじめに10回くらい測定を読み捨ててみる。意味があるかはわからない。初期値が怪しいときがあるので。
for(int i = 0; i
Pressure = myPressure.readPressure();
Ondo = myPressure.readTemp();
}
while(1){
float ReadPressure; //読み取った圧力
float ReadOndo; //読み取った温度、Tempは別で定義があるようなのでOndoにしています。
ReadPressure = myPressure.readPressure();
ReadOndo = myPressure.readTemp();
Pressure = Pressure * (OverSample-1)/OverSample + ReadPressure/OverSample;
Ondo = Ondo* (OverSample-1)/OverSample + ReadOndo/OverSample;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(Ondo, 1);
lcd.print("C ");
lcd.print(Pressure, 1);
lcd.print("Pa");
lcd.setCursor(0,1);
lcd.print(ReadOndo, 2);
lcd.print(" ");
lcd.print(ReadPressure, 2);
Serial.print(ReadOndo,3);
Serial.print("\t");
Serial.println(ReadPressure,2);
}
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(13, !digitalRead(13)); //特に意味もなくLEDを光らせる
}
液晶モニタにも表示させているのでLCDのライブラリと書き込みを使っています。
液晶画面には上のように表示しています。
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
int UpDate = 0; //set 1 when minute changed while serial interrupt
int DataCount = 0;
int TempMin;
double OndoSummary =0; //倍精度にしないと気圧の有効数字が怪しい気がした(温度は大丈夫だと思うが)
double PressureSummary =0; //同上
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); //list()[1]の数値はArduinoの接続先に依存します。
myPort.bufferUntil(lf);
TempMin = minute();
}
void draw() {
if(UpDate == 1){
UpDate = 0;
String now;
now = nf(year(),4)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2)+":"+nf(minute(),2)+":"+nf(second(),2)+"\t";
file.print(now);
file.print(nf((float)(OndoSummary/DataCount),2,3));
file.print("\t");
file.println(nf((float)(PressureSummary/DataCount),2,3));
file.flush();
OndoSummary = 0;
PressureSummary = 0;
DataCount = 0;
}
}
void serialEvent(Serial p) {
inString = p.readString(); //read String from Serial Port
String SplitedData[];
SplitedData = split(inString, "\t"); //Split data to temperature and pressure(or altitude)
OndoSummary += float(SplitedData[0]); //temperature summary like \Sigam(temperature)
PressureSummary += float(SplitedData[1]); //pressure summary like \Sigma(pressure)
DataCount++; //Average temperature or
String now;
now = nf(year(),4)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2)+":"+nf(minute(),2)+":"+nf(second(),2)+"\t";
print(now);
print(nf(float(SplitedData[0]),2,3));
print("C ");
print(nf(float(SplitedData[1]),6,2));
print("Pa ");
print(nf(DataCount,3,0));
print(" ");
print(nf((float)(OndoSummary/DataCount),2,3));
print(" ");
println(nf((float)(PressureSummary/DataCount),2,3));
// file.print(now + inString);
if(TempMin != minute()){
UpDate=1;
TempMin = minute();
}
}
void keyPressed(){
println(key);
if(key == 'f'){
file.flush(); //fキーを押したらファイルに書き込み(もうほとんどいらない)
}
else if(key == 'q'){
file.flush();
file.close(); //qキーを押したらファイルに書き出して、ファイルを閉じてプログラムストップ
exit();
}
}
とりあえずこんな感じで動いているようです。
日毎にデータファイルを分けてもいいかもしれません。