Crear Menú de Opciones sin Librería

Hola y un cordial saludo para todos.

Emm. En muchas ocasiones las “librerías” forman parte (en mi opinión muy personal) del facilismo por el cual mi cerebro deja de preguntarse ¿Cómo consigo eso que necesito?

Seguramente en ese momento salimos a buscar una librería y… Ahí está; nos ha salvado una vez más.

¿Pero si en lugar de adaptarme a ella; hasta encontrar otra mejor que resuelva mi problema, hacemos el intento de crear una rutina desde cero?

Aquí les presento el MENU en CASCADA que les permitirá usarlo en cualquier micro controlador. Es de muy simple y básica programación siendo muy fácil adaptarlo a cualquier display en pocas líneas.

 // Menu Opciones con ARRAY
#include <U8g2lib.h>
#include <Keyboard.h>
#include <Mouse.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);

String navegax[3]={"Firefox","Google","Opera"};
String siteweb[4]={"Youtube","Taringa","Facebook","Instagram"};
String persona[3]={"Nom.Usuario","Clave","Nueva Clave"};
int columna=1;
int x=0;
String cadenax="";

void setup() {
     Serial.begin(9600);
     u8g2.begin();
     Keyboard.begin();
     pinMode(A0,INPUT_PULLUP); // Crs ARRIBA
     pinMode(A1,INPUT_PULLUP); // Tcl C
     pinMode(A2,INPUT_PULLUP); // Tcl B
     pinMode(A3,INPUT_PULLUP); // Tcl A
     pinMode(A6,INPUT_PULLUP); // Crs ABAJO
     pinMode(A7,INPUT_PULLUP); // Crs IZQUIERDA
     pinMode(A8,INPUT_PULLUP); // Tcl OK
     pinMode(A9,INPUT_PULLUP); // Tcl DERECHA
     
     u8g2.clearBuffer(); u8g2.setFont(u8g2_font_logisoso16_tr);
     u8g2.drawStr(8,29,navegax[0].c_str()); u8g2.sendBuffer();
}

void loop() {
     if (analogRead(A3)<500) {mostrando(navegax[0]); columna=1; x=0;} // Salir
     if (analogRead(A2)<500) {mostrando("2da B");}
     if (analogRead(A1)<500) {mostrando("3ra C");}

     if (analogRead(A0)<500) {x--; if (x>=0){mostrando(navegax[x]);}else{x=0;}}
     if (analogRead(A6)<500) {x++; if (x<=2){mostrando(navegax[x]);}else{x=2;}}
     if (analogRead(A8)<500) {mostrando(siteweb[0]); columna=2; x=0;}
     while (columna==2){
           if (analogRead(A0)<500) {x--; if (x>=0){mostrando(siteweb[x]);}else{x=0;}}
           if (analogRead(A6)<500) {x++; if (x<=3){mostrando(siteweb[x]);}else{x=3;}}
           if (analogRead(A8)<500) {mostrando(persona[0]); columna=3; x=0;}
           if (analogRead(A3)<500) {mostrando(navegax[0]); columna=1; x=0;} // Salir
           while (columna==3){
                 if (analogRead(A0)<500) {x--; if (x>=0){mostrando(persona[x]);}else{x=0;}}
                 if (analogRead(A6)<500) {x++; if (x<=2){mostrando(persona[x]);}else{x=2;}}
                 if (analogRead(A8)<500) {columna=2; x=0;}
                 if (analogRead(A3)<500) {mostrando(siteweb[0]); columna=2; x=0;} // Salir
           }
     }

     if (analogRead(A7)<500) {mostrando("IZQUIERDA");}
     if (analogRead(A9)<500) {mostrando("DERECHA");}
}

void mostrando(String cadenax){
     u8g2.clearBuffer();
     u8g2.drawStr(8,29,cadenax.c_str());
     u8g2.sendBuffer(); delay(250);
return;}

Aquí podés ver un corto video que muestra como se usa.

[Menú de Opciones con Arduino - YouTube] (Menú de Opciones con Arduino - YouTube)
Espero que sea de utillidad.

Todo muy bien pero debes avisar que por usar A8 en adelante esto es válido para un MEGA o DUE.
Además no entiendo para que usas analogRead() cuando puedes usar digitalRead con los mismos pines.
Hay diferencia de tiempo entre usar analogRead y usar digitalRead. Gran diferencia y puede ser relevante en un código.

Hola Surbyte.
A ver. No hace falta aclarar (porque como he expresado antes) la estructura del "programa" o sketch permite que se aplique sobre cualquier tipo de microcontrolador. ya que la fuerza del "algoritmo" radica en su estructura del como realizar la cascada. Te sugeriría mirar las propuestas que hay en la web acerca de este tema. y lo larguisimos programas que proponen con librerías incluidas; pero seguramente para vos es mejor pensar que muchos de los que frencuentamos estos espacios somos muy incapaces de proponer y compartir algoritmos que tiran a la basura una librería en unas cuantas líneas y encima que no esta realizada para un solo microcontrolador especifico.
Con respecto al empleo de un puerto analogico o digital. no merece respuesta alguna. te aprecio demasiado para hacerlo. Un cordial saludo

