Das Kompassmodul CMPS10 Klassenerstellung

Ähnliche Dokumente
C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

7. Übung Informatik II - Objektorientierte Programmierung

Funktionen in JavaScript

C++ - Objektorientierte Programmierung Vererbung

Das Kompassmodul CMPS10

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Prof. W. Henrich Seite 1

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmieren in C/C++ und MATLAB

3. Exkurs in weitere Arten der Programmierung

Einstieg in die Informatik mit Java

Ampelsteuerung Merkblatt 2 Wie wird der Arduino programmiert?

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

Einstieg in die Programmierung mit Visual Basic.NET

Skriptum Bauinformatik SS 2013 (Vorlesung IV)

Objektorientierte Programmierung. Agenda für heute, 1. April, Eines der drei wichtigsten Programmierparadigmen

Inhaltsverzeichnis. Kapitel i: Schnelleinstieg 13. Kapitel 2: Was sind Programme? 17. Kapitel 3: Wie erstellt man eigene Programme?

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Klassen. Kapitel Klassendeklaration

Java Vererbung. Inhalt

Fragen zur OOP in Java

C++ - Variablen: Gültigkeit - Sichtbarkeit

Repetitorium Informatik (Java)

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Prinzipien der objektorientierten Programmierung (OOP)

AuD-Tafelübung T-B5b

WESTFÄLISCHE WILHELMS-UNIVERSITÄT MÜNSTER. Advanced Matlab. living knowledge WWU Münster. Mario Ohlberger, Martin Drohmann, Stefan Girke 10/05/2012

Objekte haben eine eigene Notation, also Schreibweise, beim Aufruf:

Vorkurs C++ Programmierung

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Felder, Zeiger und Adreßrechnung

Programmierkonventionen - 1 -

Angewandte Mathematik und Programmierung

Einstieg in die Informatik mit Java

Crashkurs C++ Wiederholung

ÜBUNGS-BLOCK 1 LÖSUNGEN

Vererbung und Polymorphie

Einführung in die Programmierung

Einführung in die Programmierung Wintersemester 2016/17

Globale Variablen Diverses. Globale Variablen. Globale Variablen

1 Klassen und Objekte

Grundlagen und Konzepte von C Datenstrukturen

Die Programmiersprache C

Einführung in die Programmierung 1

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen 06

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Klausur Grundlagen der Programmierung

Vererbung, Polymorphie

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

Umsetzung einer Klassenkarte in einer Programmiersprache

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Abschnitt 6: Klassen, Objekte und Methoden in Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Einstieg in die Informatik mit Java

OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Javakurs für Anfänger

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

Objektorientierte Programmierung

12 Abstrakte Klassen, finale Klassen und Interfaces

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Grundlagen von C# - 1

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

6. Zeiger Allgemeines Definition eines Zeigers

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Algorithmen implementieren. Implementieren von Algorithmen

Hydroinformatik I: Klassen

Girls Day 2017 Programmierung

Einführung in die Programmierung für NF MI. Übung 07

Speicherklassen (1) Lokale Variablen

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Vorlesung Programmieren

OCP Java SE 8. Lambda

Programmieren I + II Regeln der Code-Formatierung

Statische und Nichtstatische Methoden Properties/ Eigenschaften

Taxi System. CheckUp Tutorial Version 4.3 Institut für Softwaretechnik und interaktive Systeme

Programmieren I + II Regeln der Code-Formatierung

Programmierung mit C Zeiger

Elementare Datentypen in C++

