PaperColor IR NEC トランスミッターに関する API とサンプルプログラムです。本サンプルでは Arduino-IRremote ライブラリを使用して NEC エンコーディングを実装しています。
#include <Arduino.h>
#include <M5Unified.h>
#include <IRremote.hpp>
#define IR_TX_PIN 48
static constexpr uint16_t IR_ADDRESS = 0x1111;
static constexpr uint8_t IR_START_COMMAND = 0x34;
static constexpr uint8_t IR_REPEATS = 0;
static constexpr uint32_t SEND_INTERVAL_MS = 1000;
M5Canvas canvas(&M5.Display);
static uint8_t currentCommand = IR_START_COMMAND;
static uint32_t sendCount = 0;
static uint32_t lastMinuteChangeMs = 0;
static uint32_t lastSendMs = 0;
static void drawStatusScreen(const String& title, const String& detail, uint16_t accentColor)
{
const int screenW = M5.Display.width();
const int screenH = M5.Display.height();
canvas.fillSprite(WHITE);
canvas.fillRect(0, 0, screenW, 42, BLACK);
canvas.fillRect(0, 42, screenW, 6, accentColor);
canvas.setTextDatum(top_center);
canvas.setTextSize(1);
canvas.setFont(&fonts::FreeSansBold18pt7b);
canvas.setTextColor(WHITE);
canvas.drawString(title, screenW / 2, 8);
canvas.setFont(&fonts::FreeSansBold12pt7b);
canvas.setTextColor(accentColor);
canvas.drawString(detail, screenW / 2, 72);
canvas.pushSprite(0, 0);
}
static void drawIrScreen()
{
const int screenW = M5.Display.width();
const int screenH = M5.Display.height();
char commandBuf[24];
snprintf(commandBuf, sizeof(commandBuf), "0x%02X", currentCommand);
canvas.fillSprite(WHITE);
canvas.fillRect(0, 0, screenW, 50, BLACK);
canvas.fillRect(0, 50, screenW, 6, RED);
canvas.setTextDatum(top_center);
canvas.setTextSize(1);
canvas.setFont(&fonts::FreeSansBold18pt7b);
canvas.setTextColor(WHITE);
canvas.drawString("IR NEC SEND TEST", screenW / 2, 12);
canvas.setFont(&fonts::FreeSansBold24pt7b);
canvas.setTextDatum(middle_center);
canvas.setTextColor(BLUE);
canvas.drawString("0x1111", screenW / 2, screenH / 2 - 60);
canvas.setTextColor(RED);
canvas.drawString(commandBuf, screenW / 2, screenH / 2 + 60);
canvas.setFont(&fonts::FreeSansBold12pt7b);
canvas.setTextDatum(top_center);
canvas.setTextColor(BLACK);
canvas.drawString("ADDR", screenW / 2, screenH / 2 - 105);
canvas.drawString("CMD", screenW / 2, screenH / 2 + 15);
canvas.pushSprite(0, 0);
}
static void sendCurrentCommand()
{
IrSender.sendNEC(IR_ADDRESS, currentCommand, IR_REPEATS);
++sendCount;
Serial.printf("IR NEC sent: addr=0x%04X cmd=0x%02X repeats=%u count=%lu\r\n", IR_ADDRESS,
currentCommand, IR_REPEATS, static_cast<unsigned long>(sendCount));
}
void setup()
{
auto cfg = M5.config();
cfg.clear_display = false;
M5.begin(cfg);
Serial.begin(115200);
M5.Display.setEpdMode(epd_mode_t::epd_fastest);
M5.Display.setRotation(1);
canvas.createSprite(M5.Display.width(), M5.Display.height());
gpio_reset_pin(gpio_num_t(IR_TX_PIN));
IrSender.begin(DISABLE_LED_FEEDBACK);
IrSender.setSendPin(IR_TX_PIN);
const uint32_t now = millis();
lastMinuteChangeMs = now;
lastSendMs = now;
drawIrScreen();
sendCurrentCommand();
}
void loop()
{
M5.update();
const uint32_t now = millis();
if (now - lastMinuteChangeMs >= 60000) {
lastMinuteChangeMs = now;
currentCommand = static_cast<uint8_t>(currentCommand + 1);
drawIrScreen();
}
if (now - lastSendMs >= SEND_INTERVAL_MS) {
lastSendMs = now;
sendCurrentCommand();
}
delay(50);
}このプログラムは、デバイスの赤外線トランスミッターを通じて NEC プロトコル信号を送信します:
PaperColor IR NEC トランスミッター部分のドライバは IRremote ライブラリの IrSender_Class を使用しています。関連する API の詳細は以下のドキュメントを参照してください: