icssw-org / MeshCom-Firmware

MeshCom Client 4.0
https://icssw.org/meshcom/
MIT License
19 stars 6 forks source link

BME280 und I2C-Scanner funktionieren nicht am Heltec V3 #51

Closed dl9sec closed 1 month ago

dl9sec commented 1 month ago

Describe the bug Der BME280 funktioniert nicht am Heltec V3. Ebenso funktioniert der I2C-Scanner nicht.

To Reproduce Anschluss eines BME280 entsprechend https://icssw.org/bmp-bme280-sensor/ -> Fehlermeldungen an der Konsole, Sensor wird auf 0x76 nicht erkannt.

Eingabe von "--showI2C" an der Konsole -> nichts passiert.

If no serial Log is available, provide at least the firmware version you are running: v4.33e

Additional context

Ich vermute mal es liegt daran, dass das OLED-Display mit u8g2 SW-I2C statt HW-I2C betrieben wird.

Wäre es möglich, den Treiber auf HW umzustellen? Der ESP32-S3 hat meines Wissens nach zwei I2C-Controller drin, deren SDA/SCL sich frei auf alle GPIOs legen lassen (und das sollte eigentlich das BSP für den S3 regeln).

Es sollte eigentlich mit folgender Initialisierung funktionieren: esp32_main.cpp:

...
#include <U8g2lib.h>

#if defined(BOARD_HELTEC)
    extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
#elif defined(BOARD_HELTEC_V3)
    // extern U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2;
    extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 21, /* clock=*/ 18, /* data=*/ 17);
#elif defined(BOARD_RAK4630)
    extern U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2;
#elif defined(BOARD_E290)
    extern U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2;
#else
    extern U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2;
#endif
...

So hat es jedenfalls jemand erfolgreich mit dem HW-Treiber initialisiert (siehe https://community.hiveeyes.org/t/externes-oled-an-heltec-v3-uber-i2c-anschliessen/4720/11)

Damit würde dann möglicherweise auch der I2C-Scanner am Heltec V3 funktionieren...

Vielen Dank.

Gruß, Thorsten

dl9sec commented 1 month ago

Dieser "quick and dirty" Arduino-Code demonstriert, dass auch am Heltec V3 der Hardware-I2C funktioniert und OLED und BME280 prima gemeinsam an einem Bus funktionieren:

#include <Wire.h>
#include <BMx280I2C.h>
#include <U8g2lib.h>

#define I2C_ADDRESS 0x76

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 21, /* clock=*/ 18, /* data=*/ 17);

//create a BMx280I2C object using the I2C interface with I2C Address 0x76
BMx280I2C bmx280(I2C_ADDRESS);

char print_text[500];

void setup(void) {
  Serial.begin(115200);

  //wait for serial connection to open (only necessary on some boards)
  while (!Serial);

  u8g2.begin();

  u8g2.clearDisplay();
  u8g2.setFont(u8g2_font_6x10_mf);
  u8g2.firstPage();
  do
  {
    u8g2.setFont(u8g2_font_10x20_mf);
    u8g2.drawStr(5, 20, "MeshCom 4.0");
    u8g2.setFont(u8g2_font_6x10_mf);
    u8g2.drawStr(5, 30, "X.XX/z (EU)");
    u8g2.drawStr(5, 40, "by icssw.org");
    u8g2.drawStr(5, 50, "OE1KFR, OE1KBC");
    u8g2.drawStr(5, 60, "...starting now");
  } while (u8g2.nextPage());

  delay(4000);

  //Wire.begin();

  //begin() checks the Interface, reads the sensor ID (to differentiate between BMP280 and BME280)
  //and reads compensation parameters.
  if (!bmx280.begin())
  {
    Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
    while (1);
  }

  if (bmx280.isBME280())
    Serial.println("sensor is a BME280");
  else
    Serial.println("sensor is a BMP280");

  //reset sensor to default parameters.
  bmx280.resetToDefaults();

  //by default sensing is disabled and must be enabled by setting a non-zero
  //oversampling setting.
  //set an oversampling setting for pressure and temperature measurements. 
  bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
  bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);

  //if sensor is a BME280, set an oversampling setting for humidity measurements.
  if (bmx280.isBME280())
    bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);  
}

