#include "driver/rmt.h" //16進数の変数を#defineを使って代入 #define k0 0x16 #define k1 0x0C #define k2 0x18 #define k3 0x5E #define k4 0x08 #define k5 0x1C #define k6 0x5A #define k7 0x42 const int rmtDataLength = 34; // NEC format data length 34 bit rmt_item32_t rmtData[rmtDataLength]; // data to send const rmt_channel_t channel = RMT_CHANNEL_0; const gpio_num_t irPin = GPIO_NUM_25; //ポテンショメータ(Pot)センサーを定義する const gpio_num_t PotPin = GPIO_NUM_32; //読み込むデータの定義 uint8_t txd;//8bitの符号なしのデータ const int leaderOnUs = 9000; const int leaderOffUs = 4500; const int dataOnUs = 560; const int data1OffUs = 1690; const int data0OffUs = 560; const int stopbitOnUs = 560; const int stopbitOffUs = 0x7fff; /* send NEC format remote control data */ void sendData(uint16_t customCode, uint8_t dataCode) { /* leader code 1bit: ON 9000us, OFF 4500us */ rmtData[0].duration0 = leaderOnUs; rmtData[0].level0 = 1; rmtData[0].duration1 = leaderOffUs; rmtData[0].level1 = 0; /* * custom code 16 bit * INPUT series: b15 b14 b13 b12 b11 b10 b09 b08 b07 b06 b05 b04 b03 b02 b01 b00 * SEND series: b08 b09 b10 b11 b12 b13 b14 b15 b00 b01 b02 b03 b04 b05 b06 b07 */ for (int i = 0; i < 2; i++) { for (int j = 0; j < 8; j++) { /* * 1: ON 560us + OFF 1690us * 0: ON 560us + OFF 560us */ rmtData[8 * i + j + 1].duration0 = dataOnUs; rmtData[8 * i + j + 1].level0 = 1; if (customCode & (1 << ((1 - i) * 8 + j))) { rmtData[8 * i + j + 1].duration1 = data1OffUs; } else { rmtData[8 * i + j + 1].duration1 = data0OffUs; } rmtData[8 * i + j + 1].level1 = 0; } } /* * data code 8bit * INPUT series: b7 b6 b5 b4 b3 b2 b1 b0 * SEND series: b0 b1 b2 b3 b4 b5 b6 b7 ~b0 ~b1 ~b2 ~b3 ~b4 ~b5 ~b6 ~b7 */ for (int i = 0; i < 8; i++) { rmtData[i + 17].duration0 = dataOnUs; rmtData[i + 25].duration0 = dataOnUs; rmtData[i + 17].level0 = 1; rmtData[i + 25].level0 = 1; if (dataCode & (1 << i)) { rmtData[i + 17].duration1 = data1OffUs; rmtData[i + 25].duration1 = data0OffUs; } else { rmtData[i + 17].duration1 = data0OffUs; rmtData[i + 25].duration1 = data1OffUs; } rmtData[i + 17].level1 = 0; rmtData[i + 25].level1 = 0; } /* stop bit 1bit: ON 560 */ rmtData[33].duration0 = stopbitOnUs; rmtData[33].level0 = 1; rmtData[33].duration1 = stopbitOffUs; rmtData[33].level1 = 0; rmt_write_items(channel, rmtData, rmtDataLength, true); } void setup() { // put your setup code here, to run once: rmt_config_t rmtConfig; rmtConfig.rmt_mode = RMT_MODE_TX; // transmit mode rmtConfig.channel = channel; // channel to use 0 - 7 rmtConfig.clk_div = 80; // clock divider 1 - 255. source clock is 80MHz -> 80MHz/80 = 1MHz -> 1 tick = 1 us rmtConfig.gpio_num = irPin; // pin to use rmtConfig.mem_block_num = 1; // memory block size rmtConfig.tx_config.loop_en = 0; // no loop rmtConfig.tx_config.carrier_freq_hz = 38000; // IR remote controller uses 38kHz carrier frequency rmtConfig.tx_config.carrier_duty_percent = 33; // duty rmtConfig.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH; // carrier level rmtConfig.tx_config.carrier_en = 1; // carrier enable rmtConfig.tx_config.idle_level = RMT_IDLE_LEVEL_LOW ; // signal level at idle rmtConfig.tx_config.idle_output_en = 1; // output if idle rmt_config(&rmtConfig); rmt_driver_install(rmtConfig.channel, 0, 0); //ピンモード設定をする pinMode(PotPin,INPUT); } void loop() { // put your main code here, to run repeatedly: int analogdata1 = analogRead(PotPin); //ポテンショメータで制御するプログラム if(analogdata1<500){ txd = k0; } else if(analogdata1<1000){ txd = k1; } else if(analogdata1<1500){ txd = k2; } else if(analogdata1<2000){ txd = k3; } else if(analogdata1<2500){ txd = k4; } else if(analogdata1<3000){ txd = k5; } else if(analogdata1<3500){ txd = k6; } else{ txd = k7; } sendData(0x00FF,txd); }