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 핀을 소프트웨어로 수정하여 사용해야 한다는 것을
알았습니다.. 관련하여 소스코드들도 찾고는 있는데,,, 핀을 바꾸어 데이터를 수신받는게 아무래도 이해가 안돼네요... 도움이 필요합니다...감사합니다.
|