전자 공작 > 기압계 도착 > MPL115A2(I2C 접속)/유니버설 기판 실장

야외 고도 측정을 위해 기압계를 구입. 오늘 도착했다.
htp // 아키즈키덴시. 코 m/타타 g/g/기-04596/

관련 h tp : // 쿠이타. m / 7, f9 / ms / 02433dfc, 8c840b878f

자료



DataSheet

【기무차 공방 차고 하우스】 : 이전 모듈 정보?

회로



AQM0802 접속에 사용한 유니버설 기판을 유용.
ぃ tp // m / 7, f9 / ms / bf5, 653d1925cb38569

다음과 같이 연결했다.
  • ESP8266 : SDA (IO4) <-> MPL115A2 : SDA (Pin7)
  • ESP8266:SCL (IO5) <-> MPL115A2: SCL(Pin8)
  • EPS8266:VCC <-> MPL115A2: VDD(Pin1)
  • EPS8266:VCC <-> MPL115A2: SHDN(Pin4)
  • EPS8266:VCC <-> MPL115A2: RST(Pin5)
  • ESP8266:VSS <-> MPL115A2: GND(Pin3)
  • ESP8266:GND <-> 1uF <-> MPL115A2: CAP(Pin2)

  • SDA와 SCL은 4.7k로 풀업과 데이터 시트에 있지만, 이번은 기판의 유용으로 10k 풀업으로 동작.

    회로도 @ upverter

    브레드 보드로 구현.
    황색: SCL
    황색과 교차하는 오렌지: SDA
    녹색: GND
    빨간색: VCC



    코드 v0.1



    【기무차 공방 차고 하우스】
    의 코드를 참고로 데이터 시트를 보면서 변경했다.
    평균화 처리는 미실장.

    esp8266_160528_MPL115A2.ino
    #include <Wire.h>
    
    /*
     * v0.1 2016 May 28
     *   - add PrintPressure()
     *   - add ReadPressureAndTemperature()
     *   - add ReadCofficient()
     */
    
    #define MPL_ADDR (0x60)
    
    static float s_a0, s_b1, s_b2, s_c12; // 係数データ
    unsigned long iPress, iTemp;
    
    void setup() {
      Serial.begin(115200);
      Serial.println("");
    
      Wire.begin();
      delay(3000); // msec
      ReadCoefficient();
    }
    
    bool ReadCoefficient()
    {
      int len;
      unsigned int hi, lw;
    
      Wire.beginTransmission(MPL_ADDR);
      Wire.write(0x04);
      len = Wire.endTransmission();
      if (len == 0) {
        len = Wire.requestFrom(MPL_ADDR, 8);
        if (len == 8) {
          hi = Wire.read();
          lw = Wire.read();
          s_a0 = (hi << 5) + (lw >> 3) + (lw & 0x07) / 8.0;
          hi = Wire.read();
          lw = Wire.read();
          s_b1 = ( hi & 0x1F) * 0x100 + lw;
          s_b1 = s_b1 / 8192.0 - 3.0;
          hi = Wire.read();
          lw = Wire.read();
          s_b2 = (hi & 0x80) << 8 + lw;
          s_b2 = s_b2 / 16384.0 - 2.0;
          hi = Wire.read();
          lw = Wire.read();
          s_c12 = (hi * 0x100) + lw;
          s_c12 = s_c12 / 16777216.0;
    
          Serial.println(s_a0);
          Serial.println(s_b1);
          Serial.println(s_b2);
          Serial.println(s_c12);      
          return true;
        }
      }
      return false;
    }
    
    bool ReadPressureAndTemperature()
    {
      int len;
      unsigned int hi, lw;
    
      // 1. start conversion
      Wire.beginTransmission(MPL_ADDR);
      Wire.write(0x12);
      Wire.write(0x01);
      len = Wire.endTransmission();
      if (len != 0) return false;
      delay(3); // msec
    
      // 2. get values
      Wire.beginTransmission(MPL_ADDR);
      Wire.write(0x00);
      len = Wire.endTransmission();
      if (len == 0) {
        len = Wire.requestFrom(MPL_ADDR, 4);
        if (len == 4) {
          hi = Wire.read();
          lw = Wire.read();
          iPress = (hi * 256 + lw) / 64;
          hi = Wire.read();
          lw = Wire.read();
          iTemp = ( hi * 256 + lw) / 64;
          return true;      
        }
      }
      return false;
    }
    
    void PrintPressure()
    {
      float prs, f0;
      f0 = s_a0 + ( s_b1 + s_c12 * iTemp) * iPress + s_b2 * iTemp;
      prs = f0 * ( (115.0 - 50.0) / 1023.0 ) + 50.0;
      Serial.print("Pressure=");
      Serial.println(prs);
    }
    
    void loop() {
      if (ReadPressureAndTemperature()) {
        PrintPressure();
      }
      delay(1000); // msec
    }
    

    결과 (v0.1) > 계수 실수



    4개의 계수와 압력(kPa).

    맞는지는 미확인. 우선 통신은 되어 있다는 정도.
    계수의 계산식에 대해서는 요 확인.
    1905.00
    -2.24
    -2.00
    0.00
    Pressure=66.94
    Pressure=66.83
    Pressure=66.72
    Pressure=66.83
    Pressure=66.94
    Pressure=66.72
    Pressure=66.94
    Pressure=66.94
    Pressure=66.95
    Pressure=66.71
    

    코드 v0.2



    계수가 아무래도 이상한 것 같았다.

    이하, 계수의 계산이 상세하다.
    ht tp // 스피나. 여기 g-에 fty. 이 m/b㎉g/2014/09/피시 2c--mpl115. HTML

    esp8266_160528_MPL115A2.ino
    #include <Wire.h>
    
    /*
     * v0.2 2016 May 29
     *   - fix bug > coefficients calculation
     * v0.1 2016 May 28
     *   - add PrintPressure()
     *   - add ReadPressureAndTemperature()
     *   - add ReadCoefficient()
     */
    
    #define MPL_ADDR (0x60)
    
    static float s_a0, s_b1, s_b2, s_c12; // 係数データ
    unsigned long iPress, iTemp;
    
    void setup() {
      Serial.begin(115200);
      Serial.println("");
    
      Wire.begin();
      delay(3000); // msec
      ReadCoefficient();
    }
    
    bool ReadCoefficient()
    {
      int len;
      unsigned int hi, lw;
    
      Wire.beginTransmission(MPL_ADDR);
      Wire.write(0x04);
      len = Wire.endTransmission();
      if (len == 0) {
        len = Wire.requestFrom(MPL_ADDR, 8);
        if (len == 8) {
          hi = Wire.read();
          lw = Wire.read();
          s_a0 = (hi << 8) + lw;
          s_a0 /= 8.0;
          if (hi & 0x80) s_a0 -= 8192.0;
          hi = Wire.read();
          lw = Wire.read();
          s_b1 = (hi << 8) + lw;
          s_b1 /= 8192.0;
          if (hi & 0x80) s_b1 -= 8.0;
          hi = Wire.read();
          lw = Wire.read();
          s_b2 = (hi << 8) + lw;
          s_b2 /= 16384.0;
          if (hi & 0x80) s_b2 -= 4.0;
          hi = Wire.read();
          lw = Wire.read();
          s_c12 = (hi << 8) + lw;
          s_c12 /= 32768.0;
          if (hi & 0x80) s_c12 -= 2.0;
          s_c12 /= 512.0;
    
          Serial.println(s_a0);
          Serial.println(s_b1);
          Serial.println(s_b2);
          Serial.println(s_c12);      
          return true;
        }
      }
      return false;
    }
    
    bool ReadPressureAndTemperature()
    {
      int len;
      unsigned int hi, lw;
    
      // 1. start conversion
      Wire.beginTransmission(MPL_ADDR);
      Wire.write(0x12);
      Wire.write(0x01);
      len = Wire.endTransmission();
      if (len != 0) return false;
      delay(3); // msec
    
      // 2. get values
      Wire.beginTransmission(MPL_ADDR);
      Wire.write(0x00);
      len = Wire.endTransmission();
      if (len == 0) {
        len = Wire.requestFrom(MPL_ADDR, 4);
        if (len == 4) {
          hi = Wire.read();
          lw = Wire.read();
          iPress = (hi * 256 + lw) / 64;
          hi = Wire.read();
          lw = Wire.read();
          iTemp = ( hi * 256 + lw) / 64;
          return true;      
        }
      }
      return false;
    }
    
    void PrintPressure()
    {
      float prs, f0;
      f0 = s_a0 + ( s_b1 + s_c12 * iTemp) * iPress + s_b2 * iTemp;
      prs = f0 * ( (115.0 - 50.0) / 1023.0 ) + 50.0;
      Serial.print("Pressure=");
      Serial.println(prs);
    }
    
    void loop() {
      if (ReadPressureAndTemperature()) {
        PrintPressure();
      }
      delay(1000); // msec
    }
    

    결과(v0.2)



    결과
    1905.00
    -2.24
    -0.94
    0.00
    Pressure=100.48
    Pressure=100.68
    Pressure=100.60
    Pressure=100.48
    Pressure=100.60
    Pressure=100.40
    Pressure=100.60
    

    기압은 100.48kPa = 1004.8hPa.
    대체로 잘 듣는 기압(1013hPa)의 오더가 되었다.

    계수의 네 번째는 표시 자리수가 소수 2 자리수가 되어 버리고 있다.

    직렬 출력을 계속하면 중간에 출력이 멈 춥니 다. 코드가 나쁜지 기판, 전지가 나쁜지 요조사.

    범용 기판 실장



    범용 기판 실장.

    왼쪽은 microSD로 보존하기 위한 기판.
    오른쪽이 기압계를 실장한 기판.

    각각, XHP 커넥터로부터 전원 공급할 수 있지만, 옥외 사용을 위해서 CR-123A를 직삽할 수 있도록 했다.
    기압계의 풀업 저항은 4.7k로 하고 있다.

    좋은 웹페이지 즐겨찾기