//IrDA Recode Display // for ESP32-WROOM // const uint16_t kRecvPin = 14; void setup() { pinMode(kRecvPin, INPUT); Serial.begin(115200); } //Display 4bit Hex void hexPrint(int v) { if(v < 10) { Serial.print(v); } else { switch(v) { case 10: Serial.print("a"); break; case 11: Serial.print("b"); break; case 12: Serial.print("c"); break; case 13: Serial.print("d"); break; case 14: Serial.print("e"); break; case 15: Serial.print("f"); break; } } } bool dataBit() { return(pulseIn(kRecvPin, HIGH) > 800); //LOW(論理HIGH) } //LSB First void bitPrint(int count) { unsigned short v; v = 0; for(int i = 0; i < count; i++) { //Serial.print(dataBit()? "1": "0"); v |= (dataBit()? 1: 0)<>4); hexPrint(v&0x0f); } //AEHA用 可変長データ //Trueで継続 bool dataBitPrint() { unsigned short v; unsigned long tl = pulseIn(kRecvPin, HIGH); //LOW(論理HIGH) if(tl < 2000) { //Serial.print((tl > 800)? "1": "0"); v = (tl > 800)? 1: 0; //残り7ビット for(int i = 1; i < 8; i++) { //Serial.print(dataBit()? "1": "0"); v |= (dataBit()? 1: 0)<>4); hexPrint(v&0x0f); return(true); } Serial.print("XX"); return(false); } void loop() { unsigned long time_start; unsigned long time_high, time_low; if((time_high = pulseIn(kRecvPin, LOW)) == 0) return; time_start = micros(); while(digitalRead(kRecvPin) == HIGH); time_low = micros() - time_start; #if 0 //通常でもパルスがある場合はこちらを使う //基板にしたらパルスは無くなった if(digitalRead(kRecvPin) == LOW) { //time HIGH(論理LOW) time_start = micros(); while(digitalRead(kRecvPin) == LOW); time_high = micros() - time_start; //time LOW(論理HIGH) time_start = micros(); while(digitalRead(kRecvPin) == HIGH); time_low = micros() - time_start; } else { time_high = time_low = 0; } #endif //Leader // NEC: H16T L8T 1T=562μs 8992 4496 // AEHA: H 8T L4T 1T=425μs 3400 1700 // 1T=350-500μs 2800-4000 1400-2000 // SONY: H 4T 1T=600μs 2400 if(time_high < 1000) { // || time_low < 500) { //Serial.print("@@@ IDOL @@@ ("); return; } else if(time_high < 2500) { //SONY Serial.print("@@@ SONY @@@ ("); Serial.print(time_high); Serial.print(", "); Serial.print(time_low); Serial.println(")"); } else if(time_high < 4500) { //AEHA Serial.print("@@@ AEHA @@@ ("); Serial.print(time_high); Serial.print(", "); Serial.print(time_low); Serial.print(" - "); if(time_low > 2500) { Serial.println("Repeat)"); } else { //Customer Code: 20bit bitPrint(8); bitPrint(8); Serial.print(":"); //Parity bitPrint(4); Serial.print(":"); //Data0: 4bit bitPrint(4); //Data1,2,N: 24bit for(int i = 0; i < 3; i++) { Serial.print(":"); if(!dataBitPrint()) break; } Serial.println(")"); } } else if(time_high < 10000) { //NEC Serial.print("@@@ NEC @@@ ("); Serial.print(time_high); Serial.print(", "); Serial.print(time_low); Serial.print(" - "); if(time_low < 3000) { Serial.println("Repeat)"); } else { //Customer Code bitPrint(8); bitPrint(8); Serial.print(":"); //Data bitPrint(8); Serial.print(":"); //Data Reverse bitPrint(8); Serial.println(")"); } //Stop bitは識別しない } else { Serial.print("@@@ NONE @@@ ("); Serial.print(time_high); Serial.print(", "); Serial.print(time_low); Serial.println(")"); } }