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 ответ
Для 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.
- как использовать hx-53 (модуль инфракрасного датчика ИК-передатчика) с ESP32?
- Использование VS1838B с Arduino
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора