步驟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
+關注
關注
242文章
23356瀏覽量
663196 -
Netduino
+關注
關注
0文章
19瀏覽量
3449
發布評論請先 登錄
相關推薦
評論