Беспроводной телеграф на nrf24

Интересный проект, но не получивший продолжения

Это устройство, которое можно использовать как беспроводной телеграф. Работает в двух режимах с возможностью выбора(приёмник/передатчик). На передатчик вводится сообщение азбукой Морзе, приёмник выводит его же декодированным в привычный нам вид. Поддерживается только английский язык.

Автор статьи: http://cxem.net/profile/15597/

Старый проект, но по мне, очень интересный. Собран на макетках для сына и племянника. Прежде, чем собрать в корпус, хочется немного улучшений:

  1. Контроль передачи символов(на экране передатчика отображаются передаваемые символы).
  2. Отображение режима работы(передача-прием) на экране и на светодиодных индикаторах.
  3. … и т.п

PS В программировании абсолютный ноль.

Слишком скучно

Скучно для кого? Для меня и моего сына -нет. После сборки проекта, он уже выучил Азбуку Морзе. Я его не заставлял.

куча проводов))) лениво))) по wifi можно рацию наверное собрать… в связке с приложением на телефоне можно отсылать сообщения и читать при подключении…

вы просто поделились ссылкой на проект ? или решили показать профиль ? я вот этот момент не понял… хотя может у меня просто не открылась ссылка

Проводов минимум. Рацию собирать не интересно. Куча раций в наличие. Связка с телефоном не интересна всвязи с неустойчивой связью в “последнее время”. А вот изучение Морзе ребенком довольно увлекательное занятие, если общаешься с таким же увлеченным ровесником. Сыну интересно настолько, что он отправлял мне сообщения в Морзе по ватсапу, а теперь просит собрать передатчик-приемник. До “эфира” еще далеко, но попрактиковаться на маломощном трансивере будет очень полезно.

Я поделился ссылкой на чужой проект. По поводу “показать профиль” не совсем понял. Сылка открывает проект на другом сайте. Тема показалась мне интересной и я решил выложить ссылку здесь.

а у меня нет, только ссылка на профиль… но может это только у меня… можете наверное код от туда выложить… может и код вам скинут))) улучшенный!

типа такого, но естественно проверять собирая проект лениво…

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_();
  }                  
}

и надеюсь без вопросов, потому что я на них не смогу ответить))) это надо все собирать и проверять…

Сорри. Понял в чем дело

http://cxem.net/arduino/arduino221.php

Код очень похож. Видимо, это уже кем-то “модифицированный код”. В коде автора отсутствует буква “ Q” . В приведенном Вами коде ТОЖЕ.

у меня отсутствует потому что у вас отсутствует, может она не нужна…)))
главное nRF24L01.h крайне фиговые и капризные модули…

а протокол esp now наверное не осилите…
с другой стороны я вам основу дал, еще есть ии может и соберете…

Капризные по питанию, насколько я понимаю. Лечится добавлением конденсатора или подключением через шилд.

у меня как и серво sg90, полежали год в ящике, и не работают))) ни серво ни модули эти… а после покупке проверял…

  • куча нюансов… но если у вас работает, и удобны, можно и оставить их, ведь wifi на esp всего на 100 метров…

Предлагаю сразу учить этот алфавит…

Вот только не говорите, что такой х ни не будет никогда. :rofl:

Мой сын успешно сдал экзамен по этой хне в Артеке в этом году. Лагерь “Морской”-отряд “Юнги”)))

Поделитесь ссылкой на это “модифицированный” Код. Можно в личку. Я пока не разобрался, как править сообщения свои и не могу поменять ссылку на проект.

bigsin

ссылки нету, если не найдете код в сети, получается это первый и единственный, пж не говорите что я автор, я вам передаю код, со всеми правами, и теперь за его развитие отвечаете вы и только вы)))

а это работа мечты наверное… как минимум так подкачаться можно… если целый день так махать … интересно сколько платят за это…

если при этом постоянно не надо деньги искать на новые модули, то не так уж и ущербно)))

Самое рациональное решение - выучить теперь язык программирования Си.

1 лайк