Ошибка “неизвестного символа” пропала. Но, появилась точка, потом другая. И сообщение Sent: не пропадает.
На экране приемника переданные буквы стирают первую строку, на которой отображается режим работы- приемник
Ошибка “неизвестного символа” пропала. Но, появилась точка, потом другая. И сообщение Sent: не пропадает.
На экране приемника переданные буквы стирают первую строку, на которой отображается режим работы- приемник
ну вам все таки надо освоить курс, а потом делать что то… или обратится к ИИ
вроде считается не культурным задавать более 1го вопроса в сутки))) по 1му и тому же вопросу, и никак не проявлять самостоятельность…
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; // j больше не нужен, всегда печатаем во второй строке
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);
lcd.print(" "); // Добавляем пробел, чтобы стереть возможный старый символ
} else {
// Если last_transmitted пусто, очищаем остаток строки, где мог быть "Last:X"
lcd.setCursor(10, 0);
lcd.print(" "); // 10 пробелов
}
} else {
lcd.print("RX ");
// Очищаем остаток строки от возможного "Last:"
lcd.setCursor(10, 0);
lcd.print(" "); // 10 пробелов
}
}
//функция передатчика
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; // Символ правильный
// --- ИСПРАВЛЕНИЕ 1: Очищаем вторую строку перед показом статуса ---
lcd.setCursor(0, 1);
lcd.print(" "); // Очищаем строку
// Показываем успешную передачу
lcd.setCursor(0, 1);
lcd.print("Sent: " + last_transmitted + " ");
delay(500);
// Очищаем вторую строку снова перед возвратом статуса
lcd.setCursor(0, 1);
lcd.print(" ");
show_status(); // Возвращаем статус
break; // Выходим из цикла после нахождения
}
}
// Если символ не найден
if (wrong_symbol) {
byte command = 40;
radio.write( &command, sizeof(command) );
// --- ИСПРАВЛЕНИЕ 1 (аналогично): Очищаем вторую строку перед показом статуса ---
lcd.setCursor(0, 1);
lcd.print(" ");
// Показываем ошибку
lcd.setCursor(0, 1);
lcd.print("Unknown symbol ");
delay(500);
lcd.setCursor(0, 1);
lcd.print(" ");
show_status();
}
symbol = ""; // Очищаем буфер символа
}
}
noTone(2);
}
//функция приёмника
void receiver_() {
// --- ИСПРАВЛЕНИЕ 2: Управление позицией печати ТОЛЬКО во второй строке ---
// Если дошли до конца второй строки (столбец 15), переводим курсор в начало второй строки
if (i > 15) {
i = 0;
// Просто переводим курсор в начало второй строки
lcd.setCursor(i, 1);
// Очищаем вторую строку перед началом новой печати
lcd.print(" ");
lcd.setCursor(i, 1);
}
//приём данных
if (radio.available()){
timer = millis();
radio.read(&command,sizeof(command));
Serial.println(command);
// Если символ не пробел (не специальный код)
if (command != 40) {
turn_on();
// Печатаем символ в текущей позиции ВТОРОЙ СТРОКИ (строка 1)
lcd.setCursor(i, 1);
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();
// --- ИСПРАВЛЕНИЕ 2: Устанавливаем начальную позицию для приёмника во вторую строку ---
i = 0;
// j = 0; // j больше не нужен
}
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();
// Очищаем вторую строку для ввода морзе
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
}
if (!transmitter) {
radio.startListening();
turn_on();
lcd.clear();
i = 0; // Сбрасываем позицию для новой сессии приёма
// j = 0;
show_status();
// Очищаем вторую строку для вывода принятых символов
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
}
}
}
//режим передатчика
if (transmitter){
transmitter_();
}
//режим приёмника
if (!transmitter){
receiver_();
}
}
Мляяяя…
ИИ вчера мне подсказал, что использование String забивает память. И что надо использовать Float
Для меня -это ни о чем не говорит)))
Последний код почти во всем удовлетворяет мои хотелки. )) Но, пробелы(паузы между буквами и словами) пропали
товарищ не отвлекайтесь! сын взрослеет, а время идет)))
а в прошлом коде они были ?
были. У Вас есть оригинальный код? я вчера выложил ссылку на автора проекта, но нечаянно стер ссылку на сам код.
Сейчас не могу отредактировать свой топик, можно было бы поместить первоначальный код в него.
Также была минимальная пауза между вводом букв подряд. Сейчас не позволяет подряд отправлять последовательность букв, без ожидания отображения на экране последней отправленной буквы
нет нету, он мне не нужен, ведь можно сделать лучше…
вам надо научиться вставлять код…
на форум? в сообщение? Топик не дает отредактировать.
попробуйте прямо сюда
p.s. если справитесь, я вам еще версию кода дам)))
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;
#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 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(7, OUTPUT);//дополнительный GND пин
digitalWrite(7, LOW);
pinMode(6, OUTPUT);//дополнительный GND пин
digitalWrite(6, LOW);
//инициализация радио
radio.begin();
radio.enableAckPayload();
radio.openWritingPipe(pipe);
radio.openReadingPipe(1,pipe);
//инициализация последовательного порта
Serial.begin(9600);
//инициализация дисплея
lcd.init();
lcd.cursor();
delay(2000);
}
void loop() {
Button_switch = digitalRead(4);
//Выбор режима работы
if (!Button_switch){
delay(100);
Button_switch = digitalRead(4);
if (!Button_switch){
transmitter = !transmitter;
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_();
}
}
// ПОЛНЫЙ ИСПРАВЛЕННЫЙ МАССИВ (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",
".", ",", "!", "?"
}; // Убрал лишний пробел из конца, т.к. индекс 40 теперь не нужен (массив от 0 до 39)
byte i = 0;
// byte j = 0; // j больше не нужен
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);
lcd.print(" "); // Добавляем пробел, чтобы стереть возможный старый символ
} else {
// Если last_transmitted пусто, очищаем остаток строки, где мог быть "Last:X"
lcd.setCursor(10, 0);
lcd.print(" "); // 10 пробелов
}
} else {
lcd.print("RX ");
// Очищаем остаток строки от возможного "Last:"
lcd.setCursor(10, 0);
lcd.print(" "); // 10 пробелов
}
}
//функция передатчика
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; // Предполагаем, что символ неправильный
// Ищем в массиве из 39 элементов (0-38, т.к. пробел исключен)
for (int p=0; p < 39; 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(" ");
// Показываем успешную передачу
lcd.setCursor(0, 1);
lcd.print("Sent: " + last_transmitted + " ");
delay(500);
// Очищаем вторую строку снова перед возвратом статуса
lcd.setCursor(0, 1);
lcd.print(" ");
show_status(); // Возвращаем статус
break; // Выходим из цикла после нахождения
}
}
// Если символ не найден
if (wrong_symbol) {
// Отправляем код ошибки (40, но мы его убрали, используем 39 как запасной)
byte command = 39;
radio.write( &command, sizeof(command) );
// Очищаем вторую строку перед показом статуса
lcd.setCursor(0, 1);
lcd.print(" ");
// Показываем ошибку
lcd.setCursor(0, 1);
lcd.print("Unknown symbol ");
delay(500);
lcd.setCursor(0, 1);
lcd.print(" ");
show_status();
}
symbol = ""; // Очищаем буфер символа
}
}
noTone(2);
}
//функция приёмника
void receiver_() {
// Управление позицией печати ТОЛЬКО во второй строке
// Если дошли до конца второй строки (столбец 15), переводим курсор в начало второй строки
if (i > 15) {
i = 0;
// Просто переводим курсор в начало второй строки
lcd.setCursor(i, 1);
// Очищаем вторую строку перед началом новой печати
lcd.print(" ");
lcd.setCursor(i, 1);
}
//приём данных
if (radio.available()){
timer = millis();
radio.read(&command,sizeof(command));
Serial.println(command);
// Если символ не код ошибки (39) и не пробел
if (command >= 0 && command < 39) { // Принимаем только символы 0-38
turn_on();
// Печатаем символ в текущей позиции ВТОРОЙ СТРОКИ (строка 1)
lcd.setCursor(i, 1);
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();
// Устанавливаем начальную позицию для приёмника во вторую строку
i = 0;
}
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();
// Очищаем вторую строку для ввода морзе
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
}
if (!transmitter) {
radio.startListening();
turn_on();
lcd.clear();
i = 0; // Сбрасываем позицию для новой сессии приёма
show_status();
// Очищаем вторую строку для вывода принятых символов
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
}
}
}
//режим передатчика
if (transmitter){
transmitter_();
}
//режим приёмника
if (!transmitter){
receiver_();
}
}
на сегодня это точно все, пошел заниматься другой фигней)))
Спасибо большое!
ps Пробелы между словами(группами) так и не появились. Если, вдруг, у Вас появится время сегодня-завтра-на днях-… , пока сын не вырос, задам еще пару вопросов
я опасаюсь что я пробелы без сборки на реальном железе не починю.….
но зато появилась буква q)))
Изучайте вместе с ним.
Это вполне серьезный совет - постепенно разбирайтесь сами и объясняйте ему.
Ага, на самом деле, andriano “мае рацию”.
К тому же, дети зачастую схватывают быстрее взрослых.
ну, я тут)) если что то пытались сделать, и есть прогресс, может подскажу что))) но по прежнему не уверен что пробелы починятся)))
Честное слово, изучал бы сам, но физически некогда. После работы за компьютером в течение часа, делаю 10мин перерывы(повышается давление до 170/110 и дико болит голова). А моя работа -работа за компьютером. Не могу сидеть за компом долго, кроме рабочих дел.
Сын-не технарь, учит три языка. Морзе-изучает морскую тематику. Вот и решил ему помочь.