【问题标题】:C# .NET 5 Break beam sensor Raspberry PIC# .NET 5 断梁传感器 Raspberry PI
【发布时间】:2021-12-02 10:39:23
【问题描述】:

我已经启动了一个项目,使用带有 Raspberry Pi 和 Visual Studio Code 的断梁传感器来对抗生产线上的物体。我有一个可以运行的 python 脚本,但是我需要在 C# 中执行它。目前我的代码如下所示:

using System;
using System.Device.Gpio;
using System.Threading;

Console.WriteLine("Break Beam. Press Ctrl+C to end.");
int pin = 17;
using var controller = new GpioController();
controller.OpenPin(pin, PinMode.Output);
bool BeamBroke = true;
while (true)
{
   controller.Write(pin, ((BeamBroke) ? PinValue.High : PinValue.Low));
   Thread.Sleep(1000);
   BeamBroke = !BeamBroke;
}

问题是当我运行这个控制台应用程序时,没有任何关于梁被破坏的记录。没有任何错误。

【问题讨论】:

  • 您没有向控制台写入任何内容,只是向输出引脚写入。这应该每秒切换一次引脚 17 的值。

标签: c# raspberry-pi iot


【解决方案1】:

您需要打开一个输入引脚。

controller.OpenPin(pin, PinMode.Input);

您还需要注册一个回调,以便在引脚值更改时触发。

void BeamBreakCallback(object sender, PinValueChangedEventArgs pinValueChangedEventArgs)
{
    BeamBroke = pinValueChangedEventArgs.ChangeType == PinEventTypes.Falling;
}

然后注册回调,以便在输入引脚上的输入值发生变化时调用。

controller.RegisterCallbackForPinValueChangedEvent(
    pin,
    PinEventTypes.Falling | PinEventTypes.Rising, // trigger on both rising and falling edges
    BeamBreakCallback
);

如果您想向控制台写入任何内容,则需要在回调中添加一些内容

void BeamBreakCallback(object sender, PinValueChangedEventArgs pinValueChangedEventArgs)
{
    BeamBroke = pinValueChangedEventArgs.ChangeType == PinEventTypes.Falling;

    if (pinValueChangedEventArgs.ChangeType == PinEventTypes.Falling)
        Console.WriteLine("beam broken");
    else
        Console.WriteLine("beam unbroken");
}

警告我对下降沿或上升沿是否代表断梁做了一些假设。

【讨论】:

  • 感谢您的回复。我试过这段代码,控制台打印“Break Beam. Press Ctrl+C to end.”然后它停止。也许我需要使用“thread.sleep”?
  • 添加Console.Read() 以在退出前检查是否有任何按键。不过,可能有一种更优雅的方式来做到这一点
猜你喜欢
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2013-07-15
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2017-11-07
相关资源
最近更新 更多