Contador con display SSD1306

Hola a todos.

Situación: Estoy realizando un contador para un juego de cartas (MTG) el cual debe expresar en un display SSD1306 dos campos (dos valores independientes) los cuales variaran según las pulsaciones de dos grupos de pulsadores -valga la redundancia-.
Uno de los campos tiene como condición que sus valores oscilen entre 0 y 99 y el segundo campo tiene como condición que sus valores oscilen entre 0 y 10.
Ambos campos se tienen que mostrar en simultaneo en el display y no pueden alterarse entre ellos.

Aviso: Soy super novato con Arduino, literalmente hace dos días vengo buscando información y modificando ejemplos de códigos para lograr algo parecido a lo que quiero.

Problemas:
1: Arduino me tira error al configurar el segundo campo (el de 0 a 10). El programa da a entender el siguiente problema: >>'estVenActual' does not name a type<<
en este caso incorporé dos "bool" para guardar el valor del estado logico anterior del pulsador, pero me causa conflicto. Sera que no es necesario dos pares de bool?

2: No se como imprimir en pantalla ambos campos simultáneamente.

Agradezco cualquier ayuda en mi aprendizaje.

Desde ya muchas gracias.

#include <Adafruit_SSD1306.h>   // libreria para controlador SSD1306
//------- pantalla
#define ANCHO 128     // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64       // reemplaza ocurrencia de ALTO por 64
//------- configuracion reset
#define OLED_RESET -1      // necesario por la libreria pero no usado. -1 porque tiene boton
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);  // crea objeto

//------- Declaraciones vida
int valor_actual = -1; // valor inicial -1 para inicializar antes de contar
int pulsador = 4; // pin en donde se conecta el pulsador
int despulsador = 3; // pin en donde se conecta el pulsador
//------- Declaraciones veneno
int valor_actual_veneno = -1; // valor inicial -1 para inicializar antes de contar
int pulsador_veneno = 6; // pin en donde se conecta el pulsador
int pulsador_veneno_negativo = 5; // pin en donde se conecta el pulsador
//vida
bool estPulActual = 1; // variable donde se guarda el estado logico actual del pulsador
bool estPulAnterior = 1; // variable donde se guarda el estado logico anterior del pulsador
//veneno
bool estVenActual = 1; // variable donde se guarda el estado logico actual del pulsador
bool estVenAnterior = 1; // variable donde se guarda el estado logico anterior del pulsador

//----------- comienzo setup

