Hallo Liebes Forum, ich hab mühsam etwas C gelernt aber bei den Arduino Projekten wird jetzt C** verwendet. Nun hab ich hier ein konkretes Projekt in dem ich an einem Arduino zwei Sensorboards mit BMP280 Drucksensoren mit I2C auslesen möchte. Die Sensoren können über einen Pin auf Adresse 0x76 oder 0x77 gesetzt werden. Als Lib habe ich mir diese hier ausgesucht: https://github.com/orgua/iLib Die gefällt mir sehr gut und es funktioniert auch erst einmal. Mein Problem ist, wie ändere ich die Lib um im Code die Adresse des Sensors mit zu übergeben. Im Original wird die Sensoradresse in der BMP280.h in Zeile 26 als static const in "private" definiert. Diese ganze sache mit Klassen, private,public und so weiter geht noch nicht in mein beschränkten Speicher, genannt Kopf. Ich dachte, ich könnte einfach bei bmp280.setEnabled() ein zweites Argument mit übergeben. Alle meine Codeversuche haben aber nur zu komplettem Chaos geführt. Könnt Ihr mir da helfen? Ein passendes Codebeispiel wo ich das Prinzip nachvollziehen könnte und vieleicht einige kleine Erklärungen oder Quellen würden mir sehr helfen. Im Endeffekt möchte ich zwei Sensoren ansprechen und wenn diese eine bestimmte Differenz im Druck messen einen Schaltvorgang auslösen. Wie gesagt, derzeit scheitere ich schon mal an den zwei I2C Adressen auf einem Bus. Danke schon mal vorab, wenn Ihr mir weiter helft! BG Holger
Zuerst mal ist das ein mieses Beispiel. Der Programmierer klatscht seinen ganzen Code in Header- Dateien. Das tut man nicht, böse, böse! In die Header gehört (anständigerweise) nur Defines und Prototypen. Eine weiter Unart ist die Variablen in Grossbuchstaben zu schreiben. Das ist Konstanten und Defines vorbehalten. Machen kann man alles, aber das ist schlechter Programierstil. Zu den Änderungen die zum Ziel führen könnten. Du brauchst zwei Instanzen der Lib:
1 | BMP280 bmp280_1; |
2 | BMP280 bmp280_2; |
und am einfachsten ist die Adresse modifizierbar zu machen: von so
1 | /** ######### Register-Map ############################ */
|
2 | static const uint8_t I2C_ADDRESS =(0x76); |
nach so
1 | /** ######### Register-Map ############################ */
|
2 | uint8_t I2C_ADDRESS; |
Dann noch eine Set-Funktion in public:
1 | void BMP280:SetAddress (uint8_t addr) |
2 | {
|
3 | I2C_ADDRESS = addr; |
4 | }
|
Diese Set-Funktion würde man dann zweimal aufrufen
1 | BMP280 bmp280_1; |
2 | BMP280 bmp280_2; |
3 | |
4 | ..........
|
5 | |
6 | bmp280_1.SetAddress (0x76); |
7 | bmp280_2.SetAddress (0x77); |
Nicht ausgetestet, vielleicht hab ich auch irgendwas vergessen ...
11:19 meine Anfrage und 11:52 eine kompetente Antwort! Ich bin immer wieder begeistert von der Hilfsbereitschaft in diesem Forum. Danke! Danke! Ich habe die Schaltung zu Hause auf dem Basteltisch zu liegen und schaue mit den Code heute Abend mal an und werde versuchen die vorgeschlagenen Änderungen einzubauen. Das der Programmierstil schlecht ist, hab ich mir gedacht, aber nicht genug Ahnung um das zu kritisieren. Warum auch? erst mal funktioniert der Code grundsätzlich. Was in die *.h gehört habe ich mir beim üben mit C gemerkt. Aber es ist halt so mit dem geschenkten Gaul :-) solange er läuft... Es gibt auch noch 2 weitere Bibliotheken.: https://github.com/adafruit/Adafruit_BMP280_Library und https://github.com/mahfuz195/BMP280-Arduino-Library Die erstere funktioniert, zeigte aber merkwürdige Werte an und die zweite lies sich nicht kompilieren. Und wie ich bei der Adafruit Lib die Adresse wechseln konnte, hab ich auch nicht rausgefunden... Nochmals vielen Dank! Ich würde mich nochmal melden, wenn ich Fragen habe bzw. auch wenn ich erfolg hatte. BG Holger
Holger G. schrieb: > Und wie ich bei der Adafruit Lib die > Adresse wechseln konnte, hab ich auch nicht rausgefunden... Du musst bei solchen Libs in Klassen denken, will heissen jedem Chip seine eigene Bib (vereinfacht gesprochen) D.h. du brauchst zwei Instanzen: Adafruit_BMP280 MeineErsteInstanz; Adafruit_BMP280 MeineZweiteInstanz; und musst dann im Setup beide "instanzieren", in Betrieb nehmen: MeineErsteInstanz.begin (0x76, IDirgendwas_a); MeineZweiteInstanz.begin (0x77, IDirgendwas_a); Diese Konstruktor-Funktion (Inbetriebnahme) ist Adafruit_BMP280::begin(uint8_t a, uint8_t chipid) welche zwei Parameter verlangt, die erste ist eine spezifische I2C Adresse, die zweite eine ID die ich jetzt nicht kenne.
Klassen Modifizierer schrieb: > MeineZweiteInstanz.begin (0x77, IDirgendwas_a); -----------------------------------^^^^^^^^^^^^ Da könnte evtl was anderes stehen (können, müssen).
Klassen Modifizierer schrieb: > void BMP280:SetAddress (uint8_t addr) ... und hier fehlt noch ein Doppelpunkt. Also
1 | void BMP280::SetAddress (uint8_t addr) |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.