Элегантно зацикливая сообщение SOS в светодиоде Arduino, мигает

Я пытаюсь заставить свой Arduino мигать «SOS» в азбуке Морзе как мой первый настоящий проект по программированию.

Мне это удалось, однако теперь я хотел бы более эффективно писать код. Вот моя версия. Как можно реализовать цикл 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.)

person Yoojin Palmer    schedule 16.05.2013    source источник


Ответы (2)


Я бы предложил простую функцию генерировать азбуку Морзе вместо того, чтобы снова и снова писать взаимодействие. Это может быть что-то вроде этого.

GenerateMorseCode(char MorseArray[], int len);

Вы можете заполнить MorseArray некоторым идентификатором для точки и тире: Может быть, вы можете использовать точку (.) и хипен (-). Так для 3 дит, 3dah и 3 дит. Ваш массив будет

...---...

с длиной массива 9. Теперь внутри функции GenerateMorseCode все, что вам нужно сделать, чтобы проанализировать MorseArray. Вы можете использовать простой случай переключения примерно так

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;

}

}

}

Кроме того, вы можете обернуть эту функцию внутри другой функции, которая продолжает вызывать функцию GenerateMorseCode в соответствии с указанными циклами. Чтобы сгенерировать MorseArray, вы можете создать карту массива символов с помощью азбуки Морзе. Вы можете продолжать добавлять новое перечисление и обновлять соответствующий 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 
}
person praks411    schedule 16.05.2013
comment
Большое спасибо, я посмотрю на это позже, так как это кажется сложным, и я на своем мобильном телефоне. - person Yoojin Palmer; 16.05.2013

Вы хотите, чтобы метод представлял «тире», а метод — «точки». Вот пример использования контакта № 13 на Uno: 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);
}

Обратите внимание, что методы dash() и dot() делают повторение намного более элегантным и требуют меньше кода, чем жесткое кодирование каждого тире или точки.

person Andrew    schedule 23.09.2014