Created
February 6, 2018 15:49
-
-
Save b2ox/0e7b0c4dd401dde5fc1ec00c968a93e1 to your computer and use it in GitHub Desktop.
赤外線リモコンを受信し、シリアルにjson形式で出力するやつ for arduino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 赤外線リモコンを受信し、シリアルにjson形式で出力する | |
#define NUM_MAX 300 //配列要素数 | |
#define TIMEOUT 20000 //無受信時のタイムアウトμs | |
#define IR_PIN 2 //受信モジュール出力の信号入力ピン | |
int time[NUM_MAX]; | |
int duMin; | |
void setup() { | |
Serial.begin(115200); | |
pinMode(IR_PIN, INPUT); | |
} | |
int readIR() { | |
boolean mode = HIGH; //赤外線モジュール出力がHIGH(=リモコンLEDオフ)の待機から始まる | |
int i = 0; | |
duMin = TIMEOUT; | |
while(i < NUM_MAX) { | |
unsigned long st = micros(); | |
unsigned long dur = TIMEOUT; //時間μs | |
// LOW,HIGHが変化するまでループで待機(timeoutを超えたら抜ける) | |
do { | |
dur = micros() - st; | |
} while (digitalRead(IR_PIN) == mode && dur <= TIMEOUT); | |
if (dur > TIMEOUT) break; | |
mode = !mode; | |
time[i++] = (int)dur; | |
if (dur < duMin) duMin = dur; | |
} | |
return i; | |
} | |
void loop() { | |
ser_pri(readIR(), false); | |
} | |
//受信データをjson形式でシリアル出力 | |
void ser_pri(int num, bool raw) { | |
if (num < 1) return; | |
Serial.print("{"); | |
if (raw) { // 生データを出力 | |
Serial.print("\"r\": ["); | |
for(int i = 1; i < num; i++){ | |
Serial.print(time[i]); | |
Serial.print(","); | |
} | |
Serial.println("0],"); | |
} | |
int Tmin = duMin; | |
// 単位幅にはばらつきがあるので | |
// 最小値の2倍を超えない範囲で最大のものを求め | |
// 中央値を10μ単位で四捨五入して単位幅Tとする | |
int Tmin2 = Tmin * 2; | |
int Tmax = Tmin; | |
for(int i = 1; i < num; i++){ | |
int w = time[i]; | |
if (w < Tmin2 && Tmax < w) Tmax = w; | |
} | |
int T = (int)((10.0f + Tmin + Tmax) / 20) * 10; | |
Serial.print("\"t\": "); | |
Serial.print(T); | |
Serial.print(",\"w\": "); | |
Serial.print(Tmax - Tmin); | |
Serial.print(","); | |
Serial.print("\"q\": ["); | |
for(int i = 1; i < num; i++){ | |
int w = (int)(0.5f + (float)time[i] / T); | |
Serial.print(w); | |
Serial.print(","); | |
} | |
Serial.println("0]}"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ググって見つけたコードを参考にしつつ作成。データ取得とクオンタイズだけやってコード判定はnode.jsとかでやれば良いかなって感じ。
見つけたコードはtimeをunsigned longな配列にしてあったけど、20msとか超えるような空白はなかろうと思ってint配列にしてスリム化。
NEC形式な照明のリモコンとその変形っぽいエアコンのリモコンで動作チェックしたけど、リーダーコード部分が16T,8Tとか8T,8Tになるべきところが15T,8Tとか9T,8Tとかになる。
まぁ肝心のデータ部分は1T,1Tとか1T,3Tできっちり取れてるからまぁなんとかなるw