а у меня нет, только ссылка на профиль… но может это только у меня… можете наверное код от туда выложить… может и код вам скинут))) улучшенный!
типа такого, но естественно проверять собирая проект лениво…
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; // Светодиод режима приема (используем пин 6, который был GND)
#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 ");
}
// Очищаем вторую строку для нового ввода
if (transmitter) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
}
}
//функция передатчика
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;
if (timer1 >= 150) {
symbol = symbol + "-";
}
if (timer1 < 150) {
symbol = symbol + ".";
}
// Отображаем текущий набираемый символ
lcd.setCursor(0, 1);
lcd.print(" "); // Очищаем строку
lcd.setCursor(0, 1);
lcd.print("Morse: " + symbol);
buttonWasUp = false;
}
if (!buttonWasUp) {
cycle_time += 1;
if(cycle_time == 30000 && !symbol_end){
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(); // Возвращаем статус
}
else{
wrong_symbol = true;
}
}
symbol = "";
}
if(cycle_time == 60000 && wrong_symbol){
byte command = 40;
radio.write( &command, sizeof(command) );
// Показываем ошибку
lcd.setCursor(0, 1);
lcd.print("Unknown symbol ");
delay(500);
show_status();
}
}
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_();
}
}
и надеюсь без вопросов, потому что я на них не смогу ответить))) это надо все собирать и проверять…