ESP32 ИК-пульт

Моей платой является Firebeetle esp32, которую я использую в качестве ИК-пульта.

После успешного использования библиотеки Ken Shirrif IRremote в течение примерно 6 месяцев пришло время изменить несколько вещей в веб-интерфейсе. Это была катастрофа.

Я попытался перекомпилировать свой рабочий код, который в настоящее время используется на плате, и везде получал ошибки.

Поэтому я переключил библиотеки на эту;

https://github.com/ExploreEmbedded/Arduino-IRremote

Теперь он успешно скомпилирован, единственное отличие между двумя библиотеками — вытащить контакт, который я определил для IR tx в библиотеке Кена Ширриффа. Например; ранее мой код выглядел так для работы со старой библиотекой.

IRsend irsend(33);

Теперь это выглядит так;

IRsend irsend;

Как уже говорилось, он компилируется; Единственная проблема в том, что ИК не работает. В библиотеке сказано, что контакт 5 определен как контакт tx для ESP32 в boarddefs. Фрагмент из boarddefs, где я считаю, что контакт 5 определяет ИК-передачу.

// ESP32 имеет собственный API таймера и не использует эти макросы, но чтобы избежать ifdef'ing
// их в общем коде, они определены как неоперативные. Это позволяет компилировать код
// (что в противном случае не было бы), но irsend не будет работать, пока не будет написан специальный код ESP32
// для этого -- Мерлин
// Предупреждаю: отправка кода, специфичного для синхронизации, с ESP32 может быть сложной задачей, если вам нужно 100%
// надежность, потому что код Arduino может быть прерван и привести к тому, что отправленный вами сигнал окажется
// неправильная длина. Это особенно актуально для неопикселей, которым требуется разрешение 800 кГц .
// IR может работать как есть с общим кодом, так как он имеет более низкую частоту, но если нет, то другой
// способ сделать это на ESP32 — использовать встроенный драйвер RMT, как в этой неполной библиотеке ниже
// https://github.com/ExploreEmbedded/ESP32_RMT
#elif defined(IR_TIMER_USE_ESP32)
#define TIMER_CHANNEL       1
#define TIMER_LENGHT        8 //8-битный таймер
#define TIMER_PWM_PIN      5
#define TIMER_ENABLE_PWM    ledcAttachPin(TIMER_PWM_PIN, TIMER_CHANNEL);         
#define TIMER_DISABLE_PWM   ledcDetachPin(TIMER_PWM_PIN); 
#define TIMER_RESET  
#define TIMER_ENABLE_INTR    
#define TIMER_DISABLE_INTR   
#define TIMER_INTR_NAME      

//------------------------------------------------ ---------
// Неизвестный таймер
//
#else
#   error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
#endif

#endif // ! boarddefs_h

Я знаю, что там сказано, что IR с ESP32 не будет работать, но то же самое было сказано для нескольких библиотек, которые я использовал, и которые работают, в первую очередь для библиотеки Кена; который, кажется, переехал сюда.

https://github.com/z3t0/Arduino-IRremote

Краткий пример моего кода;

#include "IRremote.h"
  IRsend irsend;
int khz = 38;
String input;
  String tv;
void changehdmi() {
if (Server.args() > 0 ) {
  for ( uint8_t i = 0; i < Server.args(); i++ ) {
    if (Server.argName(i) == "input") {
      input = String(Server.arg(i));
      Serial.println("input is " + input);
    }
    if (Server.argName(i) == "tv") {
      tv = String(Server.arg(i));
      Serial.println("tv is " + tv);
    }

  }
}
if (input == "1" && tv == "1") {
  unsigned int irSignal[] = {9000, 4450, 600, 550, 550, 550, 600, 550, 550, 550, 600, 500, 600, 550, 550, 600, 550, 550, 600, 1650, 550, 1700, 550, 1700, 550, 1700, 550, 1700, 550, 1700, 550, 1650, 600, 1650, 550, 1700, 550, 550, 600, 550, 550, 1700, 550, 550, 600, 500, 600, 550, 550, 600, 550, 550, 600, 1650, 550, 1700, 550, 550, 600, 1650, 550, 1700, 550, 1700, 550, 1700, 550}; // NEC FF906F
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
}
else if (input == "2" && tv == "1") {
  unsigned int irSignal[] = {9000, 4500, 550, 550, 600, 550, 550, 550, 550, 600, 550, 550, 600, 550, 550, 550, 550, 550, 600, 1650, 600, 1700, 500, 1700, 600, 1700, 500, 1700, 550, 1700, 550, 1700, 550, 1700, 550, 1700, 550, 550, 550, 1700, 550, 1700, 550, 1700, 550, 550, 550, 550, 600, 550, 550, 550, 600, 1700, 500, 600, 550, 550, 600, 500, 600, 1650, 600, 1650, 600, 1650, 550}; // NEC FFB847
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
}

У кого-нибудь это заработало в последнее время? Доступные библиотеки, похоже, больше не поддерживают эту функцию.

, 👍6


1 ответ


1

Для ESP32 вам действительно следует проверить IRremoteESP8266, который также работает на вашей плате и часто обновляется, очень широко используется и позволяет легко использовать любой совместимый вывод GPIO.

Вот пример простой демонстрации отправки IR:

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

#define IR_PIN 4

IRsend irsend(IR_PIN);  // Установите GPIO, который будет использоваться для отправки сообщения.

void setup() {
  irsend.begin();
  Serial.begin(115200);
}

void loop() {
  Serial.println("NEC");
  irsend.sendNEC(0x00FFE01FUL);
  delay(2000);
}

В этом примере код NEC будет отправлен через 2 секунды. Библиотека также имеет обширную поддержку других форматов, а также необработанных.

Если вы хотите быть в большей безопасности, создатель проекта упоминает здесь, что GPIO 4 и 18 безопасны, но я точно знаю, что можно использовать и многие другие контакты ESP32.

,