Esp32 i2c sensore + display

salve a tutti, sto cercando di collegare ad un esp32s3 un gy-511 ed un display (SH1107) sulla stessa linea i2c per fare una bussola che mi indichi sul display dove sto andando.

con questo sketch riesco a far funzionare il display:

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define BtnPin 0 // STAMP_S3

U8G2_SH1107_64X128_F_SW_I2C u8g2(U8G2_R0, 15, 13 , U8X8_PIN_NONE); //GROVE STAMP_S3

void setup(void) {
  Wire.begin();

  Serial.begin(115200);

  u8g2.begin();

  Serial.println();
  Serial.println("RayMod");
  Serial.println();

  pinMode(BtnPin, INPUT_PULLUP);

  u8g2.clearDisplay();
  //  u8g2.setDisplayRotation(U8G2_MIRROR_VERTICAL);
  u8g2.setDisplayRotation(U8G2_R1);

  u8g2.setFlipMode(0);

  u8g2.firstPage();
  do {
    /* all graphics commands have to appear within the loop body. */
    //u8g2.setFont(u8g2_font_ncenB14_tr);
    //    u8g2.setFlipMode(1);
    u8g2.setFont(u8g2_font_freedoomr10_tu);
    u8g2.setCursor(0, 15);
    u8g2.print("* COMPASS *  :");
  } while (u8g2.nextPage());
  delay(5000);
}

void loop(void) {
  stampa();
  Serial.println("stampo");
}

void stampa() {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_7Segments_26x42_mn);
    u8g2.setCursor(20, 52);
    u8g2.print("359°");
    u8g2.drawDisc(120, 10, 4, U8G2_DRAW_ALL);  // virgola
  } while (u8g2.nextPage());
}
}

con quest'altro ho nel monitor seriale la mia direzione:

#include <Wire.h>

// LSM303 Compass Library
#include <LSM303.h>

LSM303 cmps;

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

  //  Wire.begin(SDA, SCL);
  //Wire.begin(13, 15);  //STAMP_S3
    Wire.begin();

  cmps.init();
  cmps.enableDefault();

  Serial.println("Setup complete...");

  /*
  Calibration values; the default values of +/-32767 for each axis
  lead to an assumed magnetometer bias of 0. Use the Calibrate example
  program to determine appropriate values for your particular unit.
  */
  cmps.m_min = (LSM303::vector<int16_t>){ -32767, -32767, -32767 };
  cmps.m_max = (LSM303::vector<int16_t>){ +32767, +32767, +32767 };
}

void loop() {
  cmps.read();

  float heading = cmps.heading();

  Serial.print("Heading:  ");
  Serial.println(heading);
  delay(200);
}

a quanto dice lo scanner i2c, gli indirizzi sono:

Scanning...
I2C device found at address 0x19  // gy-511
I2C device found at address 0x1E  // gy-511
I2C device found at address 0x3C  // oled
done

ma quando cerco di unire i due sketch il tutto non va... i problemi cominciano quando aggiungo
u8g2.begin() allo sketch della bussola... credo sia un problema di indirizzi ed ho provato anche ad usare i2cSetAddress della libreria u8g2 prima del begin ma senza successo...

questo è lo sketch che si bocca:

#include <Arduino.h>
#include <U8g2lib.h>

#include <Wire.h>

// LSM303 Compass Library
#include <LSM303.h>

LSM303 cmps;

U8G2_SH1107_64X128_F_SW_I2C u8g2(U8G2_R0, 15, 13 , U8X8_PIN_NONE); //GROVE STAMP_S3


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

  //  Wire.begin(SDA, SCL);
  //Wire.begin(13, 15);  //STAMP_S3
    Wire.begin();

  cmps.init();
  cmps.enableDefault();

  Serial.println("Setup complete...");

  /*
  Calibration values; the default values of +/-32767 for each axis
  lead to an assumed magnetometer bias of 0. Use the Calibrate example
  program to determine appropriate values for your particular unit.
  */
  cmps.m_min = (LSM303::vector<int16_t>){ -32767, -32767, -32767 };
  cmps.m_max = (LSM303::vector<int16_t>){ +32767, +32767, +32767 };

  u8g2.begin();

}

void loop() {
  cmps.read();

  float heading = cmps.heading();

  Serial.print("Heading:  ");
  Serial.println(heading);
  delay(200);
}




dove sbaglio??

grazie e buone feste!!

Secondo me nell'inizializzazione del display. Hai un display I2C, collegato sui pins dell'I2C (tanto è che lo scanner lo vede senza problemi), perchè allora usare l'emulazione software dell'I2C sui medesimi pins dove avresti già l'I2C hardware? Questo probabilmente confonde la libreria wire, e quindi il sensore non funziona. Prova a cambiare la riga di inizializzazione da:

U8G2_SH1107_64X128_F_SW_I2C u8g2(U8G2_R0, 15, 13 , U8X8_PIN_NONE);

a:

U8G2_SH1107_64X128_F_HW_I2C u8g2(U8G2_R0, 15, 13 , U8X8_PIN_NONE);

e vedi se funziona.

Ciao, Ale.

grazie mille per la risposta tempestiva, festiva e risolutiva!!

quello che non capisco è perché poi non devo fare il begin della Wire.... mumble mumble

grazie ancora!!

Probabilmente lo fa la libreria "di nascosto“

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.