Char array OLED

Hola como estan! recurro a uds porque no he podido hacer algo que aparentemente es muy basico, lo cual es mostrar en un oled de 1.3” un char pero tomandolo desde un array, actualmente tengo que poner varias lineas para cada letra, la idea del codigo es mostrar una letra a la vez en maximo tamaño de la pantalla, y de forma “manual” si puedo hacerlo pero se alarga ucho el codigo y no es lo ideal, la parte del codigo para sacar el caracter por el oled es este:

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

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 5, 4);


//CONFIGURACIÓN
void setup() {
  u8g2.begin();
}

//FUNCIÓN LOOP
void loop() {
 
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_logisoso54_tf);
  u8g2.drawStr(48, 57, "E"); //(H,V)
  u8g2.sendBuffer();
  delay(700);

}

y asi uno tras otro para nuevas letras, probe de muchas formas un char array, pero sin resultados, al no poder usar un array no puedo optimizar lineas de codigo con un loop for, alguna idea de como hacerlo? esto es para un arduino uno.

¿Dónde están los datos?

Has probado

char texto[] = "Hola";
...
u8g2.drawStr(48, 57, String(texto[0]));

por ejemplo?

Acá lo tienes, no se si es exactamente lo que buscas pero una buena aproximación.

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

// Display SSD1306 por I2C (ajusta según tu pantalla)
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

// Array de textos a mostrar
const char* textos[] = {
  "HELLO",
  "WORLD",
  "NOISE",
  "TEST",
  "ARDUINO"
};

const int totalTextos = sizeof(textos) / sizeof(textos[0]);
int indice = 0;
unsigned long ultimoCambio = 0;
const unsigned long intervalo = 1000; // cambiar cada 1s

void setup() {
  u8g2.begin();
  u8g2.setFont(u8g2_font_6x12_tr);
}

void loop() {
  unsigned long ahora = millis();

  if (ahora - ultimoCambio >= intervalo) {
    ultimoCambio = ahora;
    indice++;
    if (indice >= totalTextos) indice = 0;
  }

  u8g2.clearBuffer();
  u8g2.drawStr(0, 30, textos[indice]);
  u8g2.sendBuffer();
}

Ajusta a tu OLED. Me refiero a la línea que lo indentifica

1 Like

Hola, si he hecho pruebas similares, pero no funciona, en especifico el ejemplo tuyo no compila por la linea

 u8g2.drawStr(48, 57, String(texto[0]));

@subryte escribio esa misma linea pero sin el “string” que es como lo hacia yo, y si compila, pero no se muestra nada en pantalla

Gracias por tu respuesta, con tu ejemplo resulto, la verdad el problema era simplemente la coma, entre los caracteres, estaba embobado poniento el texto junto y no lo hice como siempre cuando uno trabaja variables digitales, por eso no ponia la coma, de todas formas use un bucle for con delay, en lugar de los millis, pero ya puedo direccionar bien los caracteres.

EDIT: increiblemente con el cambio baje muchas lineas de codigo porque eran como 12 letras, bajo 1% almacenamiento del programa y subi 1% en ram, con esto deduzco que el compilador lo hace bien, como codigo es mas facil de modificar claramente, pero en temas de espacios de memoria es practicamente lo mismo y en este caso hasta peor por la ram.

Por eso te dije que lo probaras porque yo no podía hacerlo (aunque dudaba que fuese la solución).

Muy bueno que lo resolviste. :clap:

No confundas Strings con const char no son lo mismo aunque pueden intercambiarse.

Este es un ejemplo que encontré por ahi

String miObjetoString = "Mi texto de ejemplo"; // Crea un objeto String
const char* miConstCharPtr; // Declara un puntero a un carácter constante

miConstCharPtr = miObjetoString.c_str(); // Convierte el String a const char*

// Ahora puedes usar miConstCharPtr en funciones que requieran un const char*
Serial.println(miConstCharPtr);

Gracias por esa aclaración, probablemente por eso no tenía éxito.