(傻瓜式教程)跟着GG学Windows IoT:GPIO的使用(LED和按钮)

G****G UID.1373758
2016-02-25 发表

本帖最后由 newsmanager 于 2016-2-28 20:26 编辑

烧录完了windows IoT 的系统之后,大家是不是都想要做点什么实际的例子来过过瘾呢?今天,GG就给大家带来了一个GPIO的使用教程,包括LED灯和按钮的连接和使用。

一。硬件准备

为了完成这个实验,我们需要的元器件包括220欧电阻一个,LED灯一个,按钮一个,杜邦线若干,面包板一块。

这里我们用的是Raspberry Pi 2,需要将LED灯的一端用杜邦线连接于pin31(GPIO 6),另一端连接一个220欧姆的电阻以后,用杜邦线与Pin1 (3.3V)连接。另外,将按钮一端的杜邦线连接于pin 29(GPIO 5),另一端用杜邦线与pin 39 (GND)连接,实物连接如下图所示。

***附件停止解析***

***附件停止解析***

上面两张图和文字结合在一起看便可以连接好了,顺带一提的是一个小细节,本人用的按钮是有4个引脚的接口,如图所示

***附件停止解析***

这种四个引脚的按钮左边2个引脚当做一个引脚使用也就是左边2个引脚插在一根线上(与面包板的宽平行的一排插口为一条线),右边同理。

二。界面设计

首先,打开VS,创建一个工程,选择工程模板,即展开Visual C# → Windows → Windows Universal 节点,选其中的Blank App ,将工程命名为PushButton。

然后在Solution Explorer 中,选择MainPage.xaml文件,为其添加一个StackPanel容器,并且在其中添加一个TextBox和一个Ellipse控件,用于提示LED灯的状态。为此,可以在<Grid>节点下,加入如下Xaml代码:

[mw_shl_code=c,true]<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" >
<Ellipse Name="LEDEllipse" Fill="LightGray" Stroke="White" Width="100" Height="100"
Margin="10">

</Ellipse>
<TextBlock Name="GpioStatus" Text="初始化GPIO。。。" Margin="10,50,10,10" TextAlignment="Center"
FontSize="26"></TextBlock>
</StackPanel>
</Grid>[/mw_shl_code]


三。后台代码


在编写后台代码之前,在VS中选择项目→添加引用,加入对IoT Extention SDK的引用。同时在后台代码中加入对GPIO的引用:

[mw_shl_code=c,true]using Windows.Devices.Gpio;[/mw_shl_code]


接着,为界面声明全局的私有成员如下,用于保存LED灯的状态,LED灯连接的GPIO引脚号,按钮连接的GPIO引脚号和用于渲染的画刷。

[mw_shl_code=c,true] private int LEDStatus = 0;
private const int LED_PIN = 6;
private const int BUTTON_PIN = 5;
private GpioPin LEDPin;
private GpioPin buttonPin;
private GpioPinValue LEDPinValue = GpioPinValue.High;
private SolidColorBrush blueBrush = new SolidColorBrush(Windows.UI.Colors.Blue);
private SolidColorBrush grayBrush = new SolidColorBrush(Windows.UI.Colors.LightGray);
[/mw_shl_code]

然后,在MainPage的构造函数后面加入GPIO的初始化方法InitGpio,代码如下:

[mw_shl_code=c,true] private void InitGPIO() {
var gpio = GpioController.GetDefault();
if (gpio == null) {
GpioStatus.Text = "没有连接GPIO";
return;

}
buttonPin = gpio.OpenPin(BUTTON_PIN);
LEDPin = gpio.OpenPin(LED_PIN);
LEDPin.Write(GpioPinValue.High);
LEDPin.SetDriveMode(GpioPinDriveMode.Output);
if (buttonPin.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
buttonPin.SetDriveMode(GpioPinDriveMode.InputPullUp);
else buttonPin.SetDriveMode(GpioPinDriveMode.Input);
buttonPin.DebounceTimeout = TimeSpan.FromMilliseconds(50);
buttonPin.ValueChanged += buttonPin_ValueChanged;
GpioStatus.Text = "GPIO初始化成功";


}[/mw_shl_code]

然后加入按钮的事件处理函数代码:

[mw_shl_code=c,true]private void buttonPin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) {
if (e.Edge == GpioPinEdge.FallingEdge) {
LEDPinValue = (LEDPinValue == GpioPinValue.Low) ?
GpioPinValue.High : GpioPinValue.Low;
LEDPin.Write(LEDPinValue);

}
var task = Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
if (e.Edge == GpioPinEdge.FallingEdge)
{
LEDEllipse.Fill = (LEDPinValue == GpioPinValue.Low) ?
blueBrush : grayBrush;
GpioStatus.Text = "按钮被按下";

}
else {
GpioStatus.Text = "按钮被释放";
}
});
}[/mw_shl_code]

最后完成GPIO的资源释放:
[mw_shl_code=c,true] private void MainPage_Unloaded(object sender, object args) {
LEDPin.Dispose();
buttonPin.Dispose();
}[/mw_shl_code]

四。部署与调试

选择ARM 和远程计算机如图***附件停止解析***

调试的时候就点远程计算机那个按钮就好了。

最后成果如下:

***附件停止解析***

***附件停止解析***

按下按钮后就是这样:

***附件停止解析***

好了。完工了!!

标签: Windows

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
nns UID.553039
2016-02-25 回复

呃。。物联网{:5_190:}有个玩了

bam****ies UID.1150946
2016-02-29 回复

蛤蛤 不过有时候系统会莫名其妙的坏了,估计突然断电缘故……

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报