2012/11/10

arduino: 大気圧センサ

個人的事情で、ほぼ停滞していましたが、ようやく時間を作る事ができました。
単に大気圧を測っただけでは面白くないので、Freescale社のMPL115を使った気圧からの
天気予測の機能を追加しました。
ついでに単体動作しても予測を知らせる事ができるように、LEDを3つ付けました。
もちろん、シリアルで気圧値と気圧の変位度合いが出力されます。
結果としては、まずまずで1時間くらいは値がばらつきますが、その後は落ち着いているようにみえます。
画面のダンプと下のソースは、デバッグ用に配列を表示したり無駄な部分が多いです。(^^;)
配列もいらないと思うので、修正しようかと思ってます。
次はarduinoは別の遊びに使いたいので、ATMega328P単体で実現しようかと思います。

#include <Wire.h>
#include <MPL115A2.h>
int loopflag = 0; //周回フラグ
float prss[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; //気圧データ保存用配列
int tcount = 0; //3時間計
void setup()
{
  MPL115A2.begin();
  MPL115A2.shutdown();
  Serial.begin(9600);
  pinMode(2,OUTPUT); //high pressure
  pinMode(3,OUTPUT); //low pressure
  pinMode(4,OUTPUT); //stable
}
void loop()
{
  MPL115A2.ReadSensor();
  MPL115A2.shutdown();
  float sec_total = 0, min_total = 0;

  for (int j=0; j < 15; j++){
   for (int i=0; i < 15; i++){
    sec_total = sec_total + MPL115A2.GetPressure();
    delay(1000);
   }
   float avepress_1min = (sec_total / 15) * 10; // average + kPa->hPa trans.
   min_total = min_total + avepress_1min;
   sec_total = 0;
   delay(45000);
  }
  prss[tcount] = min_total / 15;
  Serial.print("tcnt = ");
  Serial.print(tcount);
  Serial.print(", pr[0]=");
  Serial.print(prss[0]);
  Serial.print(", pr[1]=");
  Serial.print(prss[1]);
  Serial.print(", pr[2]=");
  Serial.print(prss[2]);
  Serial.print(", pr[3]=");
  Serial.print(prss[3]);
  Serial.print(", pr[4]=");
  Serial.print(prss[4]);
  Serial.print(", pr[5]=");
  Serial.print(prss[5]);
  Serial.print(", pr[6]=");
  Serial.print(prss[6]);
   Serial.print(", pr[7]=");
  Serial.print(prss[7]);
  Serial.print(", pr[8]=");
  Serial.print(prss[8]);
  Serial.print(", pr[9]=");
  Serial.print(prss[9]);
  Serial.print(", pr[10]=");
  Serial.print(prss[10]);
  Serial.print(", pr[11]=");
  Serial.print(prss[11]);
  Serial.print(", pr[12]=");
  Serial.println(prss[12]);

  if ( tcount > 0 ){
    float dpdt = (prss[tcount] - prss[0]) / (tcount * (loopflag + 0.25) * 0.635);
    Serial.print("pressure, ");
    Serial.print(prss[tcount]);
    Serial.print(", dP/dt, ");
    Serial.println(dpdt);
// LED on/off
    if(2.5 <= dpdt){
      digitalWrite(2,HIGH);
      digitalWrite(3,LOW);
      digitalWrite(4,LOW);
    }
    if(0.5 < dpdt && dpdt < 2.5){
      digitalWrite(2,HIGH);
      digitalWrite(3,LOW);
      digitalWrite(4,HIGH);
    }
    if(-0.5 <= dpdt && dpdt <= 0.5){
      digitalWrite(2,LOW);
      digitalWrite(3,LOW);
      digitalWrite(4,HIGH);
    }
    if(-2.5 < dpdt && dpdt < -0.5){
      digitalWrite(2,LOW);
      digitalWrite(3,HIGH);
      digitalWrite(4,HIGH);
    }
    if(dpdt <= -2.5){
      digitalWrite(2,LOW);
      digitalWrite(3,HIGH);
      digitalWrite(4,LOW);
    }
   
//
    if(tcount == 8 ){
      prss[0] = prss[4];
    }
 
    if(tcount >= 12 ){ //tcount initialise
      loopflag = 1;
      tcount = 1;
    }else{
      tcount++;
    }
  }else{
    tcount++;
  }
}

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。