日々の記録

ほどよく書いてきます。

MPL3115A2でデータを記録する。Arduinoでシリアルデータ出力、Processingでデータ受信

2020年05月23日 10時06分47秒 | プログラム

ふと一日の気圧変化を記録に残そうと思ったときに、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側でデータを受信して、ファイルに吐き出していく。コンソールには次のようにログが出てきます。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« MPL3115A2 | トップ | MPL3115A2 日陰運用 »

コメントを投稿

プログラム」カテゴリの最新記事