使用 pi 和 .net 读取红外光传感器

Reading IR photo sensor using pi and .net

我正在开始我的 IoT 冒险之旅,并获得了一些闪烁的引导体验。但现在我想做一些更高级的事情,所以我想我试着从遥控器读取红外信号。现在一切都基于 rPi3.

所以我有:

let private _onPinValueChanged (gpioController: GpioController) = 
    new PinChangeEventHandler (
        fun _ _ -> 
            Console.WriteLine DateTime.Now
            Console.WriteLine (gpioController.Read GpioIrIn)) //pin number is 18

let StartIrRead (gpioController: GpioController) (cancellationToken: CancellationToken) = 
    
    let worker =  
        async { 
            Console.WriteLine $"Opening PIN {GpioIrIn}"
            gpioController.OpenPin (GpioIrIn, PinMode.Input)
            match gpioController.IsPinOpen GpioIrIn  with
            | true -> gpioController.RegisterCallbackForPinValueChangedEvent (GpioIrIn, PinEventTypes.Rising, _onPinValueChanged gpioController) 
            | false -> raise (Exception($"Problem with opening PIN {GpioIrIn}")) 
        }
        
    Async.Start (worker, cancellationToken)

而且它在某些方面很管用。当我将遥控器指向它并按下任何按钮时,事件正在启动,但我知道我需要脉冲或一些值,但我得到的只是 PinStatus(例如高)。那么我如何才能注册该信号并将其转换以便我可以将其发回?

不幸的是,Iot.Device.Bindings 中没有直接支持红外传感器的绑定。

所以我认为你的开始是好的。您正在侦听从 IR 接收器生成的事件。然而,IR 通信是一种数字通信,其中信号与几个字节的数据一起传输,类似于串行通信,这意味着当您按下按钮时,您将收到许多事件。对于每个事件,您需要存储新值(高或低)和时间戳。在收集到一组事件后(检查不同的超时值),您需要从这些事件中计算出一个位集。

这又变得困难了,因为遥控器对其位进行编码的方式并不标准化。 Here's a sheet 描述了一些常见的编码格式。您可能已经可以从您获得的数据集中为您的遥控器找到正确的编码格式(但请记住,您的时间测量会有一些错误)

如果您认为您没有得到合理的数据序列,您可能需要在第一个事件之后使用 busy-waiting(并轮询输入更改),因为事件的速度是有限的触发。