Hola,
Tengo unos ESP32 de Heltec, pero estos ESP32 usan los puertos SDA y SCL para la pantalla OLED que tienen integrada, por lo que no puedo usar dispositivos que usan SDA y SCL (como el reloj RTC DS3231) si también uso la pantalla OLED.
Lo he probado tanto con el WiFi LoRa 32 V3 como con el WiFi Kit 32 V3.
En cuanto inicializo la pantalla OLED con "u8g2.begin()" ya no puedo iniciar el reloj con "rtc.begin()".
El problema es que ambos usan SDA y SCL, y no puedo usarlos a la vez...
He intentado modificar el fichero pins_arduino.h de la variante del esp32 de heltec, pero claro, si modifico esto, lo que hago es modificarlo para ambos "sensores" la pantalla OLED y el DS3231.
Llegados a este punto estoy atascado, ya que no puedo iniciar el DS3231 pasándole otros pins (GPIO), ya que el constructor begin no tiene parámetros, y no sé si me merece la pena cambiar el código o si existe otra solución más "elegante".
¿Alguien podría indicarme cómo puedo tener estos dos dispositivos funcionando a la vez si ambos requieren de SDA y SCL?
Saludos
Usar Google no era opción?
En el puerto I2C se pueden conectar hasta 127 dispositivos, mira si se pueden usar para otra cosa.
Lo que pasa es que la librería para la OLED reasigna los pines I2C.
Hola @MaximoEsfuerzo ,
Usar un buscador es siempre la segunda opción (lo siento, uso DuckDuckGo, no Google), la primera es probar, y la última, siempre, preguntar cuando ya no encuentro una salida (y cuando ya llevo unos cuantos días así).
Sé que se pueden conectar múltiples dispositivos por I2C, incluso antes de preguntar (y buscar) hice un escaneo para ver si podía acceder a ellos por las direcciones detectadas. Código del escaneo (no es mío):
#include <Wire.h>
void setup(){
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop(){
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ){
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0){
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4){
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
Esa entrada de github no la encontré (tal vez no dí con las "keywords" adecuadas), me centré más en la web de heltec, y en cuestiones similares pero que no podía aplicar a mi caso.
Gracias por la información, la revisaré.
Saludos
No, lee las Normas del Foro, usar el buscador (el que más te guste) es la primera opción antes de preguntar.
Además, al menos yo, no pruebo nada sin antes informarme, pero cada uno tiene su estilo de hacer las cosas.
Raro que no la encontraras porque es la página de Github de Heltec. Bueno, no importa, ahí está la explicación de por qué no funcionó como esperabas y una solución (la otra es usar el otro bus I2C).
Saludos
Hola @MaximoEsfuerzo,
Creo que sería mejor centrarse en el objeto de este hilo, y no en esto que intentas centrarlo, no obstante, vista tu insistencia, me gustaría responderte dando así por zanjado este tema (por mi parte) centrándome, como he indicado anteriormente, en el objeto de este hilo.
Entiendo que mucha gente venga al foro a preguntar sin antes leer ni probar (yo también soy moderador de otro foro y esto, por desgracia, es el día a día), pero no todas las personas actúan igual, y la verdad es que responder así (yo lo he entendido con una cierta prepotencia, aunque muy probablemente tú no lo hayas querido decir así) dando por sentado que he preguntado sin antes estar leyendo y probando la verdad es que (para mí) no me parece correcto.
Es totalmente cierto que me faltan conocimientos en electrónica y electricidad (soy ingeniero informático, no electrónico), pero poco a poco voy aprendiendo cosas leyendo y sobretodo, tropezando con los problemas que me van surgiendo.
Si hubieses leído mi mensaje verías que yo indico que buscar es una opción anterior a la de preguntar, por lo que estás dándome la razón con este mensaje, otra vez más, indicando que antes te informas (y entiendo que pruebas) al igual que indico yo como primera opción.
Con respecto al enlace de las normas del foro (que las conozco, puesto que soy usuario registrado desde 2018 -aunque escriba poco-), yo me refiero al proceso normal de creación de un proyecto, y tú te refieres al proceso de creación de nuevos hilos en el foro de arduino. Son cosas distintas, aunque en este caso lo que tú comentas es parte del proceso del proyecto (al existir problemas que no pueden ser resueltos). No hay nadie que antes de ponerse a probar las cosas (después de haber leído documentación), se ponga a buscar como loco antes de probar (tal vez se me ocurre aquellos que no tienen nociones de programación y se ponen a copiar y pegar fragmentos de código a ver qué hace).
Espero que no te moleste esta crítica, no quiero desmerecer tu trabajo (altruista, como todos aquellos que nos dedicamos a responder mensajes en foros), pero sí que quería expresarte mi malestar, dándote de igual manera las gracias por tus mensajes, tu paciencia y tu tiempo ayudando a todos aquellos que tenemos problemas con nuestros proyectos.
Efectivamente, funciona perfectamente, conectando el módulo a los pins GPIO 15 (SCL) y 4 (SDA). Para que esto funcione se debe inicializar el módulo después de haber inicializado la pantalla OLED con "u8g2.begin()", ya que antes de inicializarla los puertos GPIO para SCL y SDA son los que indica la documentación (22 y 21 respectivamente), pero al inicializar la pantalla OLED con "u8g2.begin()" estos cambian a los puertos GPIO 15 y 4.
Otra posible opción es inicializar la biblioteca Wire para usar los puertos 15 y 4. Se podría hacer con la biblioteca SoftWire (pongo un fragmento de código que podría servir):
//...
#define PIN_SDA 4
#define PIN_SCL 15
#include <SoftWire.h>
SoftWire sw(PIN_SDA, PIN_SCL);
//...
Saludos
Te sirvió? Bien, me alegro haberte ayudado.
Saludos
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.