цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Приемопередатчик кода Морзе на Arduino с передачей данных с помощью лазеров



Приемопередатчик кода Морзе на Arduino с передачей данных с помощью лазеров

Автор: Mike(admin) от 25-12-2022, 03:55

Лазерный пейджер на Arduino с передачей морзянки


В данном проекте мы реализуем своеобразную систему передачи данных на основе кода Морзе, где в качестве среды передачи будет использоваться лазерный луч. Здесь мы задействуем два Arduino UNO, каждый со своим компьютером, для отправки друг другу сообщений азбукой Морзе с помощью лазерного диода и получения данных с помощью фоторезистора.


Приемопередатчик кода Морзе на Arduino с передачей данных с помощью лазеров

Оба Arduino используют один и тот же набор кодов и могут как отправлять, так и получать сообщения, как текстовые сообщения. Код Морзе использует комбинации точек, тире и подчеркивания и шифрует в себе все видимые символы ASCII.


Для уверенной передачи данных необходимо лазер каждой платы расположить напротив фотоприемника другой платы.


Приемопередатчик кода Морзе на Arduino с передачей данных с помощью лазеров

Схема подключения следующая.


Приемопередатчик кода Морзе на Arduino с передачей данных с помощью лазеров

Код программы для обеих плат Arduino представлен далее.



const int laserPin = 2;
const int photoPin = A0;
const int lightLimit = 800;
int photoVal; 

String myName = "";
boolean introEnd = false;

String myText;
String myMorse;
String myMorseChar;
int myTextNum = 0;

String theirMorse;
boolean messEnd = false;
int spaces = 0;
int spaceIndex;
String theirMorseChar;
String theirText;
String theirName;
int theirTextNum = 0;

const int dot = 30;
const int dash = dot * 2;
const int undscr = dot * 3;
const int elemSpace = dot;
const int charSpace = dot;
const int messSpace = dot * 2;

const char* asciiArray[] = {
  
// space to /
".", "-", "_", "..", ".-", "._", "-.", "--", "-_", "_.", "_-", "__", "...", "..-", ".._", ".-.", 
// 0 to 9
".--", ".-_", "._.", "._-", ".__", "-..", "-.-", "-._", "--.", "---",
// : to @
"--_", "-_.", "-_-", "-__", "_..", "_.-", "_._", 
// A to M
"_-.", "_--", "_-_", "__.", "__-", "___", "....", "...-", "..._", "..-.", "..--", "..-_", ".._.", 
// N to Z
".._-", "..__", ".-..", ".-.-", ".-._", ".--.", ".---", ".--_", ".-_.", ".-_-", ".-__", "._..", "._.-", 
// [ to `
"._._", "._-.", "._--", "._-_", ".__.", ".__-",
// a to m
".___", "-...", "-..-", "-.._", "-.-.", "-.--", "-.-_", "-._.", "-._-", "-.__", "--..", "--.-", "--._", 
// n to z
"---.", "----", "---_", "--_.", "--_-", "--__", "-_..", "-_.-", "-_._", "-_-.", "-_--", "-_-_", "-__.", 
// { to ~
"-__-", "-___", "_...", "_..-" 
};

void setup() {
  pinMode(laserPin, OUTPUT);
  digitalWrite(laserPin, HIGH);

  Serial.begin(9600);
  Serial.println(F("Align the laser and sensor with another user's, then enter a username."));
}

void loop() {
  while(introEnd == false) {
    
    if(Serial.available()>0) {
      
      myName = Serial.readString();
      myName.trim();
    }
    
    if(myName != "") { 
      
      digitalWrite(laserPin, LOW);
      introEnd = true;
      
      Serial.print(F("Hi, "));
      Serial.print(myName);
      Serial.println(F("! Message away."));
      Serial.print(F("─────────────────────────────────────────────────────────"));
      Serial.println(F("────────────────────────────────────────────────────────"));
    }
  }
  
  while(introEnd == true) {
      
    while(Serial.available() > 0) {
      
      myText = Serial.readString();
      myText.trim();
      Serial.print(F("Me: "));
      Serial.println(myText);
      Serial.println();

      myName += ": ";
    
      if(myTextNum == 0) {
        myText = myName + myText;
      }
      
      for(int i=0; i < myText.length(); i++) {
       
        myMorseChar = asciiArray[myText.charAt(i) - 32];
        myMorse += myMorseChar + " ";
      }
    
      for(int i=0; i < myMorse.length(); i++) {
        
        myMorseChar = myMorse.charAt(i);
        
        if(myMorseChar == ".") {
          digitalWrite(laserPin, HIGH);
          delay(dot);
        }
        else if(myMorseChar == "-") {
          digitalWrite(laserPin, HIGH);
          delay(dash);
        }
        else if(myMorseChar == "_") {
          digitalWrite(laserPin, HIGH);
          delay(undscr);
        }
        else if(myMorseChar == " ") {
          delay(charSpace);
        }
        digitalWrite(laserPin, LOW);
        delay(elemSpace);
      }

      myMorse = "";
      myTextNum++;
      delay(messSpace);
    }
    
    while(analogRead(photoPin) > lightLimit) {

      messEnd = false;
      delay(dot + 5);
      
      while(messEnd == false) {
    
        if(analogRead(photoPin) < lightLimit) {
          theirMorse += ".";
          delay(dot);
        }
        else {
          delay(dot);
          if(analogRead(photoPin) < lightLimit) {
            theirMorse += "-";
            delay(dot);
          }
          else {
            theirMorse += "_";
            delay(dash);
          }
        }

        if(analogRead(photoPin) < lightLimit) {
          delay(dash);
          theirMorse += " ";
          
          if(analogRead(photoPin) > lightLimit) {
            delay(dot);
          }
          else {
            messEnd = true;
          }
        }
        else {
          delay(dot);
        }
      }
       
      for(int i=0; i <= 95; i++) {
        if(theirMorse[i] == ' ') {
          spaces++;
        }
      }
      int spaceIndexArray[spaces];
      
      for(int i=0; i <= spaces; i++) {
        if(i == 0) {
          spaceIndexArray[i] = theirMorse.indexOf(' ');
        }
        else {
          spaceIndexArray[i] = theirMorse.indexOf(' ', spaceIndexArray[i - 1] + 1);
        }
      }

      for(int i=0; i <= spaces; i++) {
        if(i == 0) {
          theirMorseChar = theirMorse.substring(0, spaceIndexArray[i]);
        }
        else {
          theirMorseChar = theirMorse.substring(spaceIndexArray[i - 1] + 1, spaceIndexArray[i]);
        }

        for(int j=0; j <= 95; j++) {
          if(theirMorseChar == asciiArray[j]) {
            theirText += char (j + 32);
          }
        }
      }

      theirText.trim();
      if(theirText.length() > 0) {
        
        if(theirTextNum == 0) {
          Serial.println(theirText);
          Serial.println();

          theirName = theirText.substring(0, theirText.indexOf(": ") + 2);
        }

        else {
          Serial.print(theirName);
          Serial.println(theirText);
          Serial.println();
        }

        theirTextNum++;
      }

      theirMorse = "";
      spaces = 0;
      theirText = "";
    }
  }
}



© digitrode.ru


Теги: Arduino, лазер, азбука Морзе




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий