Im Rahmen der internen Weiterbildungswoche «bbv Gathering» 2014 traf sich die ganze bbv Software Services in Davos, um sowohl innerhalb der Rolle aber auch rollenübergreifend Erfahrungen zu sammeln und als Firma noch weiter zusammenzuwachsen. Für die Rollen Engineer und Senior Engineer haben wir uns dieses Jahr etwas ganz Besonderes ausgedacht. Wir wollten das Thema Internet of Things am Beispiel von Wetterstationen behandeln und gleichzeitig unsere bereits vorhandenen Erfahrungen in Crossplattformentwicklung weiter vertiefen. Die Übersicht der Aufgabenstellung findet man hier.
Im diesem Blogpost gehen wir auf die genutzte Hardware für die MeteoRpoint Plattform näher ein.
Jedes Team bekam ein .NET Gadgeteer Set bestehend aus folgenden Komponenten:
- FEZ Cerberus Mainboard
Basisplattform für Sensoren und Module - Ethernet ENC28 Module
Damit die Wetterstation über das HTTP API dem MeteoRserver Daten liefern kann - USB Client SP Module
Für den Anschluss der Wetterstation an ein USB-Gerät (z.B. Laptop während der Entwicklung) - Temp&Humidity Module
Für die Ermittlung der Temperatur und Luftfeuchtigkeit - Und weitere optionale Module wie Barometer, Gas-Sensor, Character Display und vieles mehr für die Teams mit ausserordentlichen Leistungen
Im untenstehenden Bild sieht man einen einfachen Versuchsaufbau der obigen Komponenten. Die Kosten pro Set beliefen sich auf ca. 160 USD.
Was ist .NET Gadgeteer?
.NET Gadgeteer ist eine Entwicklungsplattform, die Mainboard- und Plug-and-Play-Module zur schnellen Prototypisierung nutzt. Alle Module von .NET Gadgeteer kommen bereits mit Treibern und APIs mit, so dass man sehr schnell zum Ziel kommt. .NET Gadgeteer ist ein Standard, der von Microsoft getrieben wird. Ziel des Standards ist es, Verbindungen zwischen Mainboards und Modulen zu vereinheitlichen. Alle .NET Gadgeteer Komponenten unterstützen das .NET Microframework.
«The .NET Micro Framework is .NET for small and resource constrained devices. It offers a complete and innovative development and execution environment that brings the productivity of modern computing tools to this class of devices.» – .NET Micro Framework website
Warum haben wir uns für .NET Gadgeteer entschieden?
Der Vorteil von .NET Gadgeteer ist, dass man zwar mit Hardware in Berührung kommt, aber noch nicht ein grosses Wissen über Embedded Programmierung oder Elektrotechnik mitnehmen muss. Das API von GHI macht die Programmierung der Hardware sehr einfach und stellt sicher, dass man schnell zu einem Erfolgserlebnis kommt. Eine minimale Wetterstation konnte somit für alle Teilnehmer in wenigen Stunden umgesetzt werden. Im untenstehenden Bild sieht man, wie einfach es ist, mit dem mitgelieferten Designer die genutzte Hardware auf dem Board zu konfigurieren.
Im Hintergrund wird dann automatisch ein Programmstück erzeugt, die alle konfigurierten Komponenten enthält:
[sourcecode lang=“csharp“] namespace MeteoR.Station { using Gadgeteer; using GTM = Gadgeteer.Modules; public partial class Program : Gadgeteer.Program { private Gadgeteer.Modules.Seeed.Barometer barometer; private Gadgeteer.Modules.Seeed.TemperatureHumidity temperatureHumidity; private Gadgeteer.Modules.GHIElectronics.Display_N18 display_N18; private Gadgeteer.Modules.GHIElectronics.Display_HD44780 char_Display; private Gadgeteer.Modules.GHIElectronics.FMRadio fmRadio; protected new static GHIElectronics.Gadgeteer.FEZCerberus Mainboard { get { return ((GHIElectronics.Gadgeteer.FEZCerberus)(Gadgeteer.Program.Mainboard)); } set { Gadgeteer.Program.Mainboard = value; } } public static void Main() { // Important to initialize the Mainboard first Program.Mainboard = new GHIElectronics.Gadgeteer.FEZCerberus(); Program p = new Program(); p.InitializeModules(); p.ProgramStarted(); // Starts Dispatcher p.Run(); } private void InitializeModules() { this.barometer = new GTM.Seeed.Barometer(2); this.temperatureHumidity = new GTM.Seeed.TemperatureHumidity(3); this.display_N18 = new GTM.GHIElectronics.Display_N18(5); this.char_Display = new GTM.GHIElectronics.Display_HD44780(4); this.fmRadio = new GTM.GHIElectronics.FMRadio(7); } } } [/sourcecode]
Das eigentliche Programm entwickelt man in einer Partial Klasse. Hier ein ganz einfaches Beispiel, das zeigt, wie z.B. das Barometer und der Temperatursensor angesprochen werden:
[sourcecode lang=“csharp“] namespace MeteoR.Station { using System; using System.IO; using System.Net; using System.Threading; using Gadgeteer.Modules.Seeed; using Gadgeteer.Networking; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; using Microsoft.SPOT.Net; using Microsoft.SPOT.Net.NetworkInformation; using GT = Gadgeteer; using GTM = Gadgeteer.Modules; public partial class Program { private void ProgramStarted() { this.InitHardware(); this.barometer.MeasurementComplete += this.BarometerOnMeasurementComplete; this.temperatureHumidity.MeasurementComplete += this.TemperatureHumidityOnMeasurementComplete; } private void InitHardware() { } private void TemperatureHumidityOnMeasurementComplete(TemperatureHumidity sender, double temperature, double relativeHumidity) { this.char_Display.Clear(); this.char_Display.PrintString(„T: “ + temperature.ToString(„##.#“) + “ ° “ + „H:“ + relativeHumidity.ToString(„##.#“) + “ %“); } private void BarometerOnMeasurementComplete(Barometer sender, Barometer.SensorData sensorData) { this.char_Display.Clear(); this.char_Display.PrintString(“P: “ + sensorData.Pressure.ToString()); } } } [/sourcecode]
Des Weiteren konnten wir durch die grosse Anzahl an Modulen und Sensoren den Teams, die besonders effizient zum Ziel kamen, weitere Gadgets wie z.B. Gas Sensor, Character-Display und vieles mehr anbieten, ohne dass es zu hohen zusätzlichen Kosten führte.
Als zuverlässiger Lieferant nutzten wir Mouser Electronics. Die liefern ab 80 USD portofrei in die Schweiz.
Im nächsten Blogpost zeigen wir euch eine Übersicht über die Resultate der Teams.