void setup() {
  pinMode(pulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(despulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(pulsador_veneno, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(pulsador_veneno_negativo, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  delay(100);  // se da una espera de 100ms para que el display inicie correctamente
  Wire.begin();         // inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
  oled.setRotation(0);  // se escoje la orientacion del display puede ser 0, 1, 2 o 3
  oled.setTextColor(WHITE);  // se le dice a la pantalla que el texto que se va a desplegar es en color blanco
  oled.dim(false); //dejamos el brillo en maximo
}

void loop() {

  //.........................................VIDA.....................................................................................
  //SUMA vida
  estPulActual = digitalRead(pulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if ((estPulAnterior == 1 && estPulActual == 0) || valor_actual == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual++; // suma 1 al valor de la variable contador
    if (valor_actual > 99) { // si el contador supera 99
      valor_actual = 0; // devuelve el contador a 0

    }

    oled.clearDisplay();      // limpia pantalla
    oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
    oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
    oled.setTextSize(2);      // establece tamano de texto en 2
    oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
    oled.print(valor_actual);     // escribe texto
    oled.display();     // muestra en pantalla todo lo establecido anteriormente
  }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior = estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior


  //RESTA vida

  estPulActual = digitalRead(despulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if ((estPulAnterior == 1 && estPulActual == 0) || valor_actual == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual--; // resta 1 al valor de la variable contador
    if (valor_actual < 0) { // si el contador supera 99
      valor_actual = 99; // devuelve el contador a 0

    }

    oled.clearDisplay();      // limpia pantalla
    oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
    oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
    oled.setTextSize(2);      // establece tamano de texto en 2
    oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
    oled.print(valor_actual);     // escribe texto
    oled.display();     // muestra en pantalla todo lo establecido anteriormente
  }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior = estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior
}

//.................................................................Final VIDA................................................................

//..................................................................VENENO.....................................................
//SUMA veneno
estVenActual = digitalRead(pulsador_veneno); //se lee el valor logico del pin de entraday se guarda en la variable estVenActual
if ((estVenAnterior == 1 && estVenActual == 0) || valor_actual_veneno == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
  valor_actual_veneno++; // suma 1 al valor de la variable contador
  if (valor_actual_veneno > 10) { // si el contador supera 10
    valor_actual_veneno = 0; // devuelve el contador a 0

  }

  oled.clearDisplay();      // limpia pantalla
  oled.drawRect(31, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
  oled.setCursor(34, 25);   // ubica cursor en coordenadas 34,25
  oled.setTextSize(2);      // establece tamano de texto en 2
  oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
  oled.print(valor_actual_veneno);     // escribe texto
  oled.display();     // muestra en pantalla todo lo establecido anteriormente
}
delay(20); //pausa de 20 milisegundos
estVenAnterior = estVenActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estVenAnterior


//RESTA veneno

estVenActual = digitalRead(pulsador_veneno_negativo); //se lee el valor logico del pin de entraday se guarda en la variable estVenActual
if ((estVenAnterior == 1 && estVenActual == 0) || valor_actual_veneno == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
  valor_actual_veneno--; // resta 1 al valor de la variable contador
  if (valor_actual_veneno < 0) { // si el contador menor a 0
    valor_actual_veneno = 10; // devuelve el contador a 10

  }

  oled.clearDisplay();      // limpia pantalla
  oled.drawRect(31, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
  oled.setCursor(34, 25);   // ubica cursor en coordenadas 34,25
  oled.setTextSize(2);      // establece tamano de texto en 2
  oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
  oled.print(valor_actual_veneno);     // escribe texto
  oled.display();     // muestra en pantalla todo lo establecido anteriormente
}
delay(20); //pausa de 20 milisegundos
estVenAnterior = estVenActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior
}


//..................................................................VENENO final..................................................................

1- Te sobra esta llave

}

//........... .......Final VIDA..

2- Con eso no te puedo ayudar. :man_facepalming:t2:

Saludos

1 Like

PUnto 2 ya que el 1 te lo resolvió @anon90500195.
Porque no especificas cual es la instruccón que presenta la información y cuales son dos variables que quieres mostrar.

NOTA:
Usa etiquetas como bien has hecho al mostrar tu código, aunque sea solo 1 línea de código.

1 Like

Hola, y gracias por responder.

Como se puede ver en el código hay dos contadores (up/down), uno denominado "Vida" y otro "Veneno" y lo que me gustaría aprender es como imprimir ambos en la pantalla al mismo tiempo para poder visualizarlos, ya que en la actualidad no lo he logrado hacer.

Saludos.

Hola, y gracias por responder.

No he podido verificar lo de la llave, pero de ser así, muchas gracias!

Saludos!

Respecto al segundo punto, y según el punto de vista de cada cual, ya lo estas haciendo. Lo que no haces es modificar ambos campos simultáneamente, eso no se puede, el AVR del arduino va pasito a pasito y siempre modificara uno antes que otro.

Veamos si te lo se explicar, por ejemplo la instruccion:

oled.print(valor_actual);  

No te esta escribiendo nada en pantalla, lo esta escribiendo en un búfer de memoria intermedio, para que lo entiendas como si fuera un " fotograma ", puedes dar decenas o cientos de ese tipo de ordenes para modificar el fotograma antes de imprimirlo realmente en la pantalla. Esta escritura la realiza la orden:

oled.display(); 

Que deja intacto el fotograma, que lo borramos con:

oled.clearDisplay();

Veamos tu codigo, (no me meto en si los if estanbien o no solo voy a referirme a los comandos de pantalla), basicamente tienes cuatro bloques de impresion casi iguales que dependen de los if , analicemos el primero, lo dicho para este vale para los otros tres.

oled.clearDisplay();      // limpia pantalla
    oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
    oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
    oled.setTextSize(2);      // establece tamano de texto en 2
    oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
    oled.print(valor_actual);     // escribe texto
    oled.display();     // muestra en pantalla todo lo establecido anteriormente

¿ Porque cambiar a WHITE en todos si no cambia ?, además lo tienes en el setup, quitaselo a todos.
Lo mismo ocurre con el cambio del tamaño del texto, no cambia nunca, quítalo y al setup.
¿ Porque el trabajo de borrar el fotograma y dibujar los rectángulos a cada vuelta del loop?, yo lo haría una vez solamente al final del setup:

  oled.clearDisplay();      // limpia pantalla
  oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
  oled.drawRect(31, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
} // Fin del setup

Con lo cual cada bloque de impresion me quedaria:

 oled.setCursor(x, y);   // ubica cursor en coordenadas x,y
 oled.print( variable );     // escribe texto
 oled.display();     // muestra en pantalla todo lo establecido anteriormente

Con esto solo se cambia la zona del fotograma afectada dejando intacto lo demás
¿ Entendiste mejor como funcionan estas pantallas?. Pregunta lo que quieras
Saludos.

1 Like

Eso te pasa porque borras todo el fotograma al imprimir uno de los valores, borras el anterior del búfer.

1 Like

Gon, muchas gracias por responder y aclararme un montón de dudas.

Respecto al porque de muchas de tus preguntas, no hay porque jajajaa, simplemente tomé un montón de líneas de código de la web y fuí probando que es lo que se veía en el display, realmente mis conocimientos en la materia son bastantes escasos y gracias a ustedes estoy logrando aprender.

Más tarde probaré los cambios y veré como sigue.

Desde ya muchas gracias por todo el conocimiento.

Saludos

Yo respondo suponiendo que imprimes los dos a la vez
Ajusta lo que corresponda

oled.clearDisplay();      // limpia pantalla
oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
oled.setTextSize(2);      // establece tamano de texto en 2
oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
char buffer[20];
sprintf(buffer, "%2d %2d", valor_actual, valor_actual_veneno);
oled.print(buffer);     // escribe texto
oled.display();     // muestra en pantalla todo lo establecido anteriormente
1 Like

Al imprimir el "char buffer [20]" sobrescribes, borras, la parte superior izquierda y la inferior derecha de los rectángulos.

1 Like

Bueno, que le busque la vuelta. Con eso imprime los dos.
Que haga los rectángulos mas grandes y listo.

1 Like

Buenas a todos nuevamente.

Antes de nada, disculpen la demora, mi trabajo impide tener mucho tiempo libre.

Siguiendo con mi problema, he probado cada una de sus posibles soluciones las cuales me han llevado a buen puerto.

Actualizacion:
Modifique mi codigo respecto a las sugerencias de gonpezzi y consegui que todo se logre imprimir en pantalla, pero surgio un nuevo problema, cada digito nuevo se sobreescribia sobre el anterior haciendo imposible reconocer que es lo que se muestra (adjunto imagen), ademas de que imprimio el logo de Adafruit (lo cual ni siquiera es la intención).


Luego de ese evento y viendome imposibilitado de resolverlo, modifique mi codigo incluyendo las recomendaciones de Surbyte, lo cual me permitio imprimir todo en pantalla a excepción del segundo rectangulo.

El codigo actualmente se encuentra asi:

//------- librerias
#include <Wire.h>      // libreria para bus I2C
#include <Adafruit_GFX.h>   // libreria para pantallas graficas
#include <Adafruit_SSD1306.h>   // libreria para controlador SSD1306
//------- pantalla
#define ANCHO 128     // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64       // reemplaza ocurrencia de ALTO por 64
//------- configuracion reset
#define OLED_RESET -1      // necesario por la libreria pero no usado. -1 porque tiene boton
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);  // crea objeto

//------- Declaraciones vida
int valor_actual = -1; // valor inicial -1 para inicializar antes de contar
int pulsador = 4; // pin en donde se conecta el pulsador
int despulsador = 3; // pin en donde se conecta el pulsador
//------- Declaraciones veneno
int valor_actual_veneno = -1; // valor inicial -1 para inicializar antes de contar
int pulsador_veneno = 6; // pin en donde se conecta el pulsador
int pulsador_veneno_negativo = 5; // pin en donde se conecta el pulsador
//vida
bool estPulActual = 1; // variable donde se guarda el estado logico actual del pulsador
bool estPulAnterior = 1; // variable donde se guarda el estado logico anterior del pulsador
//veneno
bool estVenActual = 1; // variable donde se guarda el estado logico actual del pulsador
bool estVenAnterior = 1; // variable donde se guarda el estado logico anterior del pulsador

//----------- comienzo setup

void setup() {
  pinMode(pulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(despulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(pulsador_veneno, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(pulsador_veneno_negativo, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  delay(100);  // se da una espera de 100ms para que el display inicie correctamente
  Wire.begin();         // inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
  oled.setRotation(0);  // se escoje la orientacion del display puede ser 0, 1, 2 o 3
  oled.setTextColor(WHITE);  // se le dice a la pantalla que el texto que se va a desplegar es en color blanco
  oled.dim(false); //dejamos el brillo en maximo
  oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
  oled.drawRect(31, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
}

void loop() {

  //.........................................VIDA.....................................................................................
  //SUMA vida
  estPulActual = digitalRead(pulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if ((estPulAnterior == 1 && estPulActual == 0) || valor_actual == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual++; // suma 1 al valor de la variable contador
    if (valor_actual > 99) { // si el contador supera 99
      valor_actual = 0; // devuelve el contador a 0

    }

    
    oled.clearDisplay();      // limpia pantalla
oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
oled.setTextSize(2);      // establece tamano de texto en 2
oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
char buffer[20];
sprintf(buffer, "%2d %2d", valor_actual, valor_actual_veneno);
oled.print(buffer);     // escribe texto
oled.display();     // muestra en pantalla todo lo establecido anteriormente

  }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior = estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior


  //RESTA vida

  estPulActual = digitalRead(despulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if ((estPulAnterior == 1 && estPulActual == 0) || valor_actual == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual--; // resta 1 al valor de la variable contador
    if (valor_actual < 0) { // si el contador supera 99
      valor_actual = 99; // devuelve el contador a 0

    }

    
    oled.clearDisplay();      // limpia pantalla
oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
oled.setTextSize(2);      // establece tamano de texto en 2
oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
char buffer[20];
sprintf(buffer, "%2d %2d", valor_actual, valor_actual_veneno);
oled.print(buffer);     // escribe texto
oled.display();     // muestra en pantalla todo lo establecido anteriormente
  }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior = estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior


//.................................................................Final VIDA................................................................

//..................................................................VENENO.....................................................
//SUMA veneno
estVenActual = digitalRead(pulsador_veneno); //se lee el valor logico del pin de entraday se guarda en la variable estVenActual
if ((estVenAnterior == 1 && estVenActual == 0) || valor_actual_veneno == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
  valor_actual_veneno++; // suma 1 al valor de la variable contador
  if (valor_actual_veneno > 10) { // si el contador supera 10
    valor_actual_veneno = 0; // devuelve el contador a 0

  }


  oled.clearDisplay();      // limpia pantalla
oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
oled.setTextSize(2);      // establece tamano de texto en 2

char buffer[20];
sprintf(buffer, "%2d %2d", valor_actual, valor_actual_veneno);
oled.print(buffer);     // escribe texto
oled.display();     // muestra en pantalla todo lo establecido anteriormente
}
delay(20); //pausa de 20 milisegundos
estVenAnterior = estVenActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estVenAnterior


//RESTA veneno

estVenActual = digitalRead(pulsador_veneno_negativo); //se lee el valor logico del pin de entraday se guarda en la variable estVenActual
if ((estVenAnterior == 1 && estVenActual == 0) || valor_actual_veneno == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
  valor_actual_veneno--; // resta 1 al valor de la variable contador
  if (valor_actual_veneno < 0) { // si el contador menor a 0
    valor_actual_veneno = 10; // devuelve el contador a 10

  }


  oled.clearDisplay();      // limpia pantalla

oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
oled.setTextSize(2);      // establece tamano de texto en 2
oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
char buffer[20];
sprintf(buffer, "%2d %2d", valor_actual, valor_actual_veneno);
oled.print(buffer);     // escribe texto
oled.display();     // muestra en pantalla todo lo establecido anteriormente
}
delay(20); //pausa de 20 milisegundos
estVenAnterior = estVenActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior
}


//..................................................................VENENO final..................................................................`

Si , no acerté antes, hasta que no enchufas a esos diablos no te das cuenta.
El logotipo te sale porque lo imprime la librería y no haces un clear en el setup.

Si antes de escribir un carácter deberías borrar el anterior con dos caracteres en blanco, pero con esta librería por mas que lo he intentado no hay manera. Tendrás que borrar la pantalla entera y dibujar todo de nuevo.
Y ya estamos como al principio, fíjate en tus if limpias todo y luego solo imprimes lo de la variable actual, dejando borrado lo de la otra, lo mismo te ocurre con el código de @Surbyte, imprimes las dos variables con el rectángulo de la actual pero no dibujas el rectángulo de la otra.
La solucion es que en cada if borres y dibujes todo o sacas la impresión de los if y haces una única al final del loop . Optando por esta ultima quedaria un codigo como sigue.


#include <Adafruit_SSD1306.h>   // libreria para controlador SSD1306
//------- pantalla
#define ANCHO 128     // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64       // reemplaza ocurrencia de ALTO por 64
//------- configuracion reset
#define OLED_RESET -1      // necesario por la libreria pero no usado. -1 porque tiene boton
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);  // crea objeto

//------- Declaraciones vida
int valor_actual = -1; // valor inicial -1 para inicializar antes de contar
int pulsador = 4; // pin en donde se conecta el pulsador
int despulsador = 3; // pin en donde se conecta el pulsador
//------- Declaraciones veneno
int valor_actual_veneno = -1; // valor inicial -1 para inicializar antes de contar
int pulsador_veneno = 6; // pin en donde se conecta el pulsador
int pulsador_veneno_negativo = 5; // pin en donde se conecta el pulsador
//vida
bool estPulActual = 1; // variable donde se guarda el estado logico actual del pulsador
bool estPulAnterior = 1; // variable donde se guarda el estado logico anterior del pulsador
//veneno
bool estVenActual = 1; // variable donde se guarda el estado logico actual del pulsador
bool estVenAnterior = 1; // variable donde se guarda el estado logico anterior del pulsador

//----------- comienzo setup

void setup() {
  pinMode(pulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(despulsador, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(pulsador_veneno, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  pinMode(pulsador_veneno_negativo, INPUT_PULLUP); //el pin pulsador es asignado como entrada
  delay(100);  // se da una espera de 100ms para que el display inicie correctamente
  Wire.begin();         // inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
  oled.setRotation(0);  // se escoje la orientacion del display puede ser 0, 1, 2 o 3
  oled.setTextColor(WHITE);  // se le dice a la pantalla que el texto que se va a desplegar es en color blanco
  oled.dim(false); //dejamos el brillo en maximo
  oled.setTextSize(2);      // establece tamano de texto en 2
  oled.clearDisplay();      // limpia pantalla 
}

void loop() {

  //.........................................VIDA.....................................................................................
  //SUMA vida
  estPulActual = digitalRead(pulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if ((estPulAnterior == 1 && estPulActual == 0) || valor_actual == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual++; // suma 1 al valor de la variable contador
    if (valor_actual > 99) { // si el contador supera 99
      valor_actual = 0; // devuelve el contador a 0
    }
  }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior = estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior


  //RESTA vida

  estPulActual = digitalRead(despulsador); //se lee el valor logico del pin de entraday se guarda en la variable estPulActual
  if ((estPulAnterior == 1 && estPulActual == 0) || valor_actual == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual--; // resta 1 al valor de la variable contador
    if (valor_actual < 0) { // si el contador supera 99
      valor_actual = 99; // devuelve el contador a 0
    }
  }
  delay(20); //pausa de 20 milisegundos
  estPulAnterior = estPulActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior


  //.................................................................Final VIDA................................................................

  //..................................................................VENENO.....................................................
  //SUMA veneno
  estVenActual = digitalRead(pulsador_veneno); //se lee el valor logico del pin de entraday se guarda en la variable estVenActual
  if ((estVenAnterior == 1 && estVenActual == 0) || valor_actual_veneno == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual_veneno++; // suma 1 al valor de la variable contador
    if (valor_actual_veneno > 10) { // si el contador supera 10
      valor_actual_veneno = 0; // devuelve el contador a 0
    }
  }
  delay(20); //pausa de 20 milisegundos
  estVenAnterior = estVenActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estVenAnterior


  //RESTA veneno

  estVenActual = digitalRead(pulsador_veneno_negativo); //se lee el valor logico del pin de entraday se guarda en la variable estVenActual
  if ((estVenAnterior == 1 && estVenActual == 0) || valor_actual_veneno == -1) { //valida si el pulsador ha cambiado de 1 a 0 ó si el contador esta en -1
    valor_actual_veneno--; // resta 1 al valor de la variable contador
    if (valor_actual_veneno < 0) { // si el contador menor a 0
      valor_actual_veneno = 10; // devuelve el contador a 10
    }
  }
  delay(20); //pausa de 20 milisegundos
  estVenAnterior = estVenActual; //el valor booleano actual del contador ya fue procesado asi que se guarda en la variable estPulAnterior

  //..........................................................Actualiza Pantalla................................................................
  oled.clearDisplay();      // limpia pantalla
  oled.drawRect(0, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
  oled.drawRect(31, 17, 30, 30, WHITE); // dibuja rectangulo X, Y, Pixel de alto , Pixel de ancho
  oled.setCursor(3, 25);   // ubica cursor en coordenadas 15,32
  oled.print(valor_actual);     // escribe texto
  oled.setCursor(34, 25);   // ubica cursor en coordenadas 34,25
  oled.print(valor_actual_veneno);     // escribe texto
  oled.display();     // muestra en pantalla todo lo establecido anteriormente
}


//..................................................................VENENO final..................................................................

En esta impresión final puedes usar los dos setCursor o una impresión de un buffer como te indico @Surbyte .
Saludos.

1 Like

Hermano, sos muy hábil.
Tu código es correcto, es justo lo que buscaba en este foro.
Muchas gracias gon.

Gracias Surbyte por tu código, me ayudo a entender varios aspectos del tema.
Gracias gatul por tu pronta y acertada respuesta en mi primer problema.

Tema terminado.

Buenas a todos.

En mi proyecto aparecen múltiples contadores que oscilan sus valores entre su máximo (dependiendo de que contar sea, su máximo puede ser 99, 21 ó 10) y su mínimo que es 0.

El problema y la razón por la cual acudo a ustedes es el siguiente: hay forma de expresar el valor "00" (doble cero)?

Quiero lograr que los valores se encuentren centrados en todo momento respecto a su figura geométrica y creo que obteniendo una forma de imprimir "00" seria lo mas practico.

Ejemplos de lo que digo:


Saludos

Deberías subir el código para poderte ayudar. Como posible claro que lo es pero necesitaríamos saber cómo estás imprimiéndolo.
Saludos.

1 Like

@kingabaaddon La respuesta es simple, imprimes "0" antes del número si es menor que 10.
En el código del otro post, fijate que puse un espacio detrás en esa situación porque con tu código original si bajabas un valor de "10" a "9" aparecía "90" porque no se borraba el "0".
Entonces, lo solucionas así

  if (contadores[0] < 10) oled.print("0");
  oled.print(contadores[0]);     // ** vida **
//  if (contadores[0] < 10) oled.print(" ");  esta linea se elimina

Lo mismo para el resto de los contadores

Te modifiqué el código en wokwi y de paso ajusté unos pixeles las coordenadas.

1 Like

Moderador
Cerré tu otro hilo porque incurres en un doble posteo o falta de información como la que @DanX3 justamente te reclama.
Al crear un nuevo hilo y no poner de donde viene lo que estas haciendo quien te responde no sabe que hay algo previo.
Asi que a pesar de que le diste Solucionado, el tema no lo esta.
Sigue con este problema hasta resolverlo al 100% y quienes te sigan tendrán toda la inforamación para responderte.

En lugar de trabajar con impresiones directas

oled.setCursor(34, 25);   // ubica cursor en coordenadas 34,25
oled.print(valor_actual_veneno);     // escribe texto
oled.display(); 

usa esto

char buffer[10];
oled.setCursor(34, 25);   // ubica cursor en coordenadas 34,25
sprintf(buffer, "%02d", valor_actual_veneno);
oled.print(buffer);     // escribe texto
oled.display(); 

claramente en este caso no parece ser la mejor opción pero si manejaras todas tus impresiones con un solo buffer, ganarías mucho en comodidad.
Creo habértelo puesto al comienzo de tu hilo pero lo desechaste.

Tal cual, si lo había hecho!!
No digo que se ajuste, dejé de seguir el hilo porque @anon90500195 y @gonpezzi te estaban guiando perfectamente.

1 Like

Hola DanX3, tienes toda la razón, mi error fue pensar que ya lo había hecho y no verifique posteriormente.
Gracias por responder a mi hilo.

gatul, que gusto verte de nuevo por acá.
Tendré en consideración tu comentario. Gracias!