2013-05-16 3 views
1

모스 코드에서 내 Arduino 깜박임 "SOS"를 나의 첫 번째 실제 프로그래밍 프로젝트로 만들려고합니다.Arduino의 SOS 메시지가 우아하게 반복 됨 LED가 깜박임

나는이 작업에 성공했지만 지금은 코드를보다 효율적으로 작성하고 싶습니다. 여기 내 버전이 있습니다. while 루프를 구현하여 S를 두 번 깜박이게 할 수 있습니까? 그것은 카운터와 반복을 추적하는 것을 복잡하게하는 것처럼 보입니다.

int led = 13; 
//yj Integer representing dit (morse ' . ') 
int dit = 500; 
//yj Integer representing dah (morse ' - '>) 
//yj Testing a multiple of another constant integer to make the timing scalable. 
int dah = dit*3; 
int blankTime = 100; 

// the setup routine runs once when you press reset: 
void setup() {     
    // initialize the digital pin as an output. 
    pinMode(led, OUTPUT);  
} 

// the loop routine runs over and over again forever: 
void loop() { 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dit);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dit);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dit);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 

    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dah);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dah);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dah);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 

    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dit);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dit);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
    digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) 
    delay(dit);    // wait 
    digitalWrite(led, LOW); // turn the LED off by making the voltage LOW 
    delay(blankTime);    // wait 
} 

//TODO: 
//Loop counter implementation for multiples (SOS = 3 dit, 3 dah, 3 dit.) 

답변

0

나는 인터렉션을 반복해서 쓰는 대신 모스 부호를 생성하는 간단한 함수를 제안합니다. 이런 식으로 할 수있어.

GenerateMorseCode (char MorseArray [], int len);

MorseArray에 dit 및 dah의 식별자를 입력 할 수 있습니다. 도트 (.)와 하이픈 (-)을 사용할 수 있습니다. 그래서 3 dit, 3dah와 3 dit. 당신의 배열은 지금 9로 배열의 길이

...---... 

것 GenerateMorseCode 기능 내부는 MorseArray을 구문 분석 할 필요. 당신은 더 많은 사용자가 지정한 루프에 따라 GenerateMorseCode 함수를 호출 계속 다른 함수 내에서이 기능을 포장 수있는이

GenerateMorseCode(char MorseArray[], int len) 
{ 
    for(int i =0i<len;i++) 
{ 
switch(MorseArray[i]) 
{ 
    case '.': 
    //Your led logic in case of dot 
    break; 
    case '-': 
    //Your led logic in case of dah 
    break; 

} 

} 

} 

같은 간단한 스위치 케이스 뭔가를 사용할 수 있습니다. MorseArray를 생성하기 위해서는 Morse 코드가있는 char 배열의 맵을 생성 할 수 있습니다. 새로운 enum을 계속 추가하고 해당 Morsemap을 업데이트 할 수 있습니다. 이 같은 것

#define MAX_ELEM 12 
enum MorseCode 
{ 
    A_M = 0, 
    B_M, 
    C_M, 
    SOS_M 
}; 

typedef struct MorseMap 
{ 
    char array[MAX_ELEM]; 
}; 

MorseMap mm[3] = {{'.','-','\0'},{'-','.','.','.','\0'},{'-','.','-','.','\0'} }; 

또한 길이가 필요하지 않으며 문자 배열에서 계산할 수 있습니다. 어떤 모스 코드를 사용 mm [A_M] 또는 mm [SOS_M]

GenerateMorseCode(char arr[]) 
{ 
    int len = strlen(arry); 
    //Above for loop and switch case case 
} 
+0

고마워요, 나중에 복잡해 보이는 것처럼 보겠습니다. 모바일에 있습니다. –

0

당신은 방법이 "대시"와 "점"을 표현하는 방법을 표현하려는 액세스 할 수 있습니다. http://www.devfactor.net/2014/09/22/arduino-made-easy-output-messages-in-morse-code/

/* 
Morse SOS 
*/ 

// the setup function runs once when you press reset or power the board 
void setup() { 
    // initialize digital pin 13 as an output. 
    pinMode(13, OUTPUT); 
} 

// the loop function runs over and over again forever 
void loop() { 

    for (int a = 0; a < 3; a++) { 
    dot(); 
    } 
    for (int b = 0; b < 3; b++) { 
    dash(); 
    } 
    for (int c = 0; c < 3; c++) { 
    dot(); 
    } 
} 

void dot() 
{ 
    digitalWrite(13, HIGH); 
    delay(250); 
    digitalWrite(13, LOW); 
    delay(250); 
} 

void dash() 
{ 
    digitalWrite(13, HIGH); 
    delay(1000); 
    digitalWrite(13, LOW); 
    delay(250); 
} 

참고 대시() 및 도트() 메소드를 더적이고 우아 반복하는 하드 코딩 각 파선 또는 도트보다 작은 코드가 필요 만드는 것이 : 은 여기 우노에 핀 번호 (13)를 사용하는 예이다 .