Ага. Про ардуинщиков там очень душевно ![]()
Первый признак тру-кодера — удивление, что написал, а оно работает; написал еще — ёпть, а оно снова работает! Увы, к этому моменту, приходят немногие, и немногие сохраняют прочность душевного равновесия и зрение.
Ага, частенько удивляюсь. Колдовство же ![]()
я кажется искать не умею))) можно ссылку ? или все что по запросу arduino это и есть все ?
у них одна проблема, у них нет денег на развитие навыков))) работая с сотнями модулей…(когда они просто читают, у них пропадает желание учиться) а потребители которые пришли что то получать просто, а не делится, это отдельный случай…
Так на той же странице, что я давал, давите Ctrl+F и вводите в окно поиска слово Ардуинщик
Никаких других ссылок - там же, в той же статье.
аааа понял спс, я просто думал там целое статеище есть, от человека которому например приходится с ними работать, потому что работодатель зажал денег, еще и не вкладывает в их обучение, или работать приходится с непонятными модулями ради экономии 50 руб, без описания… и на той же ардуино, или даже stm32,(все хорошо с ними, просто сидеть долго приходится за копейки))) ) от тех кто промариновался так сказать, и выгорел, чтоб было видно как у него пригорело, и какая у него любовь к такой жизни)))
Очевидно, есть два способа:
- Впихивать его туда принудительно программно (и, думаю, это наиболее логичный способ).
- Впихнуть по пробелу в конец каждой строки. Тогда программу (вероятно, я не смотрел код) менять не придется.
Вот поэтому я и написал, что 1-й вариант лучше. Но, с другой стороны, в морзянке несколько разных по длительности пауз.
Ну да. Часы, показывающие точное время два раза в сутки, тоже “частично работающие”.
“Конец символа обозначается паузой, во время которой произойдёт 30000 проверок состояния кнопки, пробел между словами – паузой длительностью в 60000 проверок состояния кнопки. Если введён неправильный код, то содержащая его переменная обнулится и начнётся набор новой последовательности точек и тире. В памяти передатчика содержится массив с кодами Морзе, а в памяти приёмника массив с соответствующими им символами. Передатчик отправляет только номер символа в массиве, совпавшего с набранным кодом(вместо пробела он сразу отправляет код 40, не проверяя массив символов). Приёмник выводит на дисплей элемент массива с номером, полученным от передатчика. При достижении конца строки следующая строка дисплея полностью очищается. Через минуту бездействия либо при работе в режиме передатчика дисплей перейдёт в спящий режим. При получении данных либо при нажатии кнопки смены режима работы он продолжит работу.”
Это из описания автора.
Монитор порта при передаче D и E с паузой между буквами:
00:07:18.664 -> 3
00:07:19.808 -> 40
00:07:22.810 -> 4
00:07:23.918 -> 40
если вот так быстро и не вникая, работает ? а если нет, что не так ? и я вникну позже
String morse_codes[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "......", ".-.-.-", "--..--", "..--.."};
char* symbols[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "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 ");
}
// Очищаем вторую строку для нового ввода
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 + "-";
} else {
symbol = symbol + ".";
}
// Отображаем текущий набираемый символ
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Morse: " + symbol);
buttonWasUp = false;
}
// Кнопка не нажата - считаем паузу
if (!buttonWasUp) {
cycle_time++; // Увеличиваем счетчик паузы
// Пауза 30000 - конец символа
if(cycle_time == 30000 && !symbol_end && symbol != ""){
boolean found = false;
for (int p=0; p < 40; p++){ // 40 элементов в массиве
if (symbol == morse_codes[p]){
Serial.println(p); // Отправляем индекс в монитор порта
last_transmitted = symbols[p];
command = p;
radio.write( &command, sizeof(command) );
symbol_end = true;
cycle_time = 0; // Сбрасываем счетчик после отправки
found = true;
wrong_symbol = false;
// Показываем успешную передачу
lcd.setCursor(0, 1);
lcd.print("Sent: " + last_transmitted + " ");
delay(500);
show_status(); // Возвращаем статус
symbol = ""; // Очищаем символ
break;
}
}
// Если символ не найден в массиве
if (!found) {
wrong_symbol = true;
symbol = ""; // Очищаем неправильный символ (как в описании)
lcd.setCursor(0, 1);
lcd.print("Wrong symbol ");
delay(500);
show_status();
}
}
// Пауза 60000 - пробел между словами (отправляем код 40)
if(cycle_time == 60000 && !symbol_end) {
Serial.println(40); // Отправляем 40 в монитор порта
command = 40;
radio.write( &command, sizeof(command) );
// Показываем пробел
lcd.setCursor(0, 1);
lcd.print("Space sent ");
delay(500);
show_status();
cycle_time = 0; // Сбрасываем счетчик
symbol = ""; // Очищаем символ (на случай если что-то было)
wrong_symbol = false;
}
}
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);
// Если символ не пробел (код 40)
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(" ");
} else {
// Это пробел (код 40)
turn_on();
lcd.setCursor(i, j);
lcd.print(" "); // Печатаем пробел
i++;
// Показываем полученный пробел в статусе
lcd.setCursor(10, 0);
lcd.print("Got: Space ");
}
}
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_();
}
}
Значит, автор, как, увы, это ужа становится традицией в Ардуино, не удосужился ознакомиться с предметной областью прежде, чем начинать писать код.
Это не просто красиво это, в этом конкретном случае, правильное написание массива, если вы не понимаете почему так…значит вы просто не понимаете почему так, нельзя быть докой во всём…
Поинтересуйтесь к примеру у @Green1 он точно знает почему так ![]()
Ну, уж позвольте, не знаю как “во всём”, а в написании массивов … в общем, это жуткий говнокод.
И,
то, лучше спросите, чем спорить.
чего тут спорить, первое сразу видно, что не совпадает количество элементов в обоих массивах, а второе, код радиолюбительский, это подразумевает знание предмета, я не говорю, что все должны быть кандидатами в мастера спорта, но минимум знаний по радиообмену должен быть…
Незнание предметной области сгубило СССР.
Когда главным показателем во внедрении суперкомпьютеров в несколько петафлопс ставится умение ходить строем…
Понятно.
![]()
в мониторе в режиме передатчика:
10:00:55.092 -> 40
10:00:56.776 -> 40
Отправляет циклом пробел- на экране в режиме передатчика моргает Space sent.
В мониторе порта в режиме приемника:
0:08:27.203 -> 40
10:08:28.892 -> 40
10:08:30.646 -> 40
10:08:32.320 -> 40
Если на передатчике оставить исходный код, а на приемнике Ваш, то принимает с пробелами между буквами и группами букв.
Но, не затирает в верхней строке надпись с последней полученной буквой.
String morse_codes[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "......", ".-.-.-", "--..--", "..--.."};
char* symbols[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "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.setCursor(10, 0);
lcd.print(" ");
}
} else {
lcd.print("RX ");
lcd.setCursor(10, 0);
lcd.print(" ");
}
// Очищаем вторую строку для нового ввода
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 + "-";
} else {
symbol = symbol + ".";
}
// Отображаем текущий набираемый символ
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Morse: " + symbol);
buttonWasUp = false;
}
// Кнопка не нажата - считаем паузу
if (!buttonWasUp) {
cycle_time++;
// Пауза 30000 - конец символа
if(cycle_time == 30000 && !symbol_end && symbol != ""){
boolean found = false;
for (int p=0; p < 40; p++){
if (symbol == morse_codes[p]){
Serial.println(p);
last_transmitted = symbols[p];
command = p;
radio.write( &command, sizeof(command) );
symbol_end = true;
cycle_time = 0;
found = true;
wrong_symbol = false;
// Показываем успешную передачу
lcd.setCursor(0, 1);
lcd.print("Sent: " + last_transmitted + " ");
delay(500);
show_status(); // Возвращаем статус
symbol = ""; // Очищаем символ
break;
}
}
// Если символ не найден в массиве
if (!found) {
wrong_symbol = true;
symbol = ""; // Очищаем неправильный символ
lcd.setCursor(0, 1);
lcd.print("Wrong symbol ");
delay(500);
show_status();
cycle_time = 0; // Сбрасываем счетчик при ошибке
}
}
// Пауза 60000 - пробел между словами (отправляем код 40)
if(cycle_time == 60000 && !symbol_end && symbol == "") { // Проверяем что символ пустой
Serial.println(40);
command = 40;
radio.write( &command, sizeof(command) );
// Показываем пробел
lcd.setCursor(0, 1);
lcd.print("Space sent ");
delay(500);
show_status();
cycle_time = 0;
symbol_end = true; // Блокируем повторную отправку
}
// Сбрасываем блокировку после отправки пробела
if(cycle_time > 60000) {
symbol_end = false;
}
}
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);
// Включаем подсветку при получении
turn_on();
screen = true;
// Если символ не пробел (код 40)
if (command != 40) {
lcd.setCursor(i, j);
lcd.print(symbols[command]);
i++;
// Затираем старую надпись перед выводом новой
lcd.setCursor(8, 0);
lcd.print(" "); // 7 пробелов для затирки "Got: X"
lcd.setCursor(8, 0);
lcd.print("Got:");
lcd.print(symbols[command]);
} else {
// Это пробел (код 40)
lcd.setCursor(i, j);
lcd.print(" ");
i++;
// Показываем полученный пробел в статусе
lcd.setCursor(8, 0);
lcd.print(" "); // Затираем
lcd.setCursor(8, 0);
lcd.print("Space ");
}
// Сбрасываем таймер для сна
timer1 = 0;
}
// Считаем время бездействия для сна
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();
}
// Небольшая задержка для антидребезга
delay(200);
}
}
//режим передатчика
if (transmitter){
transmitter_();
}
//режим приёмника
if (!transmitter){
receiver_();
}
}
bigsin что лажа откровенная ?))) я если что не троллю вас))) это просто вайбкодинг, без вникание в процесс, и сборки на реальном железе, еще такая помощь может быть успешной если мы оба примерно знаем что делать… иногда можно так помочь, но если нечего не получается, то лучше на этом и остановиться, используя ту версию которая боле менее выполняет функционал…
Не лажа, но нерабочая версия( вернее рабочая, но со сбоями в разных режимах). Я оставил версию автора, но с индикацией RGB светодиодом режима работы (куски Вашего кода). Соответственно, индикация режима на экране, не нужна. Индикация последней принятой буквы тоже не нужна, т.к. на экране приема отображаются все принятые буквы.
При смене режима работы на передатчик и обратно, все принятые буквы(слова) отображаются снова-как и хотелось (код автора).
Сейчас неудобство в том, что не отображаются на экране в режиме передачи ПЕРЕДАННЫЕ буквы, т.е. нет самоконтроля передачи. В коде автора, в режиме передачи, экран вообще потушен.
Также в режиме приема хотелось бы, чтобы зумер тоже работал, как при передаче. В передатчике понятно, как реализовано, а вот приемник ведь принимает только номер символа из массива, совпавшего с набранным кодом. И на зумер нужно отправлять снова кодированный сигнал Морзе?
String morse_codes[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "......", ".-.-.-", "--..--", "..--.."};
char* symbols[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "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 = "";
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(0x27,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);
}
}
//функция передатчика
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 + ".";
}
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);
byte command = p;
radio.write( &command, sizeof(command) );
symbol_end = true;
cycle_time = 0;
wrong_symbol = false;
}
else{
wrong_symbol = true;
}
}
symbol = "";
}
if(cycle_time == 60000 && wrong_symbol){
byte command = 40;
radio.write( &command, sizeof(command) );
}
}
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);
turn_on();
lcd.setCursor(i, j);
lcd.print(symbols[command]);
i++;
}
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.cursor();
delay(2000);
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();
transmitter = !transmitter;
}
else{
radio.stopListening();
turn_off();
}
}
if (!transmitter) {
radio.startListening();
turn_on();
}
}
}
//режим передатчика
if (transmitter){
transmitter_();
}
//режим приёмника
if (!transmitter){
receiver_();
}
}
Бесит.
как надо?