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.
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
|
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 ?
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.
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 ?
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
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.
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 . . . .
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)
mit diesem Programm bzw cactus library funktioniert der Sensor, würde gerne wissen warum. Es beinhaltet auch die Zeile 'BME280_I2C bme (0x76)'.
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.
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.
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 !?
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
Habe das Programm geändert, jetzt wird eine fehlende SDA Leitung erkannt, jedoch nicht in die loop gesprungen ?! ("Luftdruck")
Habe das Programm wegen besserer Übersicht nochmal reduziert. Warum wird "Luftdruck" nicht am seriellen Monitor ausgegeben ?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.