Не удается получить ИК-коды после отправки ИК на тот же Arduino (у меня есть importrecv.enableIRIn();)

У меня есть два Arduino с одинаковой проводкой, и они (надеюсь) станут лазерными пушками для моих младших кузенов.

Когда у них обоих есть скетч, который просто переключает свет при получении правильного ИК-кода, все работает как надо. см. код здесь:

// Начало скетча 1

#include <IRremote.h>
IRsend irsend; //Настройка ИК-передатчика
int receiver = 8; //инициализируем контакт 13 как контакт приемника.
IRrecv irrecv(receiver); //создаем новый экземпляр приемника
decode_results results;

// объявляем константы
const int trigger = 13;
const int greenLight = 7;
const int yellowLight = 2;
const int timeBetweenTransmittion = 800;

// объявляем переменные
bool toggleGreen = true;
bool toggleYellow = true;
long int previousTransmittion = 0;

// поместите сюда код установки для однократного запуска:
void setup() 
{
  pinMode(trigger, INPUT_PULLUP);
  Serial.begin(9600); // отправляем код со скоростью 9600 бит в секунду
  irrecv.enableIRIn(); // запускаем приемник
}

// поместите сюда ваш основной код для многократного запуска:
void loop() {
  if (not digitalRead(trigger) && millis() > previousTransmittion + timeBetweenTransmittion) // если кнопка нажата и с момента последней передачи прошло достаточно времени
  { 
    Serial.println("send!");
    irsend.sendNEC(1367857, 32); // отправляем код
    irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
    previousTransmittion = millis(); // устанавливаем запись для последней передачи на текущее время
      
    // включить желтый свет
    digitalWrite(yellowLight, toggleYellow);
    toggleYellow = not toggleYellow;
  }
  
  if (irrecv.decode(&results)) { // если мы получили ИК сигнал
    Serial.println (String(results.value, HEX)); // отображаем HEX-результаты
    if (String(results.value, DEC) == "1367857")
    {
      Serial.println("correct code");
      // включить зеленый свет
      digitalWrite(greenLight, toggleGreen);
      toggleGreen = not toggleGreen;
    }
    irrecv.resume(); // он останавливает приемник, когда что-то получено, поэтому мы должны возобновить работу приемника
 }
}

// Конец скетча 1

Приемник находится на контакте 8, а кнопка на контакте 13 и индикатор передачи всегда на контакте 3.

Нет проблем.

Однако, когда я использую те же концепции в крупномасштабном проекте, возникает странная проблема. Как только один из Arduino отправил ИК-сигнал, приемник больше не работает. После каждой строки кода, которая отправляет IR, я сопровождаю ее irrecv.enableIRIn();, и после каждого получения кода у меня есть строка irrecv.resume();. Я не могу понять, в чем проблема. Это очень длинно, но полный код ниже:

// Начало кода 2

// подключаем код библиотеки:
#include <LiquidCrystal.h> // Для ЖК-дисплея
#include <IRremote.h> // Для ИК связи
#include <PCM.h> // Для вывода звука

const unsigned char gunShot[] PROGMEM = {}; // В программе это содержит огромный массив заметок, я их убрал для экономии места

const unsigned char gunClick[] PROGMEM = {}; // В программе это содержит огромный массив заметок, я их убрал для экономии места


// Объявить константы для выводов
const int rs = A0, en = A1, d4 = A2, d5 = A3, d6 = A4, d7 = A5; // Константы состояния для всех контактов, используемых для ЖК-дисплея
const int trigger = 13;
const int redLight = 7;
const int magReader1 = 9;
const int magReader2 = 10;
const int speaker = 11;
const int healButton = 12;
const int receiver = 8;
const int muzzle = 2;

// Объявить константы для игрового процесса
const int timeBetweenShots = 800; //(в тысячных долях секунды)

const int healAmount = 100;

const int medicAmmo = 16;
const int assultAmmo = 31;
const int sniperAmmo = 1;

const int medicDamage = 30;
const int assultDamage = 23;
const int sniperDamage = 75;

const int playerNumber = 4;

