Не удается получить ИК-коды после отправки ИК на тот же 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=снайпер).
Есть много чего сказать, поэтому, если у вас есть вопросы, просто задавайте их.
Мы будем признательны за любую помощь/идеи, заранее спасибо.
@Patrick, 👍1
Обсуждение1 ответ
Лучший ответ:
Казалось бы, звуковой аспект моей большой программы мешал ИК-приемнику, так как каждый раз, когда я посылаю ИК, я также воспроизводю звук. Это звук останавливал приемник, а не ИК-передатчик. Когда я удалил звук из скетча, он работал, как и предполагалось. Спасибо timemage за вашу помощь.
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Модуль HW-477 с ИК-датчиком VS1838B: Помощь с выводами
- Arduino IRremote перестает работать
- Можно ли подключить более одного ИК-приемника к Arduino Uno?
- Использование ИК-пульта с Arduino
- KY-022 ИК-приемник, светодиод всегда горит, нет выхода
- ИК приемник принимает только 0
Ваш код не компилируется с простой библиотекой «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