步驟1 - 組裝電路
將共陽極或共陰極RGB LED連接到支持網(wǎng)絡(luò)的Netduino板。
公共陰極RGB LED
具有共陰極RGB LED的電路
公共陽極RGB LED
具有公共陽極RGB LED的電路
步驟2 - 將您的Netduino連接到網(wǎng)絡(luò)
Windows
在Netduino以引導(dǎo)加載程序模式連接時(shí),下載并打開適用于Windows或MacOS的固件更新程序和配置工具。在使用網(wǎng)絡(luò)配置部分之前,請確保在型號選擇器控件中自動(dòng)選擇您的設(shè)備,以確認(rèn)您的設(shè)備已正確連接。
Netduino Deploy Tool的網(wǎng)絡(luò)配置
如果您使用的是 Netduino 3 WiFi ,選擇正確的加密,身份驗(yàn)證,SSID和密碼短語設(shè)置,最后點(diǎn)擊更新將這些設(shè)置保存到Netduino。
網(wǎng)絡(luò)連接后設(shè)置保存到設(shè)備,記得斷開連接并將Netduino重新連接到計(jì)算機(jī)以退出引導(dǎo)加載程序模式,并準(zhǔn)備好在項(xiàng)目完成后運(yùn)行項(xiàng)目。
步驟3 - 創(chuàng)建Netduino項(xiàng)目
在Visual Studio 2015 for Windows或最新的Visual Studio for Mac中創(chuàng)建Netduino項(xiàng)目;將項(xiàng)目命名為 RgbLedHost 。
步驟4 - 添加Netduino.Foundation Maple NuGet包
Windows
右鍵單擊 RgbLedHost 項(xiàng)目,然后單擊 管理NuGet包 。在 瀏覽 標(biāo)簽中,搜索Netduino.Foundation;它應(yīng)該是第一個(gè)搜索結(jié)果。單擊 安裝 按鈕。
添加Netduino.Foundation NuGet包
現(xiàn)在搜索 Maple 和 Netduino.Foundation.Network 并將它們添加到您的項(xiàng)目中。
macOS
按住Alt鍵并單擊 解決方案資源管理器 中的 RgbPwmHost 項(xiàng)目,然后單擊 添加=》添加Nuget包 以打開NuGet包窗口。搜索Netduino.Foundation包并單擊 添加包 將其添加到項(xiàng)目中。
現(xiàn)在搜索 Maple 和 Netduino.Foundation.Network 并將它們添加到您的項(xiàng)目中。
步驟5 - 編寫RgbLedHost項(xiàng)目的代碼
添加RequestHandler類
Maple Web API端點(diǎn)是通過創(chuàng)建從 RequestHandlerBase 繼承的自定義類來定義的。 Maple 使用反射根據(jù)這些自定義類中的方法名稱創(chuàng)建URL。它支持 get 和 post 動(dòng)詞,方法名稱必須以其中一個(gè)字符串為前綴,以便自動(dòng)成為端點(diǎn)。
右鍵單擊您的項(xiàng)目,然后單擊添加 new =》 Class ,并將其命名為 RequestHandler 。在這里您將公開五個(gè)URL端點(diǎn):/TurnOn ,/TurnOff ,/StartBlink ,/StartPulse 和/StartRunningColors 的。復(fù)制以下所有這些方法的實(shí)現(xiàn):
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();
}
}
調(diào)用這些端點(diǎn)時(shí),將調(diào)用相應(yīng)的方法。在每個(gè)方法上,發(fā)生了兩件事:觸發(fā)事件并發(fā)送響應(yīng)以確認(rèn)客戶端已收到請求。
添加RgbLedController類
最好為每個(gè)涉及的外圍設(shè)備創(chuàng)建一個(gè) Controller 類,以使項(xiàng)目更具可擴(kuò)展性,可維護(hù)性和清潔性。這些 Controller 類抽象出所有外設(shè)的邏輯,因此主程序邏輯將更清晰,更易于理解。使用以下代碼添加 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類
對于這個(gè)項(xiàng)目,我們希望實(shí)現(xiàn)一個(gè)通用的 App 軟件模式來控制所有網(wǎng)絡(luò)和控制器,使事情更清晰,更健壯。在項(xiàng)目中添加一個(gè)新的 App 類,并粘貼以下代碼:
結(jié)果
結(jié)果
打開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();
}
}
這個(gè)類中發(fā)生的第一件事就是調(diào)用 InitializePeripherals 實(shí)例化連接到 Netduino 的所有控制器,在此項(xiàng)目中,它是 RgbLedController 對象,并使其以紅色亮起。/p》
設(shè)置外設(shè)后,它現(xiàn)在調(diào)用 InitializeWebServer ,在這里你將使用 RequestHandler 。實(shí)例化之后,為前面解釋的四種暴露方法注冊事件處理程序: LightOn , LightOff , StartBlink , StartPulse 和 StartRunningColors :
OnLightOn - 打開LED。
OnLightOff - 關(guān)閉LED。
OnBlink - 使RGB LED閃爍。
OnPulse - 產(chǎn)生RGB LED脈沖。
OnSweepColors - 使RGB通過所有Hue光譜,就像使用RGB LED和Netduino的Show Rainbow Colors一樣。
在所有這些事件處理程序之后,創(chuàng)建一個(gè)新的 Maple 實(shí)例,并將 RequestHandler 對象分配給其Handler屬性。
在運(yùn)行方法中,啟動(dòng)項(xiàng)目時(shí)需要做的第一件事是使用 Initializer.InitializeNetwork(); 。 Netduino主板需要在每次啟動(dòng)時(shí)初始化網(wǎng)絡(luò),因此在啟動(dòng) Maple 服務(wù)器之前,您需要確保Netduino已成功連接到網(wǎng)絡(luò),并且已收到有效的IP地址。
當(dāng)Netduino加入網(wǎng)絡(luò)時(shí),您現(xiàn)在可以通過 server.Start()《安全地啟動(dòng)M a 服務(wù)器/b》傳遞服務(wù)器名稱和分配給它的IpAddress,并將RGB LED顏色設(shè)置為綠色,表示程序已成功啟動(dòng),并準(zhǔn)備好接收客戶端請求。
在Program類中實(shí)現(xiàn)Main方法
最后,創(chuàng)建一個(gè)新的App類對象并調(diào)用Run方法。您的代碼應(yīng)如下所示:
運(yùn)行RgbLedHost項(xiàng)目
這就是你需要做的一切 RgbLedHost 項(xiàng)目。當(dāng)您運(yùn)行項(xiàng)目時(shí),您將看到RGB LED在完成外設(shè)初始化后變?yōu)榧t色,并且一旦連接到網(wǎng)絡(luò),它就會(huì)等待接收IP地址。一旦它加入網(wǎng)絡(luò),RGB LED將變?yōu)榫G色。
RgbLedHost項(xiàng)目正在運(yùn)行并指示Maple何時(shí)成功啟動(dòng)
步驟6 - 設(shè)置Xamarin.Forms RgbLedRemote項(xiàng)目
此項(xiàng)目的下一部分是讓您的手機(jī)上運(yùn)行Xamarin.Forms應(yīng)用程序。該項(xiàng)目可以在Netduino_Samples/Connected_RgbLed倉庫中找到。在Netduino上運(yùn)行的代碼位于 RgbLedHost 應(yīng)用程序文件夾中。 Xamarin.Forms在 RgbLedRemote 文件夾中對其進(jìn)行采樣。繼續(xù)將 RgmLedRemote 項(xiàng)目下載到您的計(jì)算機(jī)/mac,并在最新版本的Visual Studio上打開它,公共代碼項(xiàng)目應(yīng)如下所示:
Xamarin.Forms RgbLedRemote app sample
這個(gè)項(xiàng)目的用處是 MapleClient 類,它有一個(gè)簡單的執(zhí)行 HttpClient 向 Maple 服務(wù)器發(fā)送/接收服務(wù)器請求,以及 UdpClient 接收來自一個(gè)或多個(gè)的廣播消息運(yùn)行更多Maple服務(wù)器,應(yīng)用程序會(huì)在Picker上列出它們,以便您可以選擇要連接到哪個(gè)Netduino并發(fā)送請求。
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將返回一個(gè)布爾值,以指示請求是否已正確處理(true)或請求中是否有錯(cuò)誤或發(fā)生異常(false)。
每次發(fā)送請求時(shí),應(yīng)用程序?qū)@示一個(gè)加載屏幕,一旦響應(yīng)消息返回成功,加載屏幕就會(huì)消失按鈕重新啟用,突出顯示的按鈕反映RGB LED上當(dāng)前正在發(fā)生的操作。
RgbLedRemote項(xiàng)目
步驟7 - 運(yùn)行項(xiàng)目樣本
首先運(yùn)行 RgbLedHost 項(xiàng)目,等待RGB LED變?yōu)榫G色,表示服務(wù)器正在運(yùn)行并廣播UDP其名稱和IP地址的消息。
現(xiàn)在將 RgbLedRemote 項(xiàng)目運(yùn)行到您的移動(dòng)設(shè)備,稍等片刻,直到應(yīng)用程序顯示Picker控件,您可以選擇您要連接的服務(wù)器。如果連接成功,則設(shè)置對話框屏幕應(yīng)消失,RGB LED應(yīng)更改為其他顏色。
使用Maple由移動(dòng)應(yīng)用程序控制的RGB LED
-
led
+關(guān)注
關(guān)注
242文章
23741瀏覽量
671343 -
Netduino
+關(guān)注
關(guān)注
0文章
19瀏覽量
3486
發(fā)布評論請先 登錄
智慧路燈如何實(shí)現(xiàn)遠(yuǎn)程控制?

plc遠(yuǎn)程控制模塊是什么
PLC遠(yuǎn)程控制模塊應(yīng)用
中央空調(diào)遠(yuǎn)程控制系統(tǒng)
使用樹莓派實(shí)現(xiàn)遠(yuǎn)程控制的技巧
遠(yuǎn)程控制溫控器的應(yīng)用
用網(wǎng)頁端遠(yuǎn)程控制電腦各工具對比
風(fēng)管遠(yuǎn)程控制系統(tǒng)應(yīng)用方案
通過邊緣計(jì)算網(wǎng)關(guān)實(shí)現(xiàn)PLC遠(yuǎn)程控制過程

普通空開怎樣遠(yuǎn)程控制斷電
智能電表是如何與遠(yuǎn)程控制系統(tǒng)連接的?

城市照明遠(yuǎn)程控制系統(tǒng)
android 遠(yuǎn)程控制如何實(shí)現(xiàn)

智能路燈遠(yuǎn)程控制系統(tǒng)

評論