// Объявить все допустимые значения
int timesKilledByTeam1 = 0; // Я бы хотел использовать здесь массив, но по какой-то причине массив сломал программу
int timesKilledByTeam2 = 0;
int timesKilledByTeam3 = 0;
int timesKilledByTeam4 = 0;
int timesKilledByTeam5 = 0;
int timesKilledByTeam6 = 0;
int timesKilledByTeam7 = 0;
int timesKilledByTeam8 = 0;

String receivedCode = ""; // Сохраняем полученный код в строковой переменной
bool gameDone = false;

bool semiCanShoot = true;
bool gunShouldClick = true;

int health = 100;
int gameMode = 1; // 1=TDM, 2=FFA, 3=LTS, 4=LPS
bool respawn = true;
int teamOrPlayer = playerNumber;
int loadStatus; // 0 — нет магазина, 1 — магазин1, 2 — магазин2

int mag1Ammo; // Текущий боезапас в mag1
int mag2Ammo; // Текущий боезапас в mag2
int maxAmmo; // Боеприпасы в одном магазине для выбранного класса
int damage; // Урон, который этот игрок наносит за выстрел

long int timeOfFlash = 0;
long int timeOfMuzzle = 0;
long int timeOfLastShot = 0;
long int loopTimer = 0;

int gameStartTime; // В секундах, поэтому нет необходимости в длинном int
//оставшееся целое число секунд;
int gameDuration;

int playerClass = 0; // 0=Медик, 1=Ассистент, 2=Снайпер

int shootCode;

IRsend irsend; //Настройка ИК-передатчика
IRrecv irrecv(receiver); //создаем новый экземпляр приемника
decode_results results;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void SetupClass()
{    
    switch (playerClass)
    {
        case (0):
          maxAmmo = medicAmmo;
          damage = medicDamage;
          break;
        case (1):
          maxAmmo = assultAmmo;
          damage = assultDamage;
          break;
        case (2):
          maxAmmo = sniperAmmo;
          damage = sniperDamage;
          break;
    }
    mag1Ammo = maxAmmo;
    mag2Ammo = maxAmmo;
}

// Определяем подпрограммы
//void QuickDisplayUpdate(int ammo, intsecondsRemaining, int loadStatus, int health) // Во время игры, чтобы избежать ненужных вычислений, обновляйте только то, что могло измениться во время игры
void QuickDisplayUpdate()
{
    lcd.setCursor(11,0);
    if((gameDuration - (millis() / 1000 - gameStartTime)) / 60 < 10)
    {
      lcd.print("0");
      lcd.setCursor(12,0);
    }
    lcd.print(String((gameDuration - (millis() / 1000 - gameStartTime)) / 60));

    lcd.setCursor(14,0);
    if((gameDuration - (millis() / 1000 - gameStartTime)) % 60 < 10) 
    {
      lcd.print("0");
      lcd.setCursor(15,0); 
    }
    lcd.print(String((gameDuration - (millis() / 1000 - gameStartTime)) % 60));


    lcd.setCursor(7,1); // Вставьте /, так как он мог быть удален из предыдущего "Reload!"
    lcd.print("/");
    
    lcd.setCursor(0,1);
    if (loadStatus == 0) lcd.print("Reload!");
    else if (loadStatus == 1)
    {
      lcd.print("Mag" + String(loadStatus) + ":");
      lcd.setCursor(5,1);
      if (mag1Ammo < 10)
      {
        lcd.print("0");
        lcd.setCursor(6,1);
      }
      lcd.print(String(mag1Ammo));
    }
    else
    {
      lcd.print("Mag" + String(loadStatus) + ":");
      lcd.setCursor(5,1);
      if (mag2Ammo < 10)
      {
        lcd.print("0");
        lcd.setCursor(6,1);
      }
      lcd.print(String(mag2Ammo));
    }



    lcd.setCursor(13,1);
    if(health < 100) 
    {
      lcd.print(" ");
      lcd.setCursor(14,1); 
      if(health < 10) 
        {
          lcd.print(" ");
          lcd.setCursor(15,1); 
        }
    }
   
    lcd.print(String(health));
}

void FullDisplayUpdate(int teamOrPlayer)
{
    lcd.clear();
    lcd.setCursor(0,0);
    switch (gameMode)
    {
        case (1):
          lcd.print("TDM");
          break;
        case (2):
          lcd.print("FFA");
          break;
        case (3):
          lcd.print("LTS");
          break;
        case (4):
          lcd.print("LPS");
          break;
    }

    lcd.setCursor(3,0);
    lcd.print(String(teamOrPlayer));
    
    lcd.setCursor(5,0);
    switch (playerClass)
    {
        case (0):
          lcd.print("Medic");
          break;
        case (1):
          lcd.print("Asult");
          break;
        case (2):
          lcd.print("Snipr");
          break;
    }

    lcd.setCursor(11,0);
    if((gameDuration - (millis() / 1000 - gameStartTime)) / 60 < 10)
    {
      lcd.print("0");
      lcd.setCursor(12,0);
    }
    lcd.print(String((gameDuration - (millis() / 1000 - gameStartTime)) / 60) + ":");

    lcd.setCursor(14,0);
    if((gameDuration - (millis() / 1000 - gameStartTime)) % 60 < 10) 
    {
      lcd.print("0");
      lcd.setCursor(15,0); 
    }
    lcd.print(String((gameDuration - (millis() / 1000 - gameStartTime)) % 60));



    lcd.setCursor(0,1);
    if (loadStatus == 0) lcd.print("Reload!");
    else if (loadStatus == 1)
    {
      lcd.print("Mag" + String(loadStatus) + ":");
      lcd.setCursor(5,1);
      if (mag1Ammo < 10)
      {
        lcd.print("0");
        lcd.setCursor(6,1);
      }
      lcd.print(String(mag1Ammo));
    }
    else
    {
      lcd.print("Mag" + String(loadStatus) + ":");
      lcd.setCursor(5,1);
      if (mag2Ammo < 10)
      {
        lcd.print("0");
        lcd.setCursor(6,1);
      }
      lcd.print(String(mag2Ammo));
    }


    lcd.setCursor(8,1);
    if (maxAmmo < 10)
    {
      lcd.print("0");
      lcd.setCursor(9,1);
    }
    lcd.print(String(maxAmmo));
    



    lcd.setCursor(11,1);
    lcd.print("H:" + String(health));

    
}


