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