Помогите оптимизировать скетч

Доброго времени суток. попала мне в руки машинка на радиоуправлении и естественно без пульта управления. Вариант подобрать пульт не устраивал, поэтому покопавшись в просторах интернета нашел интересное для себя решение - Ардуино.
Заказал на всем известном сайте про Нано, про Мини, две нрф24 и тб6612.
Цель - управлять коллекторным мотором вперёд-назад потенциометром (с регулировкой скорости) и коллекторным мотором влево-вправо двумя кнопками.
В программировании полный ноль, но помня со школы принцип работы Паскаля, не без помощи интернета написал вот это :
код приёмника

#include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+

RF24           radio(10, 9);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[3];                                   // Создаём массив для приёма данных

uint8_t BIN1 = 5;
uint8_t BIN2 = 4;
uint8_t AIN2 = 8;
uint8_t AIN1 = 7;
uint8_t PWMA = 6;
uint8_t PWMB = 3;
uint8_t LED = 13;
uint8_t speedM = 0;             // скорость электродвигателя
uint8_t speedR = 0;

void setup() {
  Serial.begin (9600);
  pinMode(LED, OUTPUT);         // встроеный светодиод
  pinMode(AIN1, OUTPUT);        // вход AIN1
  pinMode(AIN2, OUTPUT);        // вход AIN2
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
    delay(1000);
     
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(0x6f);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_2MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
//  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные
}

void loop() {
    if(radio.available())                                 // Если в буфере имеются принятые данные
    radio.read(&data, sizeof(data));                       // Читаем данные в массив data и указываем сколько байт читать
    
   uint16_t A = data [0];
   uint16_t B = data [1];
   uint16_t C = data [2];
   // если A больше или равно 500, но меньше или равно 524 двигатель стоп!
  if (A >= 500 && A <= 524) {
  digitalWrite (LED, HIGH);
    digitalWrite (AIN1, HIGH);
   digitalWrite (AIN2, HIGH);
  }

  // если A больше 524 двигатель по часовой
  if (A > 524) {
    digitalWrite (LED, LOW);
    digitalWrite (AIN1, HIGH);
    digitalWrite (AIN2, LOW);
    speedM = map(A, 525, 1023, 0, 255);
    analogWrite (PWMA, speedM);
  }

  // если A меньше 500 двигатель против часовой
  if (A < 500) {
    digitalWrite (LED, LOW);
    digitalWrite (AIN1, LOW);
    digitalWrite (AIN2, HIGH);
    speedM = map(A, 0, 499, 255, 0);
    analogWrite (PWMA, speedM);
  }
  // управление рулем
  if (B == 1) {
    digitalWrite (BIN1, LOW);
    digitalWrite (BIN2, HIGH); 
    speedR = map(C, 0, 499, 255, 0);
    analogWrite (PWMB, speedR); 
  } 
  if (B != 1)  {
    digitalWrite (BIN1, HIGH);
    digitalWrite (BIN2, HIGH); 
  }
   // управление рулем
  if (C == 1) {
    digitalWrite (BIN1, HIGH);
    digitalWrite (BIN2, LOW); 
    speedR = map(C, 0, 499, 255, 0);
    analogWrite (PWMB, speedR); 
  } 
//  if (C != 1)  {
//    digitalWrite (BIN1, HIGH);
//    digitalWrite (BIN2, HIGH); 
//  }
  delay(100);
 Serial.println( A );
 Serial.println( B );
 Serial.println( C );
} 
'''
код передатчика
'''
#include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
RF24           radio(9, 10);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int            data[3];                                   // Создаём массив для приёма данных
void setup(){
    Serial.begin (9600);
    pinMode (A3, INPUT_PULLUP);                           //подключаем кнопку
    pinMode (A2, INPUT_PULLUP);
    radio.begin();                                        // Инициируем работу nRF24L01+
    radio.setChannel(0x6f);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_2MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на одном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
}
void loop(){
    data[0] = analogRead(A1);                             // считываем показания потенциометра с вывода A1 и записываем их в 0 элемент массива data
    data[1] = !digitalRead(A3);
    data[2] = !digitalRead(A2);
    radio.write(&data, sizeof(data));               // отправляем данные из массива data указывая сколько байт массива мы хотим отправить. Отправить данные можно с проверкой их доставки: if( radio.write(&data, sizeof(data)) ){данные приняты приёмником;}else{данные не приняты приёмником;}
  
    Serial.println( data[0] );                            // выводим информацию в ком порт
    Serial.println( data[1] );
    Serial.println( data[2] );
}

проблема в том, что имеется большая задержка после отдачи команды и её выполнением.
Подскажите, может как то можно это исправить в коде?

Ужасно написано, не вижу как отредактировать, извините

Прямо в окне редактора, три обратных апострофа до и после

“Большая задержка” - это сколько?
Как Вы определяете момент подачи команды? У Вас ведь данные передаются непрерывно. И при приеме неизбежны потери.
И как Вы определяете момент выполнения команды?

по нажатию на кнопку поворота. После нажатия, двигатель включается с задержкой, буквально 1-0,5сек. Может быть это и норма для такого модуля, а может просто у меня в коде большое нагромождение данных, которые можно и не передавать

Избавиться от delay в строке №89 не предлагать?

Измерьте это время поточнее.
И еще был вопрос насчет моментов времени. При ответе на него по крайней мере будет ясно, где именно образуется задержка:

  • между нажатием на кнопку и отправкой команды,
  • между отправкой и приемом команды,
  • между приемом команды и включением двигателя.

Ну и - да, та задержка, которую Вы заметили, совпадает по порядку величины с той, которую Вы сами вставили в программу.

ком порт приёмника
14:09:27.504 → 516
14:09:27.504 → 0
14:09:27.504 → 1
ком порт передатчика
14:09:27.034 → 516
14:09:27.034 → 0
14:09:27.034 → 1

По совету убрал все delay из скетчей
передатчик
14:17:33.241 → 516
14:17:33.241 → 0
14:17:33.241 → 1
приёмник
14:17:33.288 → 516
14:17:33.288 → 0
14:17:33.288 → 1
Машинка стала реагировать намного лучше, вот такого управления я и ожидал. Спасибо за помощь

Себе - любимому :slight_smile:

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

2 лайка

Можно даже дополнить. А то какой-то ТС пошёл непонятливый