#include <IRremote.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Налаштування OLED-дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1 // Reset не використовується
#define SSD1306_I2C_ADDRESS 0x3C // Задаємо адресу вручну
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Налаштування IR
#define IR_RECEIVE_PIN 2 // Пін для прийому IR-сигналів
#define IR_SEND_PIN 3 // Пін для передачі IR-сигналів
void setup() {
Serial.begin(9600);
// Ініціалізація дисплея
if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) { // Використання вручну заданої адреси
Serial.println(F("OLED не знайдено! Перевірте підключення."));
for (;;);
}
display.clearDisplay();
display.display();
// Показуємо привітання
displayMessage("IR Decoder Ready");
// Ініціалізація IR-приймача
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Активуємо приймач
//IrSender.begin(); // Запуск передавача (без аргументів)
//IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK); // Активуємо передавач
IrSender.begin(IR_SEND_PIN); // Активуємо передавач
}
void loop() {
// Обробка прийому IR-сигналу
if (IrReceiver.decode()) {
// Отримуємо дані
uint16_t address = (IrReceiver.decodedIRData.decodedRawData >> 16) & 0xFFFF; // Адреса
uint16_t command = IrReceiver.decodedIRData.command; // Команда
// Вивід на OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Address: ");
display.println(address, HEX);
display.print("Command: ");
display.println(command, HEX);
display.display();
// Вивід у COM-порт
Serial.print("Address: 0x");
Serial.print(address, HEX);
Serial.print(" Address: DEC ");
Serial.print(address);
Serial.print(", Command: 0x");
Serial.print(command, HEX);
Serial.print(", Command: DEC ");
Serial.println(command);
IrReceiver.resume(); // Продовжити прийом
}
// Обробка передачі IR-сигналу
if (Serial.available() >= 4) {
byte addrHigh = Serial.read();
byte addrLow = Serial.read();
byte cmdHigh = Serial.read();
byte cmdLow = Serial.read();
uint32_t code = ((uint32_t)addrHigh << 24) | ((uint32_t)addrLow << 16) | ((uint32_t)cmdHigh << 8) | cmdLow;
IrSender.sendNEC(code, 32); // Відправка NEC-коду (32 біти)
Serial.print("Sent IR: Address 0x");
Serial.print((addrHigh << 8) | addrLow, HEX);
Serial.print(", Command: 0x");
Serial.println((cmdHigh << 8) | cmdLow, HEX);
}
}
void displayMessage(const char *message) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(message);
display.display();
}