void Play()
{
  gameDone = false; // Когда игра начинается, игра еще не завершена
  
  FullDisplayUpdate(teamOrPlayer); // Полностью обновить дисплей перед началом игры

  // Настраиваем код съемки
  if(damage > 9) shootCode = (String(teamOrPlayer) + String(damage) ).toInt(); 
  else shootCode = (String(teamOrPlayer) + "0" + String(damage)).toInt();
   
  // Подождите, пока не будет получен код запуска или отмены
  Serial.println("wait");
  receivedCode = "";
  //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
  while (receivedCode.length() != 2 && receivedCode.length() != 4)
  {    
    if (irrecv.decode(&results)) 
    {
      receivedCode = String(results.value, DEC); // Сохраняем полученный код в переменной, когда получили ИК-сигнал
      irrecv.resume(); // Удалить код
    }
  }
  

  Serial.println("code: " + receivedCode);

  gameStartTime = millis() / 1000; // Установить время начала игры в секундах

  if (String(receivedCode) == "50") // Если полученный код был начальным кодом (50), то воспроизвести
  {
      Serial.println("strt, dur: " + String(gameDuration) + "team: " + String(teamOrPlayer));
      
      while (gameDone == false) // Повторяем, пока игра не завершится
      {    
          //Serial.println("Игровой цикл");

          CheckForIR(); // Проверяем ИК-код как можно чаще
          
          if (playerClass == 0) // Проверяем кнопку лечения, только если это медик
          {
            if (not digitalRead(healButton) && millis() > timeOfLastShot + timeBetweenShots) // Если они нажимают кнопку лечения и прошло достаточно времени с момента последнего выстрела
            {
                Serial.println("heal bttn");
                if (loadStatus == 1 && mag1Ammo == maxAmmo) // Если mag1 есть и он полон
                {
                    Serial.println("heal 1");
                    irsend.sendNEC((String(teamOrPlayer) + "00").toInt(), 32); // Отправляем код лечения
                    //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
                    digitalWrite(muzzle, 1); // Включаем дульную вспышку
                    timeOfMuzzle = millis(); // Установить время включения дула
                    // startPlayback(healShot, sizeof(healShot)); // Воспроизвести звук лечения
                    mag1Ammo = 0; // Опустошить текущий магазин
                }
                else if (loadStatus == 2 && mag2Ammo == maxAmmo) // Если mag2 есть и он полон
                {
                    Serial.println("heal 1");
                    irsend.sendNEC((String(teamOrPlayer) + "00").toInt(), 32); // Отправляем код лечения
                    //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
                    digitalWrite(muzzle, 1); // Включаем дульную вспышку
                    timeOfMuzzle = millis(); // Установить время включения дула
                    // startPlayback(healShot, sizeof(healShot)); // Воспроизвести звук лечения
                    mag2Ammo = 0; // Опустошить текущий магазин
                }
            }
          }
          
          CheckForIR();
          
          if (not digitalRead(trigger) && (millis() > timeOfLastShot + timeBetweenShots)) // Если спусковой крючок нажат и с момента последнего выстрела прошло достаточно времени
          {
              Serial.println("sht bttn");
              if (loadStatus == 1 && mag1Ammo > 0) // Если есть mag1 и патроны
              {
                  if (playerClass != 0 || semiCanShoot == true) // Они могут стрелять, если они находятся в полностью автоматическом режиме или если полуавтоматический режим может стрелять
                  {
                      Serial.println("1 sht");
                      irsend.sendNEC(shootCode, 32); // Отправляем код съемки
                      irrecv.enableIRIn(); // Запускаем приемник
                      digitalWrite(muzzle, 1); // Включаем дульную вспышку
                      timeOfMuzzle = millis(); // Установить время включения дула
                      mag1Ammo = mag1Ammo - 1; // Уменьшить боезапас текущего магазина на единицу
                      semiCanShoot = false; // После того, как они выстрелили, они не могут стрелять снова, если в полурежиме
                      startPlayback(gunShot, sizeof(gunShot)); // Играем выстрел
                      Serial.println("1 sht done");
                  }                     
              }
              
              else if (loadStatus == 2 && mag2Ammo > 0) // Если mag2 на месте и в нем есть патроны
              {
                  if (playerClass != 0 || semiCanShoot == true) // Они могут стрелять, если они находятся в полностью автоматическом режиме или если полуавтоматический режим может стрелять
                  {
                      Serial.println("2 sht");
                      irsend.sendNEC(shootCode, 32); // Отправляем код съемки
                      irrecv.enableIRIn(); // Запускаем приемник
                      digitalWrite(muzzle, 1); // Включаем дульную вспышку
                      timeOfMuzzle = millis(); // Установить время включения дула
                      mag2Ammo = mag2Ammo - 1; // Уменьшить боезапас текущего магазина на единицу
                      semiCanShoot = false; // После того, как они выстрелили, они не могут стрелять снова, если в полурежиме
                      startPlayback(gunShot, sizeof(gunShot)); // Играем выстрел
                      Serial.println("2 sht done");
                  }                            
              }
    
              else if (gunShouldClick) // (Если в магазине нет магазина ИЛИ нет патронов в магазине) И пистолет должен щелкнуть
              {
                  Serial.println("clik");
                  startPlayback(gunClick, sizeof(gunClick)); // Воспроизвести звук клика
                  gunShouldClick = false; // Пистолет не должен щелкать снова, пока не отпустит спусковой крючок
              }
              timeOfLastShot = millis(); // Обновляем время последнего выстрела
              Serial.println("shot done");
          }

          CheckForIR();
    
          // Проверяем, должен ли пистолет снова щелкнуть и может ли игрок снова стрелять в полурежиме
          if (digitalRead(trigger)) semiCanShoot = true; // Если они не держат курок, они могут снова выстрелить в полурежиме
          if (digitalRead(healButton) && digitalRead(trigger)) gunShouldClick = true; // Если они не держат спусковой крючок или кнопку лечения, пистолет должен снова щелкнуть, когда они снова держат его

          CheckForIR();

          // Если светодиоды горят достаточно долго, выключаем их
          if (millis() > timeOfFlash + 50) digitalWrite(redLight, 0); // Выключаем красные светодиоды, если они были включены достаточное количество времени
          if (millis() > timeOfMuzzle + 50) digitalWrite(muzzle, 0); // Отключаем дуло, если оно было включено достаточное количество времени
          
          CheckForIR();

          if (millis() > loopTimer + 250) // Некоторые вещи нужно делать реже, так что делайте это, чтобы сэкономить время, чтобы проверки получения IR можно было выполнять чаще
          {
              loopTimer = millis();
              
              QuickDisplayUpdate(); // Быстрое обновление дисплея после каждого цикла
  
              CheckForIR();
              
              // Обновляем переменную loadStatus в зависимости от входных данных магнитного детектора
              if (!digitalRead(magReader1) && digitalRead(magReader2))
              {
                  loadStatus = 1;
                  mag2Ammo = maxAmmo; // Пополнить mag2, если есть первый
              }
              else if (!digitalRead(magReader2) && digitalRead(magReader1)) 
              {
                  loadStatus = 2;
                  mag1Ammo = maxAmmo; // Заполнить магазин 1, если есть второй магазин
              }
              else loadStatus = 0;
  
              CheckForIR();
  
              // Проверяем, не достигла ли игра лимита времени
              if (gameDuration - (millis() / 1000 - gameStartTime) < 1)
              {
                Serial.println("tm up");
                gameDone = true;
              }
          }
          
      } // Игра завершена
      
  } // Если полученный код не был стартовым, то отменяем игру и возвращаемся в меню ожидания
}  


void CheckForIR()
{
  //Serial.println("проверить");
  //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
  if (irrecv.decode(&results)) // Если есть код
  {   
      receivedCode = String(results.value, DEC); // Сохраняем полученный код в строковой переменной
      Serial.println(receivedCode);
      irrecv.resume(); // Удалить код
      if (receivedCode.length() == 3) // Если полученный код имеет длину 3, то нас застрелили
      {          
          Serial.println ("shot"); //выводим код выстрела
          if (receivedCode.substring(0,1) != String(teamOrPlayer)) // Продолжаем, только если стрелок из другой команды
          {
              Serial.println ("another team");
              digitalWrite(redLight, 1); // Включаем красный свет
              health = health - (receivedCode.substring(1, 3).toInt()); // Снижаем здоровье за счет входящего урона, если это лечит врага, то эффекта не будет
          }
          else if (receivedCode.substring(1, 3).toInt() == 0)
          {
            Serial.println("heal");
            health = health + healAmount; // Лечение, если они союзники и наносят 0 урона
          }
          
      }
  
      if (health > 100) health = 100; // Устанавливаем обратно на 100, здоровье не может превышать 100
      else if (health < 1)
      {
          Serial.println ("died");
          switch(receivedCode.substring(0,1).toInt()) // Увеличиваем количество убийств убийцы на единицу
          {
            case (1):
              timesKilledByTeam1++;
              break;
            case (2):
              timesKilledByTeam2++;
              break;
            case (3):
              timesKilledByTeam3++;
              break;
            case (4):
              timesKilledByTeam4++;
              break;
            case (5):
              timesKilledByTeam5++;
              break;
            case (6):
              timesKilledByTeam6++;
              break;
            case (7):
              timesKilledByTeam7++;
              break;
            case (8):
              timesKilledByTeam8++;
              break;
          }
  
          health = 100; // Сбросить здоровье
          mag1Ammo = maxAmmo; // Заправить магазины
          mag2Ammo = maxAmmo;
          
          // Обновить ЖК-дисплей
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("You died!");
          lcd.setCursor(0,1);
          lcd.print("Return to base");
  
          if (respawn == false) gameDone = true; // Если вы играете в игровом режиме с одной жизнью, конец игры
          else // В противном случае ждем, пока не будет получен код респауна
          {
              //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
              while ((receivedCode != "50") && (gameDuration - (millis() / 1000 - gameStartTime) > 1)) // Продолжаем искать сигнал IR, пока не будет 50 или время не истекло
              {
                  //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
                  if (irrecv.decode(&results)) // если мы получили ИК-сигнал
                  {
                      receivedCode = String(results.value, DEC); // Сохраняем полученный код в переменной полученного кода
                      irrecv.resume();
                  }
              }                                    
          }
          FullDisplayUpdate(teamOrPlayer); // Сбросьте ЖК-дисплей в игровой режим
          
      }
  }
}



void setup() 
{ 
  lcd.begin(16, 2); // Настраиваем количество столбцов и строк ЖК-дисплея
  Serial.begin(9600); // Отправляем код со скоростью 9600 бит в секунду
  irrecv.enableIRIn(); // Запускаем приемник
  pinMode(trigger, INPUT_PULLUP);
  pinMode(magReader1, INPUT_PULLUP);
  pinMode(magReader2, INPUT_PULLUP);
  pinMode(healButton, INPUT_PULLUP);
}

void loop() // Повторять при поиске игры (между играми)
{
    Serial.println("\nlp");
    digitalWrite(redLight, 1); // Включаем свет, чтобы показать, что игрок в данный момент не играет
    
    // Печать экрана ожидания на LCD
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Awaiting start");
    lcd.setCursor(0,1);
    lcd.print("Player: " + String(playerNumber));

    //irrecv.resume();// ЕЩЕ НЕ ТЕСТИРОВАНО
    //irrecv.enableIRIn(); // отправка ir останавливает приемник, поэтому снова запускаем приемник
    while (not irrecv.decode(&results)) // ждем, пока не получим ИК-сигнал
    { 
        // Передаем данные предыдущей игры, пока ждем
        //Serial.println("подождите");
    }
    
    receivedCode = String(results.value, DEC); // Сохраняем полученный код в строковой переменной
    Serial.println(receivedCode); // отображаем результаты
    irrecv.resume();
    
    if (receivedCode.length() == 4) // Это была успешная передача, если полученный код состоял из 4 символов
    {
      playerClass = receivedCode.substring(3, 4).toInt(); // Устанавливаем класс в полученный класс
      Serial.println("clss: " + String(playerClass));      
      SetupClass();
      
      gameDuration = 180 * (receivedCode.substring(1,2).toInt() + 1); // Установить оставшееся время и продолжительность игры на полученное время
      Serial.println("tm lft" + String((gameDuration - (millis() / 1000 - gameStartTime))) + ", gameDuration: " + String(gameDuration));

      // Сброс счетчика смертей при запуске новой игры
      int timesKilledByTeam1 = 0;
      int timesKilledByTeam2 = 0;
      int timesKilledByTeam3 = 0;
      int timesKilledByTeam4 = 0;
      int timesKilledByTeam5 = 0;
      int timesKilledByTeam6 = 0;
      int timesKilledByTeam7 = 0;
      int timesKilledByTeam8 = 0;
      
      health = 100;
      
      switch (receivedCode.substring(0, 1).toInt()) // Выполняем операции на основе полученного игрового режима
      {
          case (1): // TDM
            Serial.println("TDM");
            gameMode = 1;
            teamOrPlayer = receivedCode.substring(2, 3).toInt();
            respawn = true;
            Play(); // Вызов игры с полученной командой и возрождение на
            break;
            
          case (2): //ФФА
            gameMode = 2;
            Serial.println("FFA");
            respawn = true;
            teamOrPlayer = playerNumber;
            Play(); // Вызываем игру с номером игрока и возрождаемся
            break;
            
          case (3): // LTS
            gameMode = 3;
            Serial.println("LTS");
            respawn = false;
            teamOrPlayer = receivedCode.substring(2, 3).toInt();
            //Играть в(); // Вызываем игру с полученной командой и отключаем респаун
            break;
            
          case (4): // ЛПС
            gameMode = 4;
            Serial.println("LPS");
            respawn = false;
            teamOrPlayer = playerNumber;
            //Играть в(); // Вызываем игру с номером игрока и отключаем респаун
            break;
            
          default:
            Serial.println("Unknown Gamemode");
            break;
      }
      
    }  
    
}

// Конец кода 2

Я знаю, что этот код беспорядок, я не должен использовать глобальные переменные и должно быть больше подпрограмм, но я написал большую часть этого прежде, чем вспомнил о них:/

Если я запускаю скетч и не делаю "снимок" при этом сбросе код работает полностью, как и предполагалось, но «количество убийств игроком x» раздел переменных, до которого я еще не добрался.

Дополнительная информация, которую я не считаю важной:

Есть третий Arduino, который позволяет вам выбрать код и отправить его или отправить код "50". Это "база" к которому кто-то должен вернуться, чтобы возродиться, так как это единственное, что может отправить код «50». Коды, которые он может отправлять, описаны ниже:

Он отправляет 4-значное число, но читается как 4 отдельных числа, например, рассмотрим код "rspq". r — режим игры (1 = возрождение команды, 2 = бесплатно для всех, 3 = последняя выжившая команда, 4 = последний выживший игрок), s — продолжительность игры (время (с) = 3 * (с + 1). ), что приводит к возможному времени 3,6,9...30), p - это команда, в которой состоит этот игрок (при игре в команде) (когда не играет в командную игру, он просто использует идентификатор игрока, сохраненный в этом конкретное оружие), а q — класс (1=медик, 2=штурмовик, 3=снайпер).

Есть много чего сказать, поэтому, если у вас есть вопросы, просто задавайте их.

Мы будем признательны за любую помощь/идеи, заранее спасибо.

, 👍1

Обсуждение

Ваш код не компилируется с простой библиотекой «IRRemote» из менеджера, по крайней мере, не с той версией, которую я установил. Вместо того, чтобы гадать, какая библиотека/форк/версия, я решил спросить, какая именно?, @timemage

У меня есть IRremote от shirriff, z3t0 и ArminJo. Я только что обновил его до 3.0.0, хотя я не уверен, какая версия у меня была до обновления, 2.6 или что-то в этом роде... Теперь он не компилируется :/, знаете, почему это так? Спасибо, @Patrick

Я использовал веб-сайт: https://github.com/Arduino-IRremote/Arduino-IRremote, чтобы обновить свой код до версии 3.0, но все еще есть одна строка, которая возвращает ошибку: IRsend.sendNECMSB(shootCode, 32); выдает ошибку: ожидаемый неквалифицированный идентификатор перед '.' токен. Вы знаете, как это исправить, или мне нужно снова отправить вам весь скетч после того, как я его обновил?, @Patrick

Я не уверен, что хочу спускаться в эту кроличью нору в комментариях. Мне просто нужно было знать, как компилировать исходный код. Я установил 2.6.1, и он компилируется., @timemage

Хорошо, 2.6.1 звучит вероятно, но как только Arduino отправляет ИК-код, он больше не получает их, хотя у меня есть строка enable ir. Любые идеи?, @Patrick

Такого рода вещи идут в вопросе. Что у вас уже есть в вопросе. Который я уже читал. Мне интересно, где именно в вашем коде это останавливается? Если вы подключили это к последовательному порту, вы можете посыпать свой код Serial.println(__LINE__);, см. печать номеров строк. Перемещайте их, пока не сузите точную строку (или строки, если она застряла в цикле в написанном вами коде), где код перестает выполняться., @timemage

Код никогда не зависает как таковой, после окончания «игры» он возвращается в основной цикл и работает нормально. Даже если я отправил IR в этом цикле, код нигде не застревает, он просто отключает приемник, поэтому больше IR не может быть получено., @Patrick

Что ж, я его скомпилировал и загрузил на плату, но у меня нет практического способа проверить его, чтобы хотя бы увидеть то, что видите вы. Я бы заменил код приема ИК на последовательный ввод для тестирования, но я ожидаю, что после этого проблема исчезнет или изменится. Если бы вы были в IRC, я бы помог вам преобразовать код во что-то более чистое, но в этом формате я мало что могу сделать. Я думаю, это хорошо, что ты хочешь сделать что-то для своих кузенов. Если вы сократите это до чего-то более управляемого, кто-то (может быть, я) внесет полезный вклад., @timemage

Спасибо, я попробовал использовать последовательный ввод, и, как вы и ожидали, проблема исчезла. Что такое IRC? Проблема в том, что когда я сократил ее до меньшей программы, у меня не было той же проблемы, я попытаюсь уменьшить содержимое программы по крупицам (удалить звук, затем ЖК-дисплей и т. д.), чтобы увидеть, смогу ли я определить, что делает это работает в моем маленьком скетче, но не в большом проекте. Спасибо еще раз., @Patrick


1 ответ


Лучший ответ:

1

Казалось бы, звуковой аспект моей большой программы мешал ИК-приемнику, так как каждый раз, когда я посылаю ИК, я также воспроизводю звук. Это звук останавливал приемник, а не ИК-передатчик. Когда я удалил звук из скетча, он работал, как и предполагалось. Спасибо timemage за вашу помощь.

,