pdf-icon

Arduino入門

2. デバイス&サンプル

5. 拡張モジュール&サンプル

アクセサリー

6. アプリケーション

PaperColor IR NEC トランスミッター

PaperColor IR NEC トランスミッターに関する API とサンプルプログラムです。本サンプルでは Arduino-IRremote ライブラリを使用して NEC エンコーディングを実装しています。

サンプルプログラム

コンパイル要件

  • M5Stack ボードマネージャバージョン >= 3.2.7
  • 開発ボードオプション = M5PaperColor
  • M5Unified ライブラリバージョン >= 0.2.15
  • M5GFX ライブラリバージョン >= 0.2.21
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
#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 プロトコル信号を送信します:

API

PaperColor IR NEC トランスミッター部分のドライバは IRremote ライブラリの IrSender_Class を使用しています。関連する API の詳細は以下のドキュメントを参照してください:

On This Page