Con todo respeto, puede que el algoritmo sea interesante (fuerte no estoy seguro porque no se como se comporta si se pulsan dos botones a la vez) pero cuando veo esto

pinMode(A0,INPUT_PULLUP);

y luego esto

if (analogRead(A0)<500) {

se me van las ganas de seguir leyendo, por lo que se malogra el esfuerzo y tiempo que has empleado en desarrollarlo (en mi humilde y personalísima opinión).

Creo que anteriormente tanto @Surbyte como yo te habíamos hecho notar el error de leer pulsadores de forma analógica. Es más lento porque cada lectura demora 18 useg en promedio solo a nivel del conversor, gasta mas recursos porque cuentas con uno o dos conversores solamente por lo que las entradas son forzosamente multiplexadas, y consume más memoria de programa porque por cada analogRead() el compilador genera varias decenas de instrucciones (entre ellas deshabilitar las resistencias pull-up que tu código habilita injustificada e innecesariamente para una lectura analógica), todo eso para leer algo tan simple como un pulsador que solo puede entregar dos estados, 1 ó 0, a los que se accede con un simple digitalRead().

A pesar de que entiendo la idea en general, me parece que has errado en la presentación, hablar de "facilismo" por usar librerías y luego en tu código incluir tres, bueno... Como que te contradices.

Usar librerías no es facilismo, con ese criterio seguiríamos programando en assembler, porque programar en C seria facilismo y no lo es, es practicidad, es no perder tiempo de desarrollo en tratar de reinventar la rueda. Aunque por supuesto, nada ni nadie lo impide.

Saludos

Probablemente las ondas irradiadas por el osciloscopio y el vapor del estaño no les permite a vos y surbyte saber (a esta altura) que significa “los quiero y respeto mucho” a ambos.

Y este cariño y respeto; es porque siempre. Siempre están ahí para sacarnos de la piscina cuando no logramos hacer pie.

Pero hoy me siento confundido. Que fibra toco un “simple” algoritmo que los hizo reaccionar de este modo.

Los argumentos que Uds. Han vertido los pone; no solo en evidencia sino demuestran que “algo les molestó”.

Las notas aclaratorias acerca de usar o no una librería son de mi “personal” experiencia y nunca sobrevuela crítica alguna acerca de ellas. Pero nadie puede discutir lo importante que es cuidar los KB disponibles en la memoria de un ATmega. Lo que nos impide en muchos casos no “exagerar en las líneas de un Sketch”.

Pero aclaro que ME encontré (análisis sintáctico de la oración) “yo me encontré” con que para hacer una simple opción en cascada; empleaban muchas líneas. Citándome “basta ver lo que hay en la web y que proponen como solución”.

Que hice… tome un Arduino Nhduino UNO (que tengo para experimentar) y como analista de sistemas matriculado. Comencé con pines digitales (ahí está el por qué del INPUT_PULLUP); luego lo apliqué y sin display comencé con el (monitor serial) lo que demostró la robustez del algoritmo.

Luego le puse un display LCD 16x2 y terminé con un OLED 128x32. Lo que siguió demostrando lo versátil de su aplicación.

Pero que fibra tocó en mi, este posteo. Te lo explico también. Si observan “debajo” del Arduino 32U4 del video. Están los pines de un bluetooth HC05 y al costado tienen un Lector de MICRO SD (El que me salvaste los otros días diciéndome. “el SPI está en otros pines” ¿te acordás Gatul?; ya no tenía de donde sacar pines digitales y NO justificaba ponerle un PCF8574 para esta interface.

Ahora (enójense, ciérrenme la cuenta, no me saquen más de la pileta), es más borren el posteo; pero… ¿intervenir en un inocente posteo con estos argumentos? Realmente no lo puedo creer.

Que no te den ganas de seguir leyendo. Me recuerda algunas críticas teatrales del Clarín cuando pre juzgan una obra por los actores que están en las marquesinas del teatro de la Av. Corrientes.

Un cordial saludo; desde Gualeguaychú, E. Ríos; Argentina (país generoso si lo hay).

No, bajo ningún punto de vista puedes suponer que a alguien le provocó no se qué tu algoritmo, evidentemente no entiendes o prefieres hacerte el desentendido.

Descuida que por mi parte, esta va a ser la última intervención en cualquiera de tus temas así evitamos suspicacias y malos entendidos.

Por otro lado, también soy Analista de Sistemas, justamente por eso hice los comentarios que hice y te aclaré que de todos modos nada impide que reinventes la rueda, siempre es una opción válida, pero como Analista de Sistemas sabrás que reinventarla no va a mejorar ni optimizar el sistema "rueda".
Y para que no quede lugar a dudas, me refiero a la lectura de los pulsadores (no sea cosa que insistas con que hablo de tu algoritmo).

Lo que lamento, con toda sinceridad, es que no aproveches los conocimientos que puedes adquirir en el foro, no valoras la ventaja de que alguien, que ya lidió con eso, te marque un error y te explique con detalle las razones de dicho error.

Saludos

Mismo comentario que @anon90500195, a mi no me molestó nada..
No me gusta que se use analogRead donde puede usarse digitalRead y menos en Documentación donde se supone estamos enseñando.