SSブログ
2015年06月13日| 2015年06月21日 |- ブログトップ

Arduinoで大気圧センサを使ってみる [Arduino]

大気圧センサを入手したので,Arduinoで動かしてみる.使用したのは,秋月電子の,「MPL115A2使用大気圧センサーモジュールキット(I2C) Ver2」.

ネットで調べると,Arduino用のライブラリが公開されていたので,ありがたく使わせてもらう.参照したのは,Arduinoで遊ぶページにある,「MPL115A2用ライブラリ」だ.

あとは,前回作った7セグLEDライブラリと組み合わせて,測定した大気圧を7セグLEDに表示してみる.

7セグLEDとの接続は前回と同じなので,大気圧センサとの接続部分のみ示そう.回路図はこんな感じ.
pressure_sensor_回路図.png

で,スケッチ.
#include <Wire.h>
#include <MPL115A2.h>
#include <MsTimer2.h>
#include <Led7segment.h>

const int anode_pins[] = {
    12, // A
    8,  // B
    5,  // C
    3,  // D
    2,  // E
    11, // F
    6,  // G
    4,  // DP
};

const int cathode_pins[] = {
    13, // DIG.1
    10, // DIG.2
    9,  // DIG.3
    7,  // DIG.4
};

const int ANODE_PINS_NUM   = sizeof(anode_pins)   / sizeof(anode_pins[0]);
const int CATHODE_PINS_NUM = sizeof(cathode_pins) / sizeof(cathode_pins[0]);

unsigned int display_buffer[CATHODE_PINS_NUM] = {0};

void write_1digit(const unsigned char bitmap)
{
    for (int i = 0; i < ANODE_PINS_NUM; i++) {
        digitalWrite(anode_pins[i], bitmap & (1 << i) ? HIGH : LOW);
    }
}

void clear()
{
    for (int i = 0; i < ANODE_PINS_NUM; i++) {
        digitalWrite(anode_pins[i], LOW);
    }
}

void write()
{
    for (int i = 0; i < CATHODE_PINS_NUM; i++) {
        digitalWrite(cathode_pins[i], LOW);
        write_1digit(display_buffer[i]);
        delayMicroseconds(100);
        clear();
        digitalWrite(cathode_pins[i], HIGH);
    }
}

void print_7seg(unsigned char *buff)
{
    noInterrupts();
    for (int i = 0; i < CATHODE_PINS_NUM; i++) {
        display_buffer[i] = buff[i];
    }
    interrupts();
}

void setup()
{
    for (int i = 0; i < ANODE_PINS_NUM; i++) {
        pinMode(anode_pins[i], OUTPUT);
    }

    for (int i = 0; i < CATHODE_PINS_NUM; i++) {
        pinMode(cathode_pins[i], OUTPUT);
        digitalWrite(cathode_pins[i], HIGH);
    }
    
    MsTimer2::set(1, write);
    MsTimer2::start();
    
    MPL115A2.begin();
}

void loop()
{
    unsigned char buff[CATHODE_PINS_NUM] = {0};
    const unsigned int numeric_digits = CATHODE_PINS_NUM;
    const unsigned int frac_digits = 3;

    Led7segment led;
    
    double pressure = 0.0;
    for (int i = 0; i < 10; i++) {
      pressure += MPL115A2.read();
      delay(100);
    }
    
    pressure /= 10.0;
    led.print(buff, pressure, numeric_digits, frac_digits);
    print_7seg(buff);
}


測定値のばらつきが多いようなので,10回測定して平均値を採用してる.
あと,本来は高度に応じて補正を入れて,海面更正気圧を求めるべきだが,ひとまず測定値そのままにしている.
こちらの使用環境ではおおよそ5気圧ほど低くなる計算(高度からの換算値)で,補正後の値を気象庁の気圧値(たとえば東京はこんな感じ)と比較してもおおよそ一致しているので,測定は正しく行えているようである.

で,実際の動作状況はこんなかんじ.
DSC_0214.jpg

大気圧測定ライブラリを利用すると,とても簡単に使える.作成者に感謝.
お試しあれ.

nice!(0)  トラックバック(0) 
共通テーマ:日記・雑感
2015年06月13日| 2015年06月21日 |- ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。