日々の記録

ほどよく書いてきます。

MPL3115A2の測定値をArduinoで読み取りProcessingで保存する。

2020年06月07日 13時57分19秒 | AVR

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();
  }
}

とりあえずこんな感じで動いているようです。

日毎にデータファイルを分けてもいいかもしれません。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« MPL3115A2気圧測定 気象庁デ... | トップ | 車載インバーター Meltec IP-150 »

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

AVR」カテゴリの最新記事