📻 کد مورس با آردوینو — پیام مخفی بفرست
پروژهای که برنامهنویسی را با تاریخ قاطی میکند: همان سیستمی که ۱۵۰ سال پیامهای دنیا را جابهجا میکرد، در ۴۰ خط کد.
قوانین زمانبندی مورس
کل مورس روی یک واحد زمانی ساخته شده — به آن «نقطه» میگوییم:
- نقطه = ۱ واحد روشن
- خط = ۳ واحد روشن
- فاصلهی بین علامتهای یک حرف = ۱ واحد خاموش
- فاصلهی بین حروف = ۳ واحد خاموش
- فاصلهی بین کلمات = ۷ واحد خاموش
کد
const int led = 13, buzzer = 8;
const int UNIT = 150; // میلیثانیه؛ کوچکتر = سریعتر
const char* LETTERS[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....",
"..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.",
"--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-",
"-.--", "--.."
};
void signal(int units) {
digitalWrite(led, HIGH);
tone(buzzer, 700);
delay(UNIT * units);
digitalWrite(led, LOW);
noTone(buzzer);
delay(UNIT); // فاصلهی بین علامتها
}
void sendChar(char c) {
if (c == ' ') { delay(UNIT * 7); return; }
if (c >= 'a' && c <= 'z') c = c - 'a' + 'A';
if (c < 'A' || c > 'Z') return;
const char* code = LETTERS[c - 'A'];
for (int i = 0; code[i] != 0; i++) {
signal(code[i] == '-' ? 3 : 1);
}
delay(UNIT * 2); // مجموعاً ۳ واحد بین حروف
}
void setup() {
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop() {
const char* message = "SOS SALAM";
for (int i = 0; message[i] != 0; i++) {
sendChar(message[i]);
}
delay(3000);
}
چرا بعد از هر حرف فقط ۲ واحد صبر میکنیم؟
چون تابع signal خودش یک واحد فاصله گذاشته. ۱ + ۲ = ۳ واحد، همان قانون مورس. این جور جزئیات کوچک است که فرق بین «کار میکند» و «درست کار میکند» را میسازد.
SOS
معروفترین پیام مورس: سه نقطه، سه خط، سه نقطه. انتخاب شد چون ساده است و حتی کسی که مورس بلد نیست هم میتواند بزندش.
قدم بعدی
یک دکمه اضافه کن و مورس را خودت بزن، بعد آردوینو تشخیص بدهد چه حرفی زدهای — سختتر از فرستادن است ولی خیلی جذابتر.
پیام مورست را بفرست 📻