정보나눔

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

센서에서 얻은 정보를 SD카드에 저장하는 것이 제대로 되지 않습니다.
shock | 2018-09-09
 

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

  아두이노 UNO

 

 

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

  아두이노 IDE

 

 

3. 사용한 센서 모델명

  BMP180

 

 

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

 

 

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

 

#include <SFE_BMP180.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
// You will need to create an SFE_BMP180 object, here called "pressure":
File myFile;

SFE_BMP180 pressure;

#define ALTITUDE 1655.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters

void setup()
{
  Serial.begin(9600);
  Serial.println("REBOOT");  

  // Initialize the sensor (it is important to get calibration values stored on the device).

  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    // Oops, something went wrong, this is usually a connection problem,
    // see the comments at the top of this sketch for the proper connections.

    Serial.println("BMP180 init fail\n\n");
    while(1); // Pause forever.
  }
}

void loop()
{
  char status;
  double T,P,p0,a;

  // Loop here getting pressure readings every 10 seconds.

  // If you want sea-level-compensated pressure, as used in weather reports,
  // you will need to know the altitude at which your measurements are taken.
  // We're using a constant called ALTITUDE in this sketch:
  
  Serial.println();
  Serial.print("provided altitude: ");
  Serial.print(ALTITUDE,0);
  Serial.print(" meters, ");
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" feet");
  
  // If you want to measure altitude, and not pressure, you will instead need
  // to provide a known baseline pressure. This is shown at the end of the sketch.

  // You must first get a temperature measurement to perform a pressure reading.
  
  // Start a temperature measurement:
  // If request is successful, the number of ms to wait is returned.
  // If request is unsuccessful, 0 is returned.

  status = pressure.startTemperature();
  if (status != 0)
  {
    // Wait for the measurement to complete:
    delay(status);

    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.

    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);
      Serial.print(" deg C, ");
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" deg F");
      
      // Start a pressure measurement:
      // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
      // If request is successful, the number of ms to wait is returned.
      // If request is unsuccessful, 0 is returned.

      status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);

        // Retrieve the completed pressure measurement:
        // Note that the measurement is stored in the variable P.
        // Note also that the function requires the previous temperature measurement (T).
        // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
        // Function returns 1 if successful, 0 if failure.

        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
          Serial.print("absolute pressure: ");
          Serial.print(P,2);
          Serial.print(" mb, ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");

          // The pressure sensor returns abolute pressure, which varies with altitude.
          // To remove the effects of altitude, use the sealevel function and your current altitude.
          // This number is commonly used in weather reports.
          // Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
          // Result: p0 = sea-level compensated pressure in mb

          p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
          Serial.print("relative (sea-level) pressure: ");
          Serial.print(p0,2);
          Serial.print(" mb, ");
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");

          // On the other hand, if you want to determine your altitude from the pressure reading,
          // use the altitude function along with a baseline pressure (sea-level or other).
          // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
          // Result: a = altitude in m.

          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          Serial.print(a,0);
          Serial.print(" meters, ");
          Serial.print(a*3.28084,0);
          Serial.println(" feet");
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");
// SD 카드 저장


  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
  // if the file opened okay, write to it:
  if (myFile) {
      myFile.println(" ==================================================================");
      myFile.print("temperature: ");
      myFile.print(T,2);
      myFile.print(" deg C, ");
      myFile.print((9.0/5.0)*T+32.0,2);
      myFile.println(" deg F");
      myFile.print("absolute pressure: ");
      myFile.print(P,2);
      myFile.print(" mb, ");
      myFile.print(P*0.0295333727,2);
      myFile.println(" inHg");
      myFile.print("relative (sea-level) pressure: ");
      myFile.print(p0,2);
      myFile.print(" mb, ");
      myFile.print(p0*0.0295333727,2);
      myFile.println(" inHg");
      myFile.print("computed altitude: ");
      myFile.print(a,0);
      myFile.print(" meters, ");
      myFile.print(a*3.28084,0);
      myFile.println(" feet");
      myFile.println(" ==================================================================");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }


  delay(5000);  // Pause for 5 seconds.
}

 

 

6. 문제점 및 에러 내용

  학교에서 우주 풍선 (기상 관측용 풍선)을 만드는 프로젝트를 진행하게 되었는데, 기상 관측을 위해 BMP180 센서 기압과 온도 등의 정보를 SD카드로 기록하는 기능을 만들어야 하는데, 기존에 컴퓨터 언어를 얇팍하게 배웠지만 아두이노는 그렇게 오래 다루어 본 것이 아니라서, 눈치껏 두 예제를 혼합해서 만들어 보았으나, SD카드가 인식이 안되면서 센서를 통한 측정은 이루어지나 SD카드에 정보가 담기질 않습니다. 분명 ReadWrite 예제를 작동시킬때에는 정상적으로 인식, 기록되었는데, 어디가 문제인지 알려줄 수 있을까요? 아두이노 우노를 사용중입니다..

이전글   |    nodeMCU를 통한 웹서버 2018-09-09
다음글   |    근전도 센서 관련 질문입니다~ 2018-09-11