', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); 파일리스트 표시와 파일 읽기, 좌표 정렬. :: MakerLee's Workspace
728x90

현재 스케치를 짜기 전에 대략 구조를 생각하면 다음과 같습니다. 


1.SD카드에서 파일 리스트 읽기.

2.리스트에서 파일 선택.

3.선택된 파일 읽어들여서 CIRCLE의 좌표만을 걸러내 변수에 입력.

4.좌표값을 X좌표 기준으로 정렬. 

5.이후 순서대로 펀칭. 



일단 4.좌표값을 X좌표 기준으로 정렬. 부분이 약간 어려울 것 같기도 해서 공부를 해 봤습니다. 

페이스북 아두이노 포럼에 질문을 올렸더니 퀵소트와 구조체 정렬 등을 공부하면 될거라고 많이들 추천하시더군요.

그래서 관련자료를 찾아 읽고 있었습니다. 


그러다가

라는 말에 버블정렬로 결정... 



버블정렬 참조(링크)

한번 읽어보니 바로 이해할 수 있더군요.. 

정렬속도나 뭐 그딴건 이 프로젝트에선 별 의미가 없으니..



int coordinateX[] = { 2, 7, 4, 6, 5, 3, 8, 10, 9, 11, 14, 12, 13 }; 

int coordinateY[] = { 6, 2, 78, 24, 2, 79, 54, 10, 9, 33, 88, 22, 35 }; 



void setup(){

  Serial.begin(9600);

}


void loop() {

  sort(coordinateX,sizeof(coordinateX)/sizeof(int)); //Pass in the values and the size.


  Serial.print("size of array = ");

  Serial.println(sizeof(coordinateX)/sizeof(int));


  Serial.print("Sorted Array: ");

    for(int i=0; i<13; i++) {

      Serial.print("(");

      Serial.print(coordinateX[i]); 

      Serial.print(",");

      Serial.print(coordinateY[i]);

      Serial.print(")  ");

    }

  


  Serial.println("");

  Serial.print("Max Number: ");

  Serial.print(coordinateX[12]);

  Serial.println("");

  Serial.print("Min Number: ");

  Serial.print(coordinateX[0]);

  Serial.println("");


  while(1){

  //delay(10000); //Make sure we have enough time to see the output before starting the demo again.

  }

  

}


void sort(int a[], int size) {

    for(int i=0; i<(size-1); i++) {

        for(int j=0; j<(size-(i+1)); j++) {

                if(a[j] > a[j+1]) {

                    int t = a[j];

                    a[j] = a[j+1];

                    a[j+1] = t;

                    t = coordinateY[j];

                    coordinateY[j] = coordinateY[j+1];

                    coordinateY[j+1] = t;

                }

        }

    }

}


bubble sort 예제를 참조해서 X, Y 데이터를 집어넣고 X 기준으로 정렬하는 코드를 짜 봤습니다. 






size of array = 13

Sorted Array: (2,6)  (3,79)  (4,78)  (5,2)  (6,24)  (7,2)  (8,54)  (9,9)  (10,10)  (11,33)  (12,22)  (13,35)  (14,88)  

Max Number: 14

Min Number: 2


쉽게 정렬이 됐네요.





그래서 이제 SD 카드에서 파일 리스트를 읽어 정렬하는 부분을 시도해 봤습니다. 


/*

  Listfiles


 This example shows how print out the files in a

 directory on a SD card


 The circuit:

 * SD card attached to SPI bus as follows:

 ** MOSI - pin 11

 ** MISO - pin 12

 ** CLK - pin 13

 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)


 created   Nov 2010

 by David A. Mellis

 modified 9 Apr 2012

 by Tom Igoe

 modified 2 Feb 2014

 by Scott Fitzgerald


 This example code is in the public domain.


 */

#include <SPI.h>

#include <SD.h>


File root;


void setup() {

  // Open serial communications and wait for port to open:

  Serial.begin(9600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }


  Serial.print("Initializing SD card...");


  if (!SD.begin(4)) {

    Serial.println("initialization failed!");

    while (1);

  }

  Serial.println("initialization done.");


  root = SD.open("/");


  printDirectory(root, 0);


  Serial.println("done!");

}


void loop() {

  // nothing happens after setup finishes.

}


void printDirectory(File dir, int numTabs) {

  while (true) {


    File entry =  dir.openNextFile();

    if (! entry) {

      // no more files

      break;

    }

    for (uint8_t i = 0; i < numTabs; i++) {

      Serial.print('\t');

    }

    Serial.print(entry.name());

    if (entry.isDirectory()) {

      Serial.println("/");

      printDirectory(entry, numTabs + 1);

    } else {

      // files have sizes, directories do not

      Serial.print("\t\t");

      Serial.println(entry.size(), DEC);

    }

    entry.close();

  }

}


예제는 위와 같고

실행하면 아래와 같이 나옵니다.


Initializing SD card...initialization done.

SYSTEM~1/

WPSETT~1.DAT 12

INDEXE~1 76

DOREMI.MID 0

TEST.TXT 73

DADDY.DXF 46622

DOREMI.DXF 7439

done!



일단 이중에서 파일 이름만 읽어들여 화면에 띄워야 할 텐데 그 부분을 어떻게 처리해야 하는지 모르겠네요.





728x90

+ Recent posts