Arduino获取红外信号
#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); // 防止重复解码
        }
    }
}
上一篇
下一篇