Hallo Forum.
Ich wollte mal zur Abwechslung zu meinen Serial Problemen was "einfaches" machen.
Ich habe eine Arduino Mega per I2C mit einem TCA9548A verbunden.
Am TCA9548A sind 8 BME280 angeschlossen.
Da man die Adresse der BME280 nicht ändern kann wollte ich diese mit dem TCA abfragen.
Nur leider habe ich das Problem, dass ich erst die Daten von allen 8 BME bekomme wenn ich nach und nach zum ablauf des Loops den Reset am Adruino drücke
Erst dann bekomme ich eine Verbindung und die Informationen.
Die Delays sind der einfachheit halber drin zum testen.
Was mich einfach wurmt ist das ich nicht dahinter komme wie ich die BME's direkt per Code zum laufen bekomme ohne reset.
Was mich aber weiter Wundert ist das wenn ich mit dem I2C (TCA) Scanner an die Sache ran gehe findet er sofort jeden BME.
/*
TCA9548 I2CScanner.pde -- I2C bus scanner for Arduino
Based on code c. 2009, Tod E. Kurt, http://todbot.com/blog/
*/
#include "Wire.h"
extern "C" {
#include "utility/twi.h" // from Wire library, so we can do bus scanning
}
#define TCAADDR 0x70
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
void setup()
{
while (!Serial);
delay(1000);
Wire.begin();
Serial.begin(9600);
Serial.println("\nTCAScanner ready!");
for (uint8_t t = 0; t < 8; t++) {
tcaselect(t);
Serial.print("TCA Port #"); Serial.println(t);
for (uint8_t addr = 0; addr <= 127; addr++) {
if (addr == TCAADDR) continue;
uint8_t data;
if (! twi_writeTo(addr, &data, 0, 1, 1)) {
Serial.print("Found I2C 0x"); Serial.println(addr, HEX);
}
}
}
Serial.println("\ndone");
}
void loop()
{
}
Hier die serielle Ausgabe
TCAScanner ready!
TCA Port #0
Found I2C 0x76
TCA Port #1
Found I2C 0x76
TCA Port #2
Found I2C 0x76
TCA Port #3
Found I2C 0x76
TCA Port #4
Found I2C 0x76
TCA Port #5
Found I2C 0x76
TCA Port #6
Found I2C 0x76
TCA Port #7
Found I2C 0x76
done
Da hier 8x genau das Gleiche gemacht wird, kann man sich Da nicht 7 der Instanzen sparen?
Stelle mir das so vor, daß nach jedem TCA-Select und bme.beginn() der TCA weiter geschaltet wird und die letzte BME-Instanz wieder zerstört wird.
Außer beim letzten BME.
Wenn jetzt der TCA umgeschaltet wird, sind sämtliche BME identisch konfiguriert und sollten ebenso identisch funktionieren.
postmaster-ino:
Stelle mir das so vor, daß nach jedem TCA-Select und bme.beginn() der TCA weiter geschaltet wird und die letzte BME-Instanz wieder zerstört wird.
Warum und vor allem wodurch sollte da eine Instanz zerstört werden?
Das meine ich: Da wird Nichts zerstört - deshalb werden wohl 8 Instanzen der BME-Lib im SPeicher 'ihr Unwesen treiben' - wo mir eine Instanz reichen müsste.
Dem Arduino ist's egal, Welcher der 8 BME antwortet, Er würde mit der letzten erstellten Instanz alle 8 BME 'verstehen' können, für Ihn sind Das eh nur neue Daten.
Daher meine ich, daß man die vorherigen Instanzen gar nicht braucht.
Vll. reicht auch EINE Instanz, ich rufe aber die .begin()-Methode bei jedem der BME 1x auf - müsste in die Lib schauen, was Da passiert, nicht, daß dort z.B. Speicher reserviert wird.
Das müsste sich doch durch EINE Zeile genau so erledigen lassen, oder?
Dann im setup() für jeden TCA-Aufruf (für jede Umschaltung) die .begin() aufgerufen, und der jeweilige BME ist eingestellt.
In der loop() dann wieder für jeden TCA-Aufruf die Daten auslesen, fertig.
Vll. habe ich mich blöd ausgedrückt, wenn nur eine Instanz erstellt wird und Diese mehrfach benutzt wird, muß natürlich Keine davon wieder zerstört werden.
Das meine ich: Da wird Nichts zerstört - deshalb werden wohl 8 Instanzen der BME-Lib im SPeicher 'ihr Unwesen treiben' - wo mir eine Instanz reichen müsste.
Dem Arduino ist's egal, Welcher der 8 BME antwortet, Er würde mit der letzten erstellten Instanz alle 8 BME 'verstehen' können, für Ihn sind Das eh nur neue Daten.
Daher meine ich, daß man die vorherigen Instanzen gar nicht braucht.
Vll. reicht auch EINE Instanz, ich rufe aber die .begin()-Methode bei jedem der BME 1x auf - müsste in die Lib schauen, was Da passiert, nicht, daß dort z.B. Speicher reserviert wird.
Das müsste sich doch durch EINE Zeile genau so erledigen lassen, oder?
Dann im setup() für jeden TCA-Aufruf (für jede Umschaltung) die .begin() aufgerufen, und der jeweilige BME ist eingestellt.
In der loop() dann wieder für jeden TCA-Aufruf die Daten auslesen, fertig.
Vll. habe ich mich blöd ausgedrückt, wenn nur eine Instanz erstellt wird und Diese mehrfach benutzt wird, muß natürlich Keine davon wieder zerstört werden.
MfG
Der Sketch verwendet 9278 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 957 Bytes (11%) des dynamischen Speichers, 7235 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
Der Sketch verwendet 9164 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 600 Bytes (7%) des dynamischen Speichers, 7592 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.