Forum: Mikrocontroller und Digitale Elektronik Arduino SD und BME280


von Bernhard F. (1atmel2)


Angehängte Dateien:

Lesenswert?

Hätte ein fertiges Programm gefunden, müsste jedoch angepasst werden.
Bei mir ist die SD Karte über SPI angeschlossen und der BME280 über I2C.
Bin beim Programmieren leider nicht so bewandert.
Evtl kann jemand beim Anpassen helfen ?

Wäre #define SD_SCK13 ... ein richtiger Ansatz ?
bzw bei //Adafruit...; I2C die // weglassen und SPI auskommentieren.

Sollte jemand ein fertiges Programm mit BME280 und SD Karte haben wäre 
es auch ok.

von Falk B. (falk)


Lesenswert?

Bernhard F. schrieb:

> Wäre #define SD_SCK13 ... ein richtiger Ansatz ?

Nö.

> bzw bei //Adafruit...; I2C die // weglassen und SPI auskommentieren.

BINGO!
1
Adafruit_BME280 bme; // I2C
2
//Adafruit_BME280 bme(BME_CS); // hardware SPI
3
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

von Bernhard F. (1atmel2)


Angehängte Dateien:

Lesenswert?

Mit I2C Scanner wird ein device unter der adresse 0x76 gefunden,
jedoch mit dem Beispiel Programm der Arduinoumgebung nicht ?
Sollte bei dem Programm nicht die Adresse angegeben werden ?

von Falk B. (falk)


Lesenswert?

Bernhard F. schrieb:
> Mit I2C Scanner wird ein device unter der adresse 0x76 gefunden,

Welcher I2C Scanner?

> jedoch mit dem Beispiel Programm der Arduinoumgebung nicht ?
> Sollte bei dem Programm nicht die Adresse angegeben werden ?

Eigentlich schon, wahrscheinlich steckt sie in den Libs drin.

Wire von Arduino nutzt 7 Bit Darstellung der Adresse.

von Bernhard F. (1atmel2)


Lesenswert?

https://www.gammon.com.au/forum/?id=10896
Dies wäre die Adresse des I2C Scanners von arduino.cc.

Eigentlich würde ich gerne BME auf eine SD Karte (SPI) loggen.
Gibt es da irgendwelche Vorübungen die du empfehlen könntest ?

von Falk B. (falk)


Lesenswert?

Bernhard F. schrieb:
> https://www.gammon.com.au/forum/?id=10896
> Dies wäre die Adresse des I2C Scanners von arduino.cc.

OK.

> Eigentlich würde ich gerne BME auf eine SD Karte (SPI) loggen.
> Gibt es da irgendwelche Vorübungen die du empfehlen könntest ?

Wozu? Du hat doch schon fast alles! Einfach eine Textdatei auf der 
SD-Karte öffnen und mit print reinschreiben.

https://www.arduino.cc/en/Reference/SD

von Bernhard F. (1atmel2)


Lesenswert?

Ich glaube das sind Beispiele für I2C, meine SD Karte hat jedoch SPI 
(MOSI,..)
und der Sensor I2C. Das erschwert das ganze für einen Programmierprofi 
wie mich.

von Falk B. (falk)


Lesenswert?

Bernhard F. schrieb:
> Ich glaube das sind Beispiele für I2C, meine SD Karte hat jedoch SPI
> (MOSI,..)
> und der Sensor I2C. Das erschwert das ganze für einen Programmierprofi
> wie mich.

Bist du ein Troll? Schon mal die einfachen SD-Card Beispiele angeschaut? 
Das ist TRIVIAL! Auch ohne Informatikstudium. Man muss nur die Pins in 
der Software richtig eintragen, damit sie zu deiner  Hardware passen.

https://www.arduino.cc/en/Tutorial/LibraryExamples/Datalogger#code

Leute gibt's . . . .

von Falk B. (falk)


Lesenswert?

Bernhard F. schrieb:
> Ich glaube das sind Beispiele für I2C, meine SD Karte hat jedoch SPI
> (MOSI,..)

Es gibt keine SD-Karten mit I2C, die sind IMMER SPI (beim Arduino und 
anderen kleinen Mikrocontrollern)

von Bernhard F. (1atmel2)


Angehängte Dateien:

Lesenswert?

mit diesem Programm bzw cactus library funktioniert der Sensor, würde 
gerne wissen warum. Es beinhaltet auch die Zeile 'BME280_I2C bme 
(0x76)'.

von Bernhard F. (1atmel2)


Lesenswert?

Leider kein Troll, beim programmieren tu ich  mich relativ schwer.

von Falk B. (falk)


Lesenswert?

Man werfe einen Blick in den Quelltext der BME280 Lib.

Adafruit_BME280.h
1
/*!
2
 *  @brief  default I2C address
3
 */
4
#define BME280_ADDRESS (0x77)           // Primary I2C Address
5
                                        /*!
6
                                         *  @brief  alternate I2C address
7
                                         */
8
#define BME280_ADDRESS_ALTERNATE (0x76) // Alternate Address

Dort sind 2 I2C Adressen vermerkt. BME280_ADDRESS wird in der Methode 
begin() verwendet, BME280_ADDRESS_ALTERNATE wird nie verwendet. Wenn 
dein Sensor also mit Adresse 0x76 verkabelt ist, wird er duch diese 
Software NIE gefunden! Da hat der Programmierer nicht so wirklich 
mitgedacht.

Es gibt 2 Möglichkeiten. Du gehst in den Quelltext der Lib, der liegt im 
Arduino-Verzeichnis unter

C:\Programme\Arduino\libraries\Adafruit_BME280_Library-2.1.2\Adafruit_BM 
E280.h

und änderst die Zahl in 0x76
1
#define BME280_ADDRESS (0x76)           // Primary I2C Address

Oder du änderst das Adresspin an deinem Sensor in der Hardware, um die 
Adresse 0x77 einzustellen.

von Bernhard F. (1atmel2)


Lesenswert?

Vielen Dank erstmal. SD Karte und Sensor funktionieren jetzt auf dem 
Steckboard mit unterschiedlichen Programmen. Bei der Kombination der 
beiden Programme sehe ich nun meine Probleme.

von Bernhard Fraunhofer (Gast)


Angehängte Dateien:

Lesenswert?

Habe jetzt mal versucht das Datalogger Programm abzuändern, aber es wird 
kein Luftdruck ausgegeben. Für den Anfang würde mir der Luftdruck 
reichen, auch eine Prüfung auf Vorhanden einer SD Karte würde das 
Programm vereinfachen.
Auch der Unterschied zwischen read und get ist nicht wirklich klar !?

von Εrnst B. (ernst)


Lesenswert?

Bernhard Fraunhofer schrieb:
> Habe jetzt mal versucht das Datalogger Programm abzuändern

Da ist eine "}" an der falschen Stelle:
1
 if (!SD.begin(chipSelect)) {
2
    Serial.println("Card failed, or not present");
3
    // don't do anything more:
4
//// HIER FEHLT :
5
    while (1);
6
  }
7
//////////

und weiter unten ist's zuviel.
Resultat: Du startest den BME nur, wenn die SD-Karte nicht 
funktioniert?!¿¡


Tipp: Quelltext immer sauber einrücken, dann fällt sowas direkt ins 
Auge.

: Bearbeitet durch User
von Bernhard Fraunhofer (Gast)


Lesenswert?

Habe das Programm geändert, jetzt wird eine fehlende SDA Leitung 
erkannt, jedoch nicht in die loop gesprungen ?! ("Luftdruck")

von Bernhard F. (1atmel2)


Angehängte Dateien:

Lesenswert?

Habe das Programm wegen besserer Übersicht nochmal reduziert. Warum wird 
"Luftdruck" nicht am seriellen Monitor ausgegeben ?

von Εrnst B. (ernst)


Lesenswert?

Bernhard F. schrieb:
> Warum wird
> "Luftdruck" nicht am seriellen Monitor ausgegeben ?

Weil bme.readSensor nicht beendet wird, was entweder am fehlenden 
"bme.begin" liegt, oder z.B. daran dass dein BME nicht an Adresse 0x77 
zu finden ist.

Schreib einfach mal mehr "Serial.println" in deine loop(), vor/nach 
jeder Aktion eine Ausgabe. Dann siehst du am Terminal, wo er hängt.

von Bernhard Fraunhofer (Gast)


Angehängte Dateien:

Lesenswert?

Ausgabe funktioniert wieder, jedoch ohne richtigen Wert.

von Εrnst B. (ernst)


Lesenswert?

Bernhard Fraunhofer schrieb:
> Ausgabe funktioniert wieder, jedoch ohne richtigen Wert.

Wenn du kein bme.begin ausführst, können die Werte nicht stimmen. Da 
wird u.A. die Kalibration/Umrechnungs-Koeffizienten gelesen und 
initialisiert.

Diese "cactus"-Bibliothek ist eh recht zweifelhaft.

Teilt eiskalt durch 0, und weiß das sogar, merkt es extra in einem 
Kommentar an:
1
 
2
   if (var1 == 0) {
3
        
4
        // return 0;  // avoid exception caused by division by zero
5
        pressure = 0.0;
6
    }
7
    
8
    p = 1048576 - adc_P;
9
    
10
    p = (((p<<31) - var2)*3125) / var1;

var1 ist an der Stelle übrigens ziemlich sicher == 0, wenn das Objekt 
nicht initisiert wurde.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Bernhard F. schrieb:
> Habe das Programm wegen besserer Übersicht nochmal reduziert. Warum wird
> "Luftdruck" nicht am seriellen Monitor ausgegeben ?

Du wirst noch viel Spaß mit deinem Trial & Error haben. Ich würde mal 
meinen, dir fehlen ELEMENTARSTE Grundlagen, du probierst einfach nur 
wild rum, ohne zu verstehen, was du da wirklich machst.

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.