Aufbau von Klassen. class punkt {...

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon.

Universität zu Lübeck Institut für Telematik. Prof. Dr. Stefan Fischer

Programmieren in Java

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Welche Informatik-Kenntnisse bringen Sie mit?

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

3 Objektorientierte Konzepte in Java

Programmieren in C/C++ und MATLAB

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Transkript:

Das Kompassmodul CMPS10 Klassenerstellung

Inhalt Arduino mit Kompassmodul CMPS10 + Klassenerstellung... 3 Klassenprogrammierung... 3 Die CMPS10-Klasse - Einleitung... 4 Die CMPS10-Klasse - Coding... 5 Header-Datei... 5 Implementations-Datei... 8 Der Arduino-Sketch... 12 2

Arduino mit Kompassmodul CMPS10 + Klassenerstellung Liebe Freunde, in diesem Arduino-AddOn möchte ich ein paar Worte über das Kompassmodul CMPS10 verlieren. Das hatte ich in der Vergangenheit zwar schon gemacht, doch in diesem AddOn soll es um die Erstellung einer Klasse gehen, die die Verwendung des benötigten Codes vereinfacht und auch für andere Nutzer mit weniger Programmierkenntnissen nützlich ist. Ein YouTube-Video für das Kompassmodul CMPS10 AddOn ist unter: https://www.youtube.com/watch?v=d-w6goje9tw zu finden. Klassenprogrammierung In meinem vorherigen AddOn über das Kompassmodul CMPS10 habe ich quasi die Standardprogrammierung zur Abfrage des am I 2 C-Bus angeschlossenen Moduls verwendet. Das ist absolut ok und zeigt deutlich, wie der Zugriff auf den Bus funktioniert. Schauen wir uns das noch einmal genauer an. Der komplette Sketch ist auf meiner Internetseite im Projektkapitel 34 meines Arduino-Buches (2. Auflage) zu finden: http://www.erik-bartmann.de/arduino-projekt-kapitel-34.html oder über den direkten Download abrufbar: http://www.erik-bartmann.de/component/attachments/download/84.html Mit dieser Programm-Variante werden die Register des CMPS10 für Bearing, Pitch und Roll nicht einzeln abgerufen, sondern in einem Rutsch ab Register 2 komplett gespeichert. Das erreichen wir mit über die Angabe des Startregisters in Zeile 23 als Argument beim Aufruf der write-methode. Nachfolgend werden 4 Bytes vom I 2 C-Bus angefordert und in die entsprechenden Variablen, die in den Zeilen 18, 19 und 20 deklariert sind, gespeichert. Werfen wir doch einen Blick auf die für uns relevanten Register: 3

Abbildung 1 Auszug der CMPS10-Register Du siehst, dass es sich um 4 Register handelt, wobei die ersten beiden zusammen den Kompasskurs über ein High-Byte und ein Low-Byte mit hoher Präzision abbilden. Der Aufruf der read-methode in den Zeilen 27 bis 30 speichert die gelesenen Registerinhalte in die benannten Variablen. Im weiteren Verlauf des Arduino-Sketches werden diese Variablen verarbeitet und über die serielle Schnittstelle versendet. Also wirklich eine recht einfache Angelegenheit. Nun ist es aber für jemanden, der das Kompassmodul verwenden möchte nicht unbedingt erforderlich, sich mit der Materie der Abfrageprogrammierung des I 2 C-Busses auseinander zu setzen. Zwar ist das eine gute Übung und trägt maßgeblich zum Verständnis der Materie bei, doch für manch einen etwas zu viel Overhead. Denken wir nur an die Ansteuerung eines LC-Displays oder TFTs. Nicht jeder möchte sich derart tief in die Programmierung derartiger Module stürzen und warum das Rad immer wieder neu erfinden? Aus diesem Grunde gibt es u.a. die objektorientierte Programmierung mit ihren Klassen. Die CMPS10-Klasse - Einleitung Eine Klasse kann als eine Art Black-Box angesehen werden, die im Verborgenen eine Funktionalität mit möglicherweise recht komplexen Algorithmen zu Verfügung stellt. Der einzige, der sich Gedanken um die Funktions- bzw. Arbeitsweise dieser Klasse machen muss, ist der eigentliche Programmierer der Klasse. Er überlegt sich im Detail, wie z.b. das CMPS10-Modul anzusteuern ist und hinterlegt entsprechende Codezeilen, auf die der normale Anwender keinen Zugriff hat. Doch wie kann derart gekapselter Code überhaupt genutzt werden, wenn niemand anderes Zugriff darauf hat? Nun, ohne eine kleine Lücke in der Kapselung geht es nicht. Diese wird durch sogenannte Schnittstellen gefüllt, die eine Kommunikation zwischen den beiden Welten ermöglicht. Was aber sind diese beiden Welten im Detail? Da ist natürlich zum einen die Welt der normalen Sketch-Verarbeitung, die z.b. in den Funktionsaufrufen stattfindet. Also z.b. die bekannten Standard-Funktionen setup und loop. Zum anderen existieren bei der objektorientierten Programmierung die Klassen, die durch eine sogenannte Instanziierung zu realen Objekten werden. Diese Objekte verfügen in der Regel über die schon erwähnten Schnittstellen, die Methoden genannt werden um die Kommunikation zu ermöglichen. Lasse dich durch den Ausdruck Methode nicht verwirren. Sie ist nichts anderes, wie eine Funktion, die jedoch in der objektorientierten Programmierung diese besondere Bezeichnung erhalten hat. Ebenso werden Variablen einer Umbenennung unterzogen und lauten von jetzt an Felder bzw. Eigenschaften. Sehen wir uns das an der folgenden und sehr vereinfachten Grafik an: 4

Abbildung 2 Klasse mit Methode und privaten Bereichen Da haben wir also unsere Klasse - der Name spielt erst einmal keine Rolle. Sie kapselt die in ihr verborgenen Daten, die in der objektorientierten Umgebung als private (privat) markiert sind. Lediglich die als public (öffentlich) definierte Methode ist von außen zugänglich und kann auf die in der Klasse enthaltenen und geschützten Daten zugreifen und sie zur Verfügung stellen. Die Restriktion hat natürlich ihre Gründe, die absolut berechtigt ist. Könnte jeder von außerhalb der Klasse auf ihre Daten unmittelbar und ohne weitere Kontrollmechanismen zugreifen, bestünde die Gefahr, dass sie bei einer Manipulation ungültig würden. Was könnte das im Detail bedeuten? Angenommen, wir hätten es mit einer Variablen zu tun, die nur die gültigen Wochentage, also Montag bis Sonntag aufnehmen soll. Jetzt kommt ein Karnevalist daher und möchte den Rosenmontag als eigenständigen Wochentag in dieser Form hinterlegen. Die Verarbeitung, die aber lediglich mit den für uns bekannten offiziellen Wochentagen arbeitet, hätte Probleme mit der Erkennung des falschen Wochentags. Aus diesem Grund wird eine Methode als Interface zwischen Außenwelt und Klasse geschaltet, die in vermittelnder bzw. kontrollierender Instanz den Datenfluss überwacht. Das soll als kleine Einleitung erst einmal genügen und wir kommen jetzt endlich zur Programmierung unserer Klasse zur Abfrage des Kompassmoduls. Die CMPS10-Klasse - Coding Wie du möglicherweise schon weißt, gibt es in der Klassen-Programmierung bei C++ zwei Dateien, die miteinander in Verbindung bzw. in einer Abhängigkeit stehen. Header-Datei mit der Endung.h Implementations-Datei mit der Endung.cpp Header-Datei In einer Header-Datei wird lediglich die Klassendefinition hinterlegt. Also z.b. folgende Informationen: Klassenname Felder Methoden Die eigentliche Ausformulierung erfolgt in der Implementations-Datei. Sehen wir uns aber zunächst die Header-Datei für unser Vorhaben an und verstehen die Bedeutung der einzelnen Zeilen. 5

Abbildung 3 CMPS10 Header-Datei Ich habe das Projekt der Übersicht wegen mit Absicht etwas einfacher gehalten, so dass nicht alle möglichen Daten des CMPS10-Moduls abgefragt werden. Das überlasse ich dir. Bevor ich jedoch fortfahre, hier die Modul-Register, die wir genauer beleuchten möchten: Abbildung 4 Die für uns relevanten CMPS10-Register Warum bringe ich diese Grafik gerade an dieser Stelle? Damit du die Register über einen sprechenden Namen adressieren kannst, habe ich eine sogenannte Enumeration in den Zeilen 14 bis 21 definiert. 6

Abbildung 5 Die Enumeration für die I 2 C-Register Jeder der genannten Ausdrücke bekommt einen Index zugewiesen, wobei der erste den Start-Index definiert und alle nachfolgend aufgeführten jeweils den Indexwert +1 erhalten. Standardmäßig wird mit Index 0 begonnen, so dass die explizite Initialisierung mit 0 in Zeile 15 eigentlich überflüssig ist. Es dient lediglich der besseren Übersicht und dem Verständnis. Wenn ich also z.b. das Register PITCH abrufen möchte, verbirgt sich dahinter den Index-Wert 4. Lt. Register-Übersicht also korrekt. Kommen wir jetzt zur Klassendefinition, die über das Schlüsselwort class eingeleitet wird: Beachte, dass am Ende der schließenden geschweiften Klammer ein Semikolon stehen muss! Schauen wir uns jetzt die einzelnen Bereiche dieser Klassendefinition genauer an. Ich hatte einleitend erklärt, dass es private und öffentliche Bereiche innerhalb einer Klasse gibt. Die öffentlichen werden natürlich durch die diversen Methoden beschrieben, die wir aufrufen möchten. Abbildung 6 Der öffentliche Bereich einer Klasse Dieser Bereich wird durch einen sogenannten Zugriffsmodifizierer public eingeleitet. Nachfolgend werden die Methoden gelistet, die wir zur späteren Abfrage der Kompasswerte aufrufen. Anschließend folgt der private Bereich der über den Zugriffsmodifizierer private eingeleitet wird: Hier erscheinen die Mitglieder der Klasse, die durch die anderen Klassenmitglieder aufgerufen werden und nicht für den öffentlichen Zugriff bestimmt sind. Abschließend zu den Header-Datei Erläuterungen sollte ich die Zeilen 8, 9 und 38 erwähnen, die verhindern, dass eine Mehrfacheinbindung dieser Datei durch den Compiler erfolgt. 7

Implementations-Datei Kommen wir zu der Datei, in der die eigentliche Ausformulierung des Codes, also der Implementation erfolgt. Wir gehen den Code bzw. die Methoden separat durch: Natürlich müssen wir in einer Klassendefinition Arduino.h einbinden, damit die komplette Arduino- Funktionalität der Klasse zur Verfügung steht. Des Weiteren nutzen wir den I 2 C-Bus, so dass Wire.h eingebunden werden muss, die die Funktionalität des TWI (Two-Wire-Interface) bereitstellt. Und last but not least unsere gerade erstellte Header-Datei zur Klassendefinition CMPS10. Bevor ich jetzt fortfahre, muss ich noch ein sehr wichtiges Element der objektorientierten Programmierung vorstellen. Den sogenannten Konstruktor. Ein Konstruktor sieht wie eine ganz normale Methode aus, besitzt jedoch keinen Rückgabewert, der auch nicht über void deklariert werden darf. Damit ein Objekt bei der Generierung einen definierten Ausgangszustand bekommt, wird ein Konstruktor verwendet. Er besitzt den gleichen Namen wie die Klasse und wird implizit bei der Instanziierung aufgerufen. Was liegt näher, als unser Objekt mit der eindeutigen I 2 C-Bus Adresse zu versehen. Sehen wir uns kurz den entsprechenden Aufruf im Haupt-Sketch an. Das Objekt bekommt in meinem Fall den frei wählbaren Namen mycompass und als Argument wird die I 2 C-Bus Adresse übergeben. Zurück zur Klassen-Implementierung. (1) Der Konstruktor Die Konstruktor-Definition schaut wie folgt aus: Der Parameter i2c_addr übergibt die Adresse an das private Feld cmps10_i2c_addr (siehe Zeile 34 der Header-Datei). Dieses Feld wird später beim Zugriff auf den I 2 C-Bus benötigt. In Zeile 15 wird der I 2 C-Bus über die begin-methode als letzte Anweisung im Konstruktor initialisiert. (2) Die Methode getaddr() Über die Methode getaddr kann die verwendete I 2 C-Adresse abgerufen werden: Das return-statement liefert das private Feld cmps10_i2c_addr an den Aufrufer zurück. 8

(3) Die Methode getversion() Über die Methode getversion kann die Firmware-Version des Kompassmoduls abgerufen werden. Diese Methode ruft ihrerseits die Methode readi2c mit dem genannten Register-Index SOFTWARE_VERSION auf, die jedoch als private definiert wurde und deshalb von außen nicht verfügbar ist. Das ist aber so beabsichtigt, denn lediglich die Klassenmitglieder müssen von ihrer Funktionalität profitieren. (4) Die Methode readi2c() Die Methode readi2c nimmt eine Verbindung zum I 2 C-Bus auf und ruft dort die gewünschten Daten ab. Über den Parameter reg_addr wird festgelegt, welches CMPS10-Register abgefragt werden soll. Die Transmission wird in Zeile 30 durch die begintransmission-methode gestartet und über die I 2 C- Busadresse des privaten Feldes cmps10_i2c_addr initialisiert. In Zeile 31 wird das abzufragende Register an den Bus versendet und in der darauffolgenden Zeile 32 die Transmission durch die endtransmission-methode beendet. Zeile 33 fordert von der Busadresse über die requestfrom- Methode ein einzelnes Byte an, was über die read-methode in Zeile 34 an den Aufrufer zurückgeliefert wird. (5) Die Methode getbearing_low() Das CMPS10-Modul bietet 2 unterschiedliche Kursinformationen (Bearing) an. Eine mit niedriger Auflösung, wobei der Kurs in einem Byte abgelegt wird und demnach Werte zwischen 0 und 255 speichern kann. 9

Das ist vielleicht auf den ersten Blick etwas unverständlich und deshalb werfen wir einen Blick auf die folgende Grafik: Wenn du also z.b. einen Messwert von 128 erhältst, ist das ungefähr mit 180 0 gleichzusetzen. Eine recht ungenaue Angelegenheit also. Da würde ich schon den nächsten Ansatz mit der höheren Genauigkeit vorziehen. (6) Die Methode getbearing_high() Um einen präzisen Kurswert zu erhalten, schlage ich auf jeden Fall die Methode getbearing_high vor. Deren Winkelwert ist in zwei getrennten Registern (High- und Low-Byte) hinterlegt. Aus diesem Grund muss die readi2c-methode auch 2x aufgerufen werden. Zum einen mit dem Bearing-High Register und zum anderen mit dem Bearing-Low Register. Ich habe das Zusammenspiel der beiden Bytes zwar schon in meinem ersten AddOn zu diesem Thema erläutert, doch für diejenigen, die ihn nicht gelesen haben, hier die Erläuterungen dazu. Da der Kompasswert Werte von 0 bis 3599 annehmen kann, ist es nicht möglich, diesen Bereich innerhalb eines einzigen Bytes abzulegen, das lediglich Werte von 0 bis 255 speichern kann. Also muss der eigentliche Wertebereich von 0 bis 3599 in zwei Bytes abgelegt werden. Einem High-Byte (hbyte) und einem Low-Byte (lbyte). 10

Jedes einzelne Byte hat jedoch hinsichtlich der Bit-Werte den Wertebereich von 2 0 bis 2 7. Für das Low-Byte ist das noch vollkommen in Ordnung. Jedoch für das High-Byte stimmt es nicht, denn eigentlich erstreckt sich der Wertebereich von 2 8 bis 2 15. Wie wird das also korrigiert? Ganz einfach, in dem wir die vorliegende Bitkombination um 8 Stellen mittels << (Shift-Left-Operator) nach links verschieben. Hier im Detail mit einem beliebigen Wert: Wir nehmen an, dass der High-Byte-Wert 101 2 ist, also dem dezimalen Wert von 5 entspricht. Wie schon gesagt, stimmt das aber nicht so ganz, denn eigentlich handelt es sich um den Wert 1280. Denn die Positionen, die mit dem Wert 1 belegt sind, haben die Stellenwertigkeiten (von rechts nach links) 2 8 und 2 10. Das gibt in Summe den genannten Wert 1280. Über das Verschieben der kompletten Bitpositionen um 8 Stellen nach links kommen wir auf den korrekten Wert des High-Byte. An den rechts freiwerdenden Positionen werden übrigens Nullen eingeschoben. Abschließend kann der Low-Byte-Wert zum Verschiebeergebnis hinzuaddiert werden. Warum aber wird das Ergebnis noch einmal durch den Wert 10 dividiert? Die Antwort ist recht simpel, denn ein Vollkreis erstreckt sich von 0 0 bis 360 0, aber hier werden die Werte von 0 bis 3599 zur Verfügung gestellt. Das entspricht also der Genauigkeit von 0 0 bis 359,9 0. Um das Ergebnis zu erreichen, muss demnach das Komma um eine Stelle nach Links verschoben werden. (7) Die Methode getpitch() Der Pitchwert wird über die Methode getpitch ermittelt. Der readi2c-methode wird der PITCH-Registerwert übergeben. (8) Die Methode getroll() Der Rollwert wird über die Methode getroll ermittelt. Der readi2c-methode wird der ROLL-Registerwert übergeben. 11

Der Arduino-Sketch Nun ist alles dafür vorbereitet, dass wir uns dem Arduino-Sketch zuwenden können. Der Abruf der Kompassdaten gestaltet sich aufgrund der Vorarbeiten bei der Klassendefinition recht einfach und kann jetzt auch anderen Programmierern als einfaches Mittel an die Hand gegeben werden, die Daten abzufragen. Gehen wir den Sketch schrittweise durch. Vorbereitende Maßnahmen: In den Zeilen 1 und 2 werden die erforderlichen Include-Anweisungen eingefügt, um einerseits den Zugriff auf den I 2 C-Bus zu gewährleisten und andererseits die Klasse zu nutzen. In Zeile 3 definieren wir die Bus-Adresse des Kompassmoduls. Letztendlich können wir in Zeile 5 die Klasse CMPS10 nutzen und das Objekt mycompass generieren und den Konstruktor mit der Information über die Bus-Adresse versorgen. Das Setup: In der setup-funktion rufen wir zu Testzwecken die Informationen über die Busadresse bzw. die Firmware-Versionsnummer ab. Kontinuierliches Abfragen der Kompasswerte: In der loop-funktion fragen wird kontinuierlich die Kompasswerte ab und zeigen sie im Serial- Monitor an. 12

Die Ausgabe schaut wir folgt aus: Ich wünsche dir viel Spaß mit allem und Frohes Frickeln www.erik-bartmann.de 13