単に大気圧を測っただけでは面白くないので、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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。