Конфликт SoftwareSerial и IRRemote

Наблюдаю, что IRRemote (и iarduino_IR) принимают команды с пульта через раз. Т.е. работать оно работает, но некомфортно, иногда приходится водить пультом в разные стороны и повторно нажимать кнопки.
Дамп показывает, что пакеты распознаются не всегда.

Перебрал код, не помогло. Тестовые IR программы работают идеально. Случайно отключил

gpsSerial.begin(GPSBaud); //запуск программного COM порта

и прием с пульта идеально заработал. Это библиотека SoftwareSerial.

Вероятно есть некий конфликт. Вероятно по таймерам. Глубоко я не полез.

  • Есть у кого опыт сращивания программного COM и IR в одном проекте?
  • Кто-то может подскажет чип/плату IR приемника с I2C интерфейсом?

Nano на Atmega328PB

NeoSoftwareSerial не хочет 328PB, ставить PA для чисто потестить лень

ЗЫ Wire не мешает ни IR ни SoftwareSerial.
ЗЗЫ про второй COM в 328PB знаю, но лезть в железо и перекраивать код уже совсем лень, оставлю так или подпилю если не сложно выйдет.
ЗЗЗЫ Описание этого монстра что я сгородил сюда не выкладываю, стыдно мой код показывать.

на 328PB два нормальных сериала

Нам лень.

1 лайк

Попробуйте, если интересно, безбиблиотечный вариант:

Спойлер
// для ИК пульта приёмник без библиотеки
#define plus 4 //
#define minus 3 //
#define IK_PIN 2 //

volatile word keycode_ = 0;// переменная хранения кода кнопки

void setup() {
//  
pinMode(IK_PIN, INPUT);  // ir recv
pinMode(plus,OUTPUT);//
digitalWrite(plus,HIGH);// плюс питания ик приёмника
pinMode(minus,OUTPUT);//
digitalWrite(minus,LOW);// минус питания ик приёмника
// 
attachInterrupt(0, irread, FALLING);
Serial.begin(9600);
}
void loop() {
keypressed();
delay(100);
}
/////////////////////////////////////////
void irread() {
volatile static byte n = 0;
volatile static word keycode = 0;
volatile static unsigned long tm = 0;
volatile static unsigned long last = 0;

  tm = micros() - last; 
  last = micros();
  n += 1;
  if (tm > 3000) {
    keycode = 0;
    n = 0;
    }
  if (n >8&&n<=32) {
    if (tm > 1500) {keycode += 1;}
    keycode = keycode << 1;
  }
  if(n==32){keycode_ = keycode;keycode = 0;n=0;}
}
//////////////////////////////////////////
void keypressed() {
 if(keycode_!=0){
  Serial.println(keycode_, HEX);// печатаем код кнопки 
  //код по обработке значений keycode_
  keycode_ = 0;
   }  
 }
//////////////////////////////////////////////

Да, спасибо за идею. Но разобрать посылку NEC вручную выйдет весьма увлекательная штука.
У меня валяются где-то 1506ХЛ2. То, чо выплевывает она в превдопоследовательном коде разобрать попроще будет. Да и пультик с RC5 где-то валяется :))))

Ну не знаю, я пробовал на разных домашних пультах - коды читаются вразумительно.
…А вообще разные библиотеки выдавали на одних и тех же кнопках разные коды. Ну это уже лирика.

вы с сериала что то принимаете или только печатаете в него?
или и то и то?

1 лайк

Попробовал. Оно действительно что-то читает. Но вот что… Нажимаю одну и ту же кнопку. Так что, спасибо за совет, я код себе прикопал может когда и пригодится. Боюсь, что в моем соплестрое это не приживется.

И то и то.

У ir, если мой склероз не изменяет - большие задержки обычно.

Господа, всем спасибо!
Особенно ua6em. А UnforgivenII приглашаю в Лигу Лени.
Собственно заменить SoftwareSerial на Serial1 у меня мысль была. Но пугало много кода переделывать. Попробовал вкатал туда тест, оказалось, что надо перепаять одну ножу. Так уж вышло, что Software у меня висело на D11 и D10. Перевесил на D11 и D12, убрал пару строчек, прописал #define gpsSerial Serial1 и всё!

А так да, конфликт этих библиотек это факт.

Все работает! Пультик как миленький щелкает.
Еще раз спасибо за помощь!

1 лайк