M5Stack에서 microSD에 액세스하고 CSV 파일의 숫자를 읽습니다.

6555 단어 CSVmicroSDM5stack
M5Stack에는 LCD 디스플레이와 microSD 슬롯이 붙어 있기 때문에, 뭔가 모은 데이터를 간편하게 표시하는데 딱입니다.
그래서 microSD 카드에 들어간 CSV 파일의 숫자를 읽는 방법을 설명하고 싶습니다.

여기서는 다음과 같은 데이터가 들어있는 Data.csv라는 파일의 세 번째 열의 숫자를 얻는 것을 목표로합니다.



M5Stack에서 microSD에 액세스하고 CSV 파일의 숫자를 읽습니다.



먼저 M5Stack에서 microSD에 액세스합니다.
이 코드를 작성하여 Data.csv 파일에 액세스할 수 있습니다.

SDReader.cpp
void loop() {
  File file = SD.open("Data.csv");


그런 다음 CSV 파일에 포함된 문자를 로드합니다.

이어서, 읽고 있는 문자가 몇 열째에 있는지를 알기 위해서, 읽어들인 문자가 콤마인지 어떤지를 조사합니다. 그리고 쉼표인 경우에는 카운터의 값을 하나 늘리기로 합니다. 이번에는 int 형으로 connma_count라는 문자를 준비했습니다.
그리고 카운터의 값이 2로 나누어 나머지가 0이 될 때부터 문자를 카운트합니다.

SDReader.cpp

    buf[0] = file.read();
    if(connma_count%2==0 && connma_count>2){
      value[buf_number] = buf[0];
      buf_number++;
    }
     if (buf[0] == ',') {
      connma_count++;
    }


여기서 주의하는 포인트로서, 읽어들인 문자를 반복해 사용하고 싶은 경우에는, 매회 read() 함수를 사용하지 않고, 한 번 변수에 대입하고 나서 그 변수를 사용하도록 해 주세요. 매번 read()를 사용하면 실행할 때마다 읽고 있는 값이 다음 문자로 업데이트됩니다.

read() 함수를 한번 실행하면, 열린 파일로부터 받은 데이터를 1 바이트분만 돌려줍니다. 그리고 다시 실행하면 이번에는 이미 읽은 문자의 다음 문자를 읽고 값을 반환합니다.
Arduino등에서 자주 사용하는 Serial.read() 어쩐지 같은 움직임을 하고 있어, loop()내에서 그것을 반복하기 때문에, 시리얼 모니터로 문자가 계속되어 표시되는군요. 나는 SD카드 파일의 로드가 처음이었던 적도 있어, 지금까지 좋은 가감에 취급하고 있던 read() 함수가 어떻게 움직이고 있는지를 알 수 있는 좋은 기회가 되었습니다.

그리고, 콤마가 다음의 단락이 되었을 때에, 수치의 계산과 배열에의 격납을 실시했습니다. 이렇게 하면 셀의 값을 숫자로 처리할 수 있습니다.

SDReader.cpp
 if(connma_count%2==1&&connma_count>3)
    {
      value = ctoi(value[0])*100+ctoi(value[1])*10+ctoi(value[2]) ;
     }


여기서 사용한 ctoi()는 char형의 숫자를 int형으로 변환하기 위해 지정한 변수입니다.

SDReader.cpp
int ctoi(char c) {
    switch (c) {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        default: return 0;
    }
}

좋은 웹페이지 즐겨찾기