0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过Netduino和Xamarin远程控制RGBLED

454398 来源:工程师吴畏 2019-08-02 16:49 次阅读

步骤1 - 组装电路

将共阳极或共阴极RGB LED连接到支持网络的Netduino板。

公共阴极RGB LED

具有共阴极RGB LED的电路

公共阳极RGB LED

具有公共阳极RGB LED的电路

步骤2 - 将您的Netduino连接到网络

Windows

在Netduino以引导加载程序模式连接时,下载并打开适用于Windows或MacOS的固件更新程序和配置工具。在使用网络配置部分之前,请确保在型号选择器控件中自动选择您的设备,以确认您的设备已正确连接。

Netduino Deploy Tool的网络配置

如果您使用的是 Netduino 3 WiFi ,选择正确的加密,身份验证,SSID和密码短语设置,最后点击更新将这些设置保存到Netduino。

网络连接后设置保存到设备,记得断开连接并将Netduino重新连接到计算机以退出引导加载程序模式,并准备好在项目完成后运行项目。

步骤3 - 创建Netduino项目

在Visual Studio 2015 for Windows或最新的Visual Studio for Mac中创建Netduino项目;将项目命名为 RgbLedHost 。

步骤4 - 添加Netduino.Foundation Maple NuGet包

Windows

右键单击 RgbLedHost 项目,然后单击 管理NuGet包 。在 浏览 标签中,搜索Netduino.Foundation;它应该是第一个搜索结果。单击 安装 按钮。

添加Netduino.Foundation NuGet包

现在搜索 Maple 和 Netduino.Foundation.Network 并将它们添加到您的项目中。

macOS

按住Alt键并单击 解决方案资源管理器 中的 RgbPwmHost 项目,然后单击 添加=》添加Nuget包 以打开NuGet包窗口。搜索Netduino.Foundation包并单击 添加包 将其添加到项目中。

现在搜索 Maple 和 Netduino.Foundation.Network 并将它们添加到您的项目中。

步骤5 - 编写RgbLedHost项目的代码

添加RequestHandler类

Maple Web API端点是通过创建从 RequestHandlerBase 继承的自定义类来定义的。 Maple 使用反射根据这些自定义类中的方法名称创建URL。它支持 get 和 post 动词,方法名称必须以其中一个字符串为前缀,以便自动成为端点。

右键单击您的项目,然后单击添加 new =》 Class ,并将其命名为 RequestHandler 。在这里您将公开五个URL端点:/TurnOn ,/TurnOff ,/StartBlink ,/StartPulse 和/StartRunningColors 的。复制以下所有这些方法的实现:

public class RequestHandler : RequestHandlerBase

{

public event EventHandler TurnOn = delegate { };

public event EventHandler TurnOff = delegate { };

public event EventHandler StartBlink = delegate { };

public event EventHandler StartPulse = delegate { };

public event EventHandler StartRunningColors = delegate { };

public RequestHandler() { }

public void postTurnOn()

{

TurnOn(this, EventArgs.Empty);

StatusResponse();

}

public void postTurnOff()

{

TurnOff(this, EventArgs.Empty);

StatusResponse();

}

public void postStartBlink()

{

StartBlink(this, EventArgs.Empty);

StatusResponse();

}

public void postStartPulse()

{

StartPulse(this, EventArgs.Empty);

StatusResponse();

}

public void postStartRunningColors()

{

this.StartRunningColors(this, EventArgs.Empty);

StatusResponse();

}

private void StatusResponse()

{

Context.Response.ContentType = “application/json”;

Context.Response.StatusCode = 200;

Send();

}

}

调用这些端点时,将调用相应的方法。在每个方法上,发生了两件事:触发事件并发送响应以确认客户端已收到请求。

添加RgbLedController类

最好为每个涉及的外围设备创建一个 Controller 类,以使项目更具可扩展性,可维护性和清洁性。这些 Controller 类抽象出所有外设的逻辑,因此主程序逻辑将更清晰,更易于理解。使用以下代码添加 RgbLedController 类:

public class RgbLedController

