电子说
步骤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
全部0条评论
快来发表一下你的评论吧 !