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

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

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

Код программы для обеих плат 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