{

public RgbLedController(RgbPwmLed rgbPwmLed)

{

_rgbPwmLed = rgbPwmLed;

_rgbPwmLed.SetColor(Netduino.Foundation.Color.Red);

}

public void TurnOn()

{

_rgbPwmLed.Stop();

_rgbPwmLed.SetColor(GetRandomColor());

}

public void TurnOff()

{

_rgbPwmLed.Stop();

_rgbPwmLed.SetColor(Netduino.Foundation.Color.FromHsba(0, 0, 0));

}

public void StartBlink()

{

_rgbPwmLed.Stop();

_rgbPwmLed.StartBlink(GetRandomColor());

}

public void StartPulse()

{

_rgbPwmLed.Stop();

_rgbPwmLed.StartPulse(GetRandomColor());

}

public void StartRunningColors()

{

var arrayColors = new ArrayList();

for (int i = 0; i 《 360; i = i + 5)

{

var hue = ((double)i / 360F);

arrayColors.Add(Netduino.Foundation.Color.FromHsba(((double)i / 360F), 1, 1));

}

int[] intervals = new int[arrayColors.Count];

for (int i = 0; i 《 intervals.Length; i++)

{

intervals[i] = 100;

}

_rgbPwmLed.Stop();

_rgbPwmLed.StartRunningColors(arrayColors, intervals);

}

public void NetworkConnected()

{

_rgbPwmLed.Stop();

_rgbPwmLed.SetColor(Netduino.Foundation.Color.Green);

}

protected Netduino.Foundation.Color GetRandomColor()

{

var random = new Random();

return Netduino.Foundation.Color.FromHsba(random.NextDouble(), 1, 1);

}

}

添加App类

对于这个项目,我们希望实现一个通用的 App 软件模式来控制所有网络和控制器,使事情更清晰,更健壮。在项目中添加一个新的 App 类,并粘贴以下代码:

结果

结果

打开LED。

public class App

{

static int _blinkDuration = 100;

protected MapleServer _server;

protected RgbLedController _rgbController;

public App()

{

InitializePeripherals();

InitializeWebServer();

}

protected void InitializePeripherals()

{

var rgbPwmLed = new RgbPwmLed

SecretLabs.NETMF.Hardware.Netduino.PWMChannels.PWM_PIN_D11,

SecretLabs.NETMF.Hardware.Netduino.PWMChannels.PWM_PIN_D10,

SecretLabs.NETMF.Hardware.Netduino.PWMChannels.PWM_PIN_D9,

1.05f,

1.5f,

1.5f,

false

);

_rgbController = new RgbLedController(rgbPwmLed);

}

protected void InitializeWebServer()

{

var handler = new RequestHandler();

handler.TurnOn += (s, e) =》

{

_rgbController.TurnOn();

};

handler.TurnOff += (s, e) =》

{

_rgbController.TurnOff();

};

handler.StartBlink += (s, e) =》

{

_rgbController.StartBlink();

};

handler.StartPulse += (s, e) =》

{

_rgbController.StartPulse();

};

handler.StartRunningColors += (s, e) =》

{

_rgbController.StartRunningColors();

};

_server = new MapleServer();

_server.AddHandler(handler);

}

public void Run()

{

Initializer.InitializeNetwork();

Debug.Print(“InitializeNetwork()”);

while (Initializer.CurrentNetworkInterface == null) { }

_server.Start(“RgbLedHost”,

Initializer.CurrentNetworkInterface.IPAddress);

_rgbController.NetworkConnected();

}

}

这个类中发生的第一件事就是调用 InitializePeripherals 实例化连接到 Netduino 的所有控制器,在此项目中,它是 RgbLedController 对象,并使其以红色亮起。/p》

设置外设后,它现在调用 InitializeWebServer ,在这里你将使用 RequestHandler 。实例化之后,为前面解释的四种暴露方法注册事件处理程序: LightOn , LightOff , StartBlink , StartPulse 和 StartRunningColors :

OnLightOn - 打开LED。

OnLightOff - 关闭LED。

OnBlink - 使RGB LED闪烁。

OnPulse - 产生RGB LED脉冲。

OnSweepColors - 使RGB通过所有Hue光谱,就像使用RGB LED和Netduino的Show Rainbow Colors一样。

在所有这些事件处理程序之后,创建一个新的 Maple 实例,并将 RequestHandler 对象分配给其Handler属性。

在运行方法中,启动项目时需要做的第一件事是使用 Initializer.InitializeNetwork(); 。 Netduino主板需要在每次启动时初始化网络,因此在启动 Maple 服务器之前,您需要确保Netduino已成功连接到网络,并且已收到有效的IP地址。

当Netduino加入网络时,您现在可以通过 server.Start()《安全地启动M a 服务器/b》传递服务器名称和分配给它的IpAddress,并将RGB LED颜色设置为绿色,表示程序已成功启动,并准备好接收客户端请求。

在Program类中实现Main方法

最后,创建一个新的App类对象并调用Run方法。您的代码应如下所示:

运行RgbLedHost项目

这就是你需要做的一切 RgbLedHost 项目。当您运行项目时,您将看到RGB LED在完成外设初始化后变为红色,并且一旦连接到网络,它就会等待接收IP地址。一旦它加入网络,RGB LED将变为绿色。

RgbLedHost项目正在运行并指示Maple何时成功启动

