?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

시리얼 통신에 관한 질문입니다 ㅎ

페이지 정보

작성자 정윤진 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-03-05 01:15 조회1,123회 댓글1건

본문

안녕하세요ㅎ 제가 주파수 측정하는 것까지 드디어 해내게 되었습니다. 그런데 주파수 측정값들이 시리얼 모니터에 뜨는데 버튼을 이용하여 아두이노 시리얼 통신을 시작하고 멈출 수 있나요? 아두이노 우노를 사용했구요 마이크모듈은 ADAFRUIT MAX4466을 썼습니다.

제가 하고 싶은 것은 첫번째 예제에서 led를 스위치로 켰다 껐다 하는 것처럼 두번째예제 시리얼 모니터를 제가 시작하고 멈출수 있냐가 궁금합니다. 스위치를 눌리면 시리얼 모니터에 현재 주파수 값들이 뜨고 스위치를 끄면 더이상 시리얼 모니터에 값들이 뜨지 않도록 말입니다. 이거두개를 어떻게 합치죠?ㅜㅜ 합칠수 없는 건가요??ㅜ 제발 도와주세요 ㅜㅜ



const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == LOW) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

-------------------------------------------------------------------------------

 

/*
fft_adc.pde
guest openmusiclabs.com 8.18.12
example sketch for testing the fft library.
it takes in data on ADC0 (Analog0) and processes them
with the fft. the data is sent out over the serial
port at 115.2kb.  there is a pure data patch for
visualizing the data.
*/

// do #defines BEFORE #includes
#define LOG_OUT 1 // use the log output function
#define FFT_N 256 // set to 256 point fft
#include <FFT2.h>


void setup() {
  Serial.begin(1200); // use the serial port
  TIMSK0 = 0; // turn off timer0 for lower jitter - delay() and millis() killed
  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0
  pinMode(A0, OUTPUT);
  pinMode(12, INPUT);
}

void loop() {
  while(1) { // reduces jitter
    cli();  // UDRE interrupt slows this way down on arduino1.0
    for (int i = 0 ; i < 512 ; i += 2) { // save 256 samples
      while(!(ADCSRA & 0x10)); // wait for adc to be ready
      ADCSRA = 0xf5; // restart adc
      byte m = ADCL; // fetch adc data
      byte j = ADCH;
      int k = (j << 8) | m; // form into an int
      k -= 0x0200; // form into a signed int
      k <<= 6; // form into a 16b signed int
      fft_input[i] = k; // put real data into even bins
      fft_input[i+1] = 0; // set odd bins to 0
    }
    // window data, then reorder, then run, then take output
    fft_window(); // window the data for better frequency response
    fft_reorder(); // reorder the data before doing the fft
    fft_run(); // process the data in the fft
    fft_mag_log(); // take the output of the fft
    sei(); // turn interrupts back on
     for (uint8_t j = 0; j < FFT_N/2; j++) {
      Serial.print(" ");
      Serial.println(fft_log_out[j]);
      delay(1000);
    }
  }
}

 

 

항상 감사드립니다.ㅜㅜ 정말로 아무리 구글링하고 검색해봐도 제게는 이 홈페이지가 가장 도움많이 됩니다. 정말 감사드립니다 고맙습니다ㅜ

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

시리얼 통신을 멈춘다는 표현보다는 잠시 사용하지 않는다는 표현이 더 맞을거 같아요. 아래처럼 Serial.print() 함수가 수행되지 않게 해주면 됩니다.

boolean useSerial = true;

void sendSerial() {
    if(useSerial) {
        Serial.print(" ");
        Serial.println(fft_log_out[j]);
    }
}

void loop() {
    ......
    if(Serial.available()) {
        char a = Serial.read();
        if(a == 'n')
            useSerial = true;
        else
            useSerial = false;
    }
    ......
}

PC에서 [n] 글자를 보내면 Serial 출력을 하고 이 외의 경우에는 출력하지 않도록 한 코드입니다.