А звука морзянки нету? А надо?
Да, в коде Морзе есть и русские буквы. В других проектах это реализуемо, но другим алгоритмом. Сын уже давно выучил все напевы букв на русском. Пример “А”-ай-даа(.-), “Б”- баа-ки те-кут(-…) и т.п.
Может и проще общаться на русском(это прошлый этап его обучения). Сейчас изучение “международной азбуки”. Выход в эфир предполагает общение на английском.
Вместо кнопок у меня подключены ключи. Один, напечатанный на 3D, а второй еще СССРовский))
От Морзе никуда не отошли- послушайте эфир на 40м(7МГц)
Вы не первый, кто пытается выехать на “вдруг кого-то тоже заинтересует”. Так не работает. То, что реально интересно многим, гуглится в течение двух секунд в числе вариаций, не поддающихся исчислению. Если же ничего в интернетах нет, то и тема никому не интересна. Вероятность, что она заинтересует кого-то на конкретном сайте околонулевая. Собствено, вы и сами видите заинтересованность здешних обитателей. Так что вариантов у вас два - или таки осваивать и делать самому, или искать исполнителя
исполнитель уже тут!)))
Удивительные суждения)) На форуме есть проект барографа. Ни разу нет сообщений о монетизации. Результат-отточеный, законченый проект под хотелки всех участников.
Ваш “брат” модернизировал код для Вас за денюжку?))
нет, но я тратил кучу времени не для того что бы бесплатно присматривать за братом как он пишет код… а присматривать надо, включая сборку и тест на реальном железе! и в целом обучение это потеря времени не приносящая доход, следовательно зачем мне его сначала терять, а потом делать не популярные проекты бесплатно ?))) когда вы сами можете заплатить или потерять время)))
у меня все логично, а вот в ваших суждениях кажется что то не так))) или опровергните мои слова))
Ничего подобного не нагуглил. В основном декодеры.
О чем и речь
От ключей-клоподавов отошли! И давно. Самое простое - электронный ключ. Конечно, если обмениваться отдельными фразами между подростками - сойдёт и такое.
Можно узнать Ваш возраст?
Опровергать ничего не буду, но сделаю свой вывод.
Сначала клоподав, затем ямбический. Всему придет свое время.
тридцать есть, жаль что не опровергаете, может все таки бы нашлась причина зачем все таки мне этим заниматься, и почему вы не сможете сделать сами… но это не точно)) возраст спрашивать не буду, и так поверю что причина есть весомая наверное)))
Я лучше поразбираюсь с кодом Вашего “брата” или ИИ, чем вступать с Вами в бессмысленную полемику)))
Пока я буду изучать языки программирования, мой сын вырастет))))
так заплатите))) это мне частично принесет окупаемость затраченного времени, и поделитесь проектом со всеми, а может продайте несколько версий, и может быть сотни человек обучат других людей… вот не понимаю я вас))) почему у вас такая реакция на оплату за труд ? кстате обучение начальное наверное занимает 6 месяцев и 100к… на модули… какое же у вас детское суждение, но вы у меня спрашиваете возраст)))
сдается мне вы просто лентяй… ну никак не хотите что то делать… я уже вам вон сколько вариантов накидал)))
а это… вот интересно, вы чисто случайно, уже не пообещали что соберете улучшенную версию сами ? а тем более надеюсь клятву на мизинчиках не давали… а то есть и такие кадры))) не мне в принципе все равно, но если так обстоит дело, то дайте пж знать… чисто поржать)))
ну и в целом, если проект не готовы собирать, вы подумайте над аналогом решения! рыбалка - природа, я не изверг, как минимум советом помогу!
Я в конце 70х бесплатно на радиокружок ходил. Сейчас за все плати. (((
Подскажите дельным советом почему после передачи каждой буквы очищается дисплей этим куском кода и вылетает сообщение неизвестный символ?
// Очищаем вторую строку для нового ввода
if (transmitter) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
что бы учиться, действительно код надо научиться вставлять верно… только в виде исключения подсказываю заранее, вот тут
lcd.print(" "); уменьшите количество пробелов, помогло ?
Я ввел так, как Вы прислали. Я имел ввиду, что на форуме в сообщение не знал как выложить код.
Ваш совет не помог.
а если так ?
String morse_codes[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "......", ".-.-.-", "--..--", "..--.."};
char* symbols[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", ",", "!", "?", " "};
byte i = 0;
byte j = 0;
unsigned long timer_backlight = 0;
unsigned long timer1_backlight = 0;
unsigned long timer = 0;
unsigned long cycle_time = 0;
unsigned long timer1 = 0;
String symbol = "";
String last_transmitted = ""; // Для хранения последнего переданного символа
byte command = 0;
const uint64_t pipe = 0xE8E8F0F0E1LL;
boolean buttonWasUp = false;
boolean buttonIsUp = true;
boolean symbol_end = false;
boolean wrong_symbol = false;
boolean Button_switch = true;
boolean transmitter = true;
boolean screen = true;
// Пины для светодиодной индикации
const int LED_TRANSMIT = 5; // Светодиод режима передачи
const int LED_RECEIVE = 6; // Светодиод режима приема
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); //адрес другого дисплея 0x27. 16,2 - количество столбцов и строк
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
RF24 radio(9,10);
//функция включения дисплея
void turn_on() {
lcd.display();
lcd.backlight();
}
//функция выключения дисплея
void turn_off() {
lcd.noDisplay();
lcd.noBacklight();
}
// Функция обновления индикации режима работы
void update_mode_indicators() {
if (transmitter) {
digitalWrite(LED_TRANSMIT, HIGH);
digitalWrite(LED_RECEIVE, LOW);
} else {
digitalWrite(LED_TRANSMIT, LOW);
digitalWrite(LED_RECEIVE, HIGH);
}
}
// Функция отображения статуса на LCD
void show_status() {
lcd.setCursor(0, 0);
lcd.print("Mode:");
if (transmitter) {
lcd.print("TX ");
if (last_transmitted != "") {
lcd.setCursor(10, 0);
lcd.print("Last:");
lcd.setCursor(15, 0);
lcd.print(last_transmitted);
}
} else {
lcd.print("RX ");
}
// Очистка второй строки УБРАНА - теперь она очищается только при необходимости
}
//функция передатчика
void transmitter_() {
buttonIsUp = digitalRead(3);
if (!buttonIsUp){
timer = millis();
delay(20);
buttonIsUp = digitalRead(3);
}
while (!buttonIsUp) {
tone(2, 550);
buttonIsUp = digitalRead(3);
buttonWasUp = true;
}
if (buttonWasUp) {
cycle_time = 0;
symbol_end = false;
timer1 = millis() - timer;
// Определяем символ (точка или тире)
String newChar = (timer1 >= 150) ? "-" : ".";
symbol = symbol + newChar;
// Отображаем текущий набираемый символ - БЕЗ ОЧИСТКИ ВСЕЙ СТРОКИ
if (symbol.length() == 1) {
// Первый символ - пишем всю строку с префиксом
lcd.setCursor(0, 1);
lcd.print("Morse: " + symbol);
} else {
// Добавляем только новый символ в конец
lcd.setCursor(7 + symbol.length() - 1, 1); // 7 = длина "Morse: "
lcd.print(newChar);
}
buttonWasUp = false;
}
if (!buttonWasUp) {
cycle_time += 1;
// Проверяем завершение символа (прошло 3 секунды)
if(cycle_time == 30000 && !symbol_end && symbol.length() > 0){
wrong_symbol = true; // Предполагаем, что символ неправильный
for (int p=0; p <= 40; p++){
if (symbol == morse_codes[p]){
Serial.println(symbol);
last_transmitted = symbols[p]; // Сохраняем последний символ
byte command = p;
radio.write( &command, sizeof(command) );
symbol_end = true;
cycle_time = 0;
wrong_symbol = false; // Символ правильный
// Показываем успешную передачу
lcd.setCursor(0, 1);
lcd.print("Sent: " + last_transmitted + " ");
delay(500);
show_status(); // Возвращаем статус
break; // Выходим из цикла после нахождения
}
}
// Если символ не найден
if (wrong_symbol) {
byte command = 40;
radio.write( &command, sizeof(command) );
// Показываем ошибку
lcd.setCursor(0, 1);
lcd.print("Unknown symbol ");
delay(500);
show_status();
}
symbol = ""; // Очищаем буфер символа
}
}
noTone(2);
}
//функция приёмника
void receiver_() {
//перевод строки
if (i > 15) {
i = 0;
j = j + 1;
if (j > 1) {
j = 0;
}
lcd.setCursor(i, j);
lcd.print(" ");
}
//приём данных
if (radio.available()){
timer = millis();
radio.read(&command,sizeof(command));
Serial.println(command);
// Если символ не пробел (не специальный код)
if (command != 40) {
turn_on();
lcd.setCursor(i, j);
lcd.print(symbols[command]);
i++;
// Показываем полученный символ в статусе
lcd.setCursor(10, 0);
lcd.print("Got: ");
lcd.print(symbols[command]);
lcd.print(" ");
}
}
timer1 = millis() - timer;
//выключение подсветки
if (timer1 > 60000 && screen){
turn_off();
screen = false;
}
}
void setup() {
//инициализация пинов кнопок и динамика
pinMode(2, OUTPUT); //выход для динамика
pinMode(4, INPUT_PULLUP); //кнопка смены режима работы
pinMode(3, INPUT_PULLUP); //кнопка набора символов
pinMode(8, OUTPUT); //дополнительный GND пин
digitalWrite(8, LOW);
// Пины для светодиодов
pinMode(LED_TRANSMIT, OUTPUT);
pinMode(LED_RECEIVE, OUTPUT);
//инициализация радио
radio.begin();
radio.enableAckPayload();
radio.openWritingPipe(pipe);
radio.openReadingPipe(1,pipe);
//инициализация последовательного порта
Serial.begin(9600);
//инициализация дисплея
lcd.init();
lcd.backlight();
lcd.cursor();
// Показываем приветствие
lcd.setCursor(0, 0);
lcd.print("Morse Telegraph");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
// Показываем начальный статус
lcd.clear();
show_status();
update_mode_indicators();
}
void loop() {
Button_switch = digitalRead(4);
//Выбор режима работы
if (!Button_switch){
delay(100);
Button_switch = digitalRead(4);
if (!Button_switch){
transmitter = !transmitter;
update_mode_indicators(); // Обновляем светодиоды
if (transmitter) {
if (!screen) {
turn_on();
screen = true;
timer = millis();
}
else{
radio.stopListening();
}
lcd.clear();
show_status();
}
if (!transmitter) {
radio.startListening();
turn_on();
lcd.clear();
i = 0;
j = 0;
show_status();
}
}
}
//режим передатчика
if (transmitter){
transmitter_();
}
//режим приёмника
if (!transmitter){
receiver_();
}
}
Ну так попробуйте сами ИИ. Может повезёт и польза получится. У меня до сих пор о нём нет единого мнения, иногда просто и понятно, иногда не может очевидного. Если совсем ни бум бум тогда нужен промпт-инженер, это Бабос - толмач с человеческого на ИИшный ![]()