步骤6 - 设置Xamarin.Forms RgbLedRemote项目

此项目的下一部分是让您的手机上运行Xamarin.Forms应用程序。该项目可以在Netduino_Samples/Connected_RgbLed仓库中找到。在Netduino上运行的代码位于 RgbLedHost 应用程序文件夹中。 Xamarin.Forms在 RgbLedRemote 文件夹中对其进行采样。继续将 RgmLedRemote 项目下载到您的计算机/mac,并在最新版本的Visual Studio上打开它,公共代码项目应如下所示:

Xamarin.Forms RgbLedRemote app sample

这个项目的用处是 MapleClient 类,它有一个简单的执行 HttpClient 向 Maple 服务器发送/接收服务器请求,以及 UdpClient 接收来自一个或多个的广播消息运行更多Maple服务器,应用程序会在Picker上列出它们,以便您可以选择要连接到哪个Netduino并发送请求。

public class MapleClient

{

static readonly int LISTEN_PORT = 17756;

static readonly int LISTEN_TIMEOUT = 5000; //ms

public async Task UdpTimeoutTask()

{

await Task.Delay(LISTEN_TIMEOUT);

return new UdpReceiveResult();

}

public async Task》 FindMapleServers()

{

var hostList = new List();

var listener = new UdpClient(LISTEN_PORT);

var ipEndPoint = new IPEndPoint(IPAddress.Any, LISTEN_PORT);

var timeoutTask = UdpTimeoutTask();

try

{

while (timeoutTask.IsCompleted == false)

{

Console.WriteLine(“Waiting for broadcast”);

var tasks = new Task[]

{

timeoutTask, listener.ReceiveAsync()

};

int index = 0;

await Task.Run(() =》 index = Task.WaitAny(tasks));

var results = tasks[index].Result;

if (results.RemoteEndPoint == null)

break;

string host = Encoding.UTF8.GetString(results.Buffer, 0,

results.Buffer.Length);

string hostIp = host.Split(‘=’)[1];

Console.WriteLine(“Received broadcast from {0} : {1} ”,

hostIp, host);

var serverItem = new ServerItem()

{

Name = host.Split(‘=’)[0]+“ (”+host.Split(‘=’)[1]+“) ”,

IpAddress = host.Split(‘=’)[1]

};

if (!hostList.Any(server =》 server.IpAddress == hostIp))

{

hostList.Add(serverItem);

}

}

}

catch (Exception e)

{

Console.WriteLine(e.Message);

}

finally

{

listener.Close();

}

return hostList;

}

protected async Task SendCommandAsync(string command, string hostAddress)

{

var client = new HttpClient();

client.BaseAddress = new Uri(“http://” + hostAddress + “/”);

client.Timeout = TimeSpan.FromSeconds(5);

try

{

var response = await client.PostAsync(command, null);

return response.IsSuccessStatusCode;

}

catch (Exception ex)

{

System.Diagnostics.Debug.Print(ex.Message);

return false;

}

}

}

SendCommandAsync function将返回一个布尔值,以指示请求是否已正确处理(true)或请求中是否有错误或发生异常(false)。

每次发送请求时,应用程序将显示一个加载屏幕,一旦响应消息返回成功,加载屏幕就会消失按钮重新启用,突出显示的按钮反映RGB LED上当前正在发生的操作。

RgbLedRemote项目

步骤7 - 运行项目样本

首先运行 RgbLedHost 项目,等待RGB LED变为绿色,表示服务器正在运行并广播UDP其名称和IP地址的消息。

现在将 RgbLedRemote 项目运行到您的移动设备,稍等片刻,直到应用程序显示Picker控件,您可以选择您要连接的服务器。如果连接成功,则设置对话框屏幕应消失,RGB LED应更改为其他颜色。

使用Maple由移动应用程序控制的RGB LED

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23256

    浏览量

    660618
  • Netduino
    +关注

    关注

    0

    文章

    19

    浏览量

    3445
收藏 人收藏

    评论

    相关推荐

    使用树莓派实现远程控制的技巧

    树莓派是一款功能强大的微型计算机,其体积小巧、价格低廉,非常适合用于各种DIY项目。其中,远程控制是树莓派应用中非常受欢迎的一个领域。通过远程控制,我们可以随时随地访问和管理树莓派,实现数据监控
    的头像 发表于 11-11 11:37 439次阅读

    远程控制温控器的应用

    随着科技的发展,智能家居逐渐成为现代生活的一部分。远程控制温控器作为智能家居系统中的一个重要组成部分,为用户提供了前所未有的便利和舒适度。 远程控制温控器的工作原理 远程控制温控器通过
    的头像 发表于 11-06 13:47 318次阅读

    用网页端远程控制电脑各工具对比

    远程办公、设备维护和技术支持场景中,远程控制工具的选择至关重要。本篇将介绍几款常见的远程控制工具进行对比,包括P2link、花生壳、蒲公英、nat123和natapp,帮助用户了解各工具的不同特点,从而更好地选择适合自己的
    的头像 发表于 11-05 11:22 258次阅读

    风管远程控制系统应用方案

    能耗。 一、基本原理 风管远程控制系统,通过远程通信技术对建筑物内的风管系统,进行实时监控与智能控制的物联网解决方案。将传统的风管系统与自动化控制、网络通信、物联网等技术深度融合,对风
    的头像 发表于 10-22 16:31 222次阅读

    通过边缘计算网关实现PLC远程控制过程

    在现代工业自动化领域,远程控制与监控已成为提升生产效率、降低维护成本的重要手段。边缘计算网关作为工业物联网中的关键设备,凭借其强大的数据处理能力和网络通讯能力,为实现PLC(可编程逻辑控制器)的远程控制
    的头像 发表于 10-17 16:28 239次阅读
    <b class='flag-5'>通过</b>边缘计算网关实现PLC<b class='flag-5'>远程控制</b>过程

    普通空开怎样远程控制断电

    远程控制断电技术的应用场景非常广泛,包括但不限于: 智能家居系统 :用户可以通过手机应用或语音助手远程控制家中的电器,实现节能和便捷。 工业自动化 :在生产线上,远程控制断电可以快速
    的头像 发表于 10-17 14:02 537次阅读

    智能电表是如何与远程控制系统连接的?

    智能电表与远程控制系统之间的连接,是现代智能家居技术中不可或缺的一部分。通过这种连接,不仅可以实现对电力使用的精准监控,还能让家庭或企业的能源管理变得更加高效。接下来,就让我们一起来看看智能电表
    的头像 发表于 10-16 16:29 320次阅读
    智能电表是如何与<b class='flag-5'>远程控制</b>系统连接的?

    android 远程控制如何实现

    在现代工作和生活中,远程控制安卓设备或使用安卓设备远程控制其他设备已成为常见需求。安卓远程控制允许IT管理员远程访问安卓设备。实施远程控制
    的头像 发表于 08-21 18:05 885次阅读
    android <b class='flag-5'>远程控制</b>如何实现

    智能路灯远程控制系统

    构建绿色、低碳、高效的现代都市提供有力支撑。 基本原理 智能路灯远程控制系统基于物联网(IoT)技术,通过集成传感器、无线通信模块、智能控制器及管理云平台等关键组件,实现对路灯状态的远程
    的头像 发表于 08-15 16:21 755次阅读

    PLC远程控制系统的应用案例都有哪些呢?

    PLC远程控制系统在许多领域都有广泛的应用。以下是一些PLC远程控制系统的应用案例
    的头像 发表于 05-31 11:24 1130次阅读

    信捷plc远程控制怎么实现?如何远程修改程序?

    怎么实现?如何远程修改程序? 利用物通博联PLC远程模块将信捷PLC接入网络,实现与远程控制中心的无线连接,无需布线,工程师可以随时随地远程控制信捷PLC和
    的头像 发表于 02-22 16:02 1370次阅读
    信捷plc<b class='flag-5'>远程控制</b>怎么实现?如何<b class='flag-5'>远程</b>修改程序?

    闸门改造远程控制系统

    智能改造闸门主要是针对老式非智能闸门进行智能化改造,使其具备测控一体化闸门的功能要求,即实现可现场对闸门进行控制,也可远程控制闸门启闭,另外也可接入渠道水位、流量、视频等采集信息,通过闸控系统
    的头像 发表于 02-22 11:06 818次阅读
    闸门改造<b class='flag-5'>远程控制</b>系统

    如何通过物通博联4G无线PLC网关实现远程访问PLC和远程控制

    物理距离和布线成本等因素,无法满足远程监控和控制的需求。 那么如何实现远程访问PLC和远程控制呢? 物通博联的4G无线PLC网关是一种先进的工业物联网设备,可以实现
    的头像 发表于 02-21 15:05 947次阅读
    如何<b class='flag-5'>通过</b>物通博联4G无线PLC网关实现<b class='flag-5'>远程</b>访问PLC和<b class='flag-5'>远程控制</b>

    示波器与示波器探头如何实现远程控制及区分?

    显示和测量。示波器与示波器探头可以通过多种方式实现远程控制,并且二者之间也有一些区别。下面将详细介绍示波器与示波器探头的远程控制方式,并加以区分。 远程控制是指可以
    的头像 发表于 01-19 16:16 784次阅读