Forum: Mikrocontroller und Digitale Elektronik Arduino iLib und BMP280


von Holger G. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Klassen Modifizierer (Gast)


Lesenswert?

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 ...

von Holger G. (Gast)


Lesenswert?

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

von Klassen Modifizierer (Gast)


Lesenswert?

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.

von Klassen Modifizierer (Gast)


Lesenswert?

Klassen Modifizierer schrieb:
> MeineZweiteInstanz.begin (0x77, IDirgendwas_a);
-----------------------------------^^^^^^^^^^^^

Da könnte evtl was anderes stehen (können, müssen).

von Klassen Modifizierer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.