#include <Arduino.h>
#define IR_PIN 2
void setup() {
Serial.begin(115200);
pinMode(IR_PIN, INPUT);
}
unsigned long pulseDuration(bool level) {
unsigned long t = micros();
while (digitalRead(IR_PIN) == level) {
if ((micros() - t) > 10000) break; // 超时防止死循环
}
Serial.println(micros() - t);
return micros() - t;
}
void loop() {
// 等待开始信号:9ms LOW + 4.5ms HIGH
if (digitalRead(IR_PIN) == LOW) {
unsigned long lowTime = pulseDuration(LOW);
unsigned long highTime = pulseDuration(HIGH);
if (lowTime > 8000 && lowTime < 10000 && highTime > 4000 && highTime < 5000) {
// 正确起始位,开始接收32位数据
uint32_t data = 0;
for (int i = 0; i < 32; i++) {
pulseDuration(LOW); // 每位前面的562us LOW
unsigned long high = pulseDuration(HIGH);
if (high > 1000) {
data = (data << 1) | 1;
} else {
data = (data << 1);
}
}
Serial.print("Received: 0x");
Serial.println(data, HEX);
delay(500); // 防止重复解码
}
}
}