정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 우노를 사용해 ms5803 압력센서를 두개 사용하는 방법에 대해 질문합니다.
민동현 | 2018-05-30
 

1. 프로젝트 사용한 보드 종류

  아두이노 UNO rev 3

 

 

2. 사용한 개발 프로그램명

  아두이노 IDE

 

3. 사용한 센서 모델명

  ms5805-02ba01

 

4. 연결한 회로 설명 (또는 이미지)

 

 

5. 소스코드 (주석 필수)

  (원하는 기능의 코드를 전부 작성해 드리긴 어렵습니다. 기초부터 차근차근 공부해보면서 코드를 만들어 보세요.)

 

// Distributed with a free-will license.

// Use it any way you want, profit or free, provided it fits in the licenses of its associated works.

// MS5805_02BA01

// This code is designed to work with the MS5805_02BA01_I2CS I2C Mini Module available from ControlEverything.com.

// https://www.controleverything.com/products

 

#include <Wire.h>

 

// MS5805_02BA01 I2C address is 0x76(118)

#define Addr 0x76

 

unsigned long Coff[6], Ti = 0, offi = 0, sensi = 0;

unsigned int data[3];

void setup()

{

  // Initialise I2C communication as MASTER

  Wire.begin();

  // Initialise Serial Communication, set baud rate = 9600

  Serial.begin(9600);

 

  // Read cofficients values stored in EPROM of the device

  for(int i = 0; i < 6; i++)

  {

    // Start I2C Transmission

    Wire.beginTransmission(Addr);

    // Select data register

    Wire.write(0xA2 + (2 * i));

    // Stop I2C Transmission

    Wire.endTransmission();

 

    // Request 2 bytes of data

    Wire.requestFrom(Addr, 2);

     

    // Read 2 bytes of data

    // Coff msb, Coff lsb

    if(Wire.available() == 2)

    {

      data[0] = Wire.read();

      data[1] = Wire.read();

    } 

     

    // Convert the data

    Coff[i] = ((data[0] * 256) + data[1]);

  }

  delay(300);

}

 

void loop()

{

  // Start I2C Transmission

  Wire.beginTransmission(Addr);

  // Send Reset command

  Wire.write(0x1E);

  // Stop I2C Transmission

  Wire.endTransmission();

 

  // Start I2C Transmission

  Wire.beginTransmission(Addr);

  // Refresh pressure with the OSR = 256

  Wire.write(0x40);

  // Stop I2C Transmission

  Wire.endTransmission();

  delay(500);

 

  // Start I2C Transmission

  Wire.beginTransmission(Addr);

  // Select data register

  Wire.write(0x00);

  // Stop I2C Transmission

  Wire.endTransmission();

 

  // Request 3 bytes of data

  Wire.requestFrom(Addr, 3);

 

  // Read 3 bytes of data

  // ptemp_msb1, ptemp_msb, ptemp_lsb

  if(Wire.available() == 3)

  {

     data[0] = Wire.read();

     data[1] = Wire.read();

     data[2] = Wire.read();

  }  

 

  // Convert the data

  unsigned long ptemp = ((data[0] * 65536.0) + (data[1] * 256.0) + data[2]);

 

  // Start I2C Transmission

  Wire.beginTransmission(Addr);

  // Refresh temperature with the OSR = 256

  Wire.write(0x50);

  // Stop I2C Transmission

  Wire.endTransmission();

  delay(500);

 

  // Start I2C Transmission

  Wire.beginTransmission(Addr);

  // Select data register

  Wire.write(0x00);

  // Stop I2C Transmission

  Wire.endTransmission();

 

  // Request 3 bytes of data

  Wire.requestFrom(Addr, 3);

 

  // Read 3 bytes of data

  // temp_msb1, temp_msb, temp_lsb

  if(Wire.available() == 3)

  {

     data[0] = Wire.read();

     data[1] = Wire.read();

     data[2] = Wire.read();

  }

 

  // Convert the data

  unsigned long temp = ((data[0] * 65536.0) + (data[1] * 256.0) + data[2]);

 

  // Pressure and Temperature Calculations

  // 1st order temperature and pressure compensation

  // Difference between actual and reference temperature

  unsigned long dT = temp - ((Coff[4] * 256));

  temp = 2000 + (dT * (Coff[5] / pow(2, 23)));

 

  // Offset and Sensitivity calculation

  unsigned long long off = Coff[1] * 131072 + (Coff[3] * dT) / 64;

  unsigned long long sens = Coff[0] * 65536 + (Coff[2] * dT) / 128;

 

  // 2nd order temperature and pressure compensation

  if(temp >= 2000)

  {

     Ti = 0;

     offi = 0;

     sensi = 0;

  }

  else if(temp < 2000)

  {

    Ti = (dT * dT) / (pow(2,31));

    offi = 5 * ((pow((temp - 2000), 2))) / 2;

    sensi = offi / 2;

    if(temp < - 1500)

    {

      offi = offi + 7 * ((pow((temp + 1500), 2)));

      sensi = sensi + 11 * ((pow((temp + 1500), 2))) / 2;

    }

  }

 

  // Adjust temp, off, sens based on 2nd order compensation  

  temp -= Ti;

  off -= offi;

  sens -= sensi;

 

  // Convert the final data

  ptemp = (ptemp * sens / 2097152 - off);

  ptemp /= 32768;

  float pressure = ptemp / 100.0;

  float ctemp = temp / 100.0;

  float fTemp = ctemp * 1.8 + 32.0;

 

  // Output data to serial monitor

  Serial.print("Temperature in Celsius : ");

  Serial.print(ctemp);

  Serial.println(" C");

  Serial.print("Temperature in Fahrenheit : ");

  Serial.print(fTemp);

  Serial.println(" F");

  Serial.print("Pressure : ");

  Serial.print(pressure);

  Serial.println(" mbar");

  delay(500);

}

6. 문제점 및 에러 내용

  (소스코드 문제일 경우 에러 내용도 같이 올려주세요.)

 

ms5805 압력센서를 두개! 사용하여 아두이노 우노에서 데이터를 수신받고 싶습니다. 여러곳에 질문을 해보니 이 센서는 

어드레스가 하나 밖에 (1110110) 없어서 우노에서 사용하려면 우노의 gpio 핀을 소프트웨어로 수정하여 사용해야 한다는 것을 

알았습니다.. 관련하여 소스코드들도 찾고는 있는데,,, 핀을 바꾸어 데이터를 수신받는게 아무래도 이해가 안돼네요... 도움이 필요합니다...감사합니다.

 

이전글   |    ds1302모듈로 시계만들기 질문 2018-05-30
다음글   |    아두이노 ESP8266 연결 관련 궁금한 것이 있습니다. ... 2018-05-30