void loop(void) {

  delay(1000);

  //start a measurement
  if (!bmx280.measure())
  {
    Serial.println("could not start measurement, is a measurement already running?");
    return;
  }

  //wait for the measurement to finish
  do
  {
    delay(100);
  } while (!bmx280.hasValue());

  Serial.print("Pressure: "); Serial.println(bmx280.getPressure());
  Serial.print("Pressure (64 bit): "); Serial.println(bmx280.getPressure64());
  Serial.print("Temperature: "); Serial.println(bmx280.getTemperature());

  //important: measurement data is read from the sensor in function hasValue() only. 
  //make sure to call get*() functions only after hasValue() has returned true. 
  if (bmx280.isBME280())
  {
    Serial.print("Humidity: "); 
    Serial.println(bmx280.getHumidity());
  }

  sprintf(print_text, "%4.2f", bmx280.getTemperature());

  u8g2.firstPage();
  u8g2.drawStr(5,30, print_text);
  u8g2.nextPage();
}

Ich habe auch die "F"-Option ("Full framebuffer") auf dem S3 ausprobiert. Funktioniert auch, zudem super schnell. Es gibt aus meiner Sicht keinen Grund, Heltec V3 beim Grafik-Handling anders zu behandeln, als z.B. den TBEAM. Einzig auf die Initialisierung muss ein wenig acht gegeben werden.

Leider komme ich so auf die Schnelle mit dem Code nicht so gut zurecht, dass ich eine funktionierende Lösung als PR anbieten kann. Eventuell kommen die Maintainer da etwas schneller auf eine gute Lösung...

Gruß, Thorsten

dl9sec commented 1 month ago

Also ich habe jetzt eine 4.33e am Heltec V3 mit Hardware-I2C laufen. Das OLED läuft, wie die anderen Boards auch im "full display frame buffer" Modus (sehr flott!). "--showI2C" funktioniert jetzt, ebenso, wie der BME280. Ich würde einen Pull-Request zusammenstellen, aber den würde ich gerne auf der neuesten Version 4.34c machen. Leider scheint das Github-Repo nicht so organisiert zu sein, dass der main-Branch kontinuierlich weitergepflegt wird und die einzelnen Versionen getagged werden...

Gruß, Thorsten

oe1kbc commented 1 month ago

Hallo Thorsten,

ich habe 4.34c in den „main“-Branch eingefügt. Willst Du Deinen Pull-Request jetzt einarbeiten. Danach gehen wir auf die Version 4.34d, da warten wieder einige Neurerungen.

Danke

73 de Kurt

OE1KBC

Von: Thorsten Godau @.> Gesendet: Sonntag, 13. Oktober 2024 16:11 An: icssw-org/MeshCom-Firmware @.> Cc: Subscribed @.***> Betreff: Re: [icssw-org/MeshCom-Firmware] BME280 und I2C-Scanner funktionieren nicht am Heltec V3 (Issue #51)

Also ich habe jetzt eine 4.33e am Heltec V3 mit Hardware-I2C laufen. Das OLED läuft, wie die anderen Boards auch im "full display frame buffer" Modus (sehr flott!). "--showI2C" funktioniert jetzt, ebenso, wie der BME280. Ich würde einen Pull-Request zusammenstellen, aber den würde ich gerne auf der neuesten Version 4.34c machen. Leider scheint das Github-Repo nicht so organisiert zu sein, dass der main-Branch kontinuierlich weitergepflegt wird und die einzelnen Versionen getagged werden...

Gruß, Thorsten

— Reply to this email directly, view it on GitHub https://github.com/icssw-org/MeshCom-Firmware/issues/51#issuecomment-2408995121 , or unsubscribe https://github.com/notifications/unsubscribe-auth/AA2E5B6B2B5ZKF7NU4SH3HDZ3J5OJAVCNFSM6AAAAABPV46A36VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDIMBYHE4TKMJSGE . You are receiving this because you are subscribed to this thread. https://github.com/notifications/beacon/AA2E5B6ILXF42NYOPODWGIDZ3J5OJA5CNFSM6AAAAABPV46A36WGG33NNVSW45C7OR4XAZNMJFZXG5LFINXW23LFNZ2KUY3PNVWWK3TUL5UWJTUPSZMTC.gif Message ID: @. @.> >