Go Down

Topic: 8 Switcher controlador de pedales de guitarra (Almacenar texto en LCD) (Read 310 times) previous topic - next topic

Renzo2314

Hola gente!! Soy nuevo en el foro pero llevo tiempo experimentando con arduino, bueno, el tema que me carcome el cerebro y no puedo resolver es el de almacenar un texto en la EEPROM de arduino (escrito a traves de un par de botones (ok, up, down, exit)), basicamente es un controlador para 8 pedales de guitarra, son 8 switches, 16 reles(2 por pedal/switch) que es programable, por ejemplo:

yo tengo un pedal de distorsion, uno de delay y uno de flanger, yo quiero que en el primer preset (switch 1) se active el de distorsion y delay, entonces primero se seleccionan los reles que estan conectados a dichos pedales (del 1 al 8 ), (a todo esto hay dos reles que intercambian entre modo relay, escribir y leer) el modo relay es el que te permite elegir que pedales queres que se activen, una vez hecho esto, se activa el rele de escribir, donde presiono el switch que quiero que se almacenen los reles que seleccione, y despues el modo leer, que es cuando ya estan grabados los presets en la EEPROM de arduino y cada vez que presiono el switch se ponen los efectos que yo habia configurado.

Todo muy bien hasta aca, ya esta funcionando y todo, el tema es cuando le quiero poner un lcd 8x2 para configurarlo de ahi y obviamente aporta mucha estetica tambien, el menu ya esta casi hecho, anda muy bien, cuando entras al estado S_RELAYMODE se prende el rele que activa el modo para seleccionar los reles,apretas ok y pasa al estado seleccionar switch, donde se activa el otro rele y pasa al estado S_ESCRIBIR, donde se selecciona el switch que queremos que almacene los reles que en el paso anterior habia prendido, (esta parte es la mas importante), despues pasa al estado S_PRESET, donde se escribira el nombre del preset por medio de los botones de navegacion, por ej:

    Caso1            Caso2             Caso3

    Preset            Preset             Preset
 Dist+delay     Dist+Flang       Distorsion


yo lo que no se como hacer es como guardar el texto que escribi en el LCD (Dist+delay) en la EEPROM junto con el switch y los reles que active en los pasos anteriores, y que cuando este en modo leer, en la pantalla aparezca el mensaje de inicio (estado: S_HOME) y abajo en la segunda linea el nombre de la combinacion que guarde, y que sea asi en todos los casos, por ejemplo:


Caso1: Reles 1; 2; activos, en Switch 1, Nombre: (Dist+delay) (Todo eso configurado desde el lcd con las teclas de navegacion)

Caso2: Reles 1; 3; activos, en Switch 2, Nombre: (Dist+Flanger)

Caso3: Reles 2; 5; activos, en Switch 3, Nombre (Limpio+Rverb)


 Y asi sucesivamente hasta el caso 8, aclaro que pueden ser combinados todos los reles que se requieran en cualquier switch, eso lo elegimos nosotros, el nombre tambien, espero que me puedan ayudar muchas gracias por su tiempo y les deseo suerte a todos! adjunto mi codigo                                                      

ArduMyth

funciones EEPROM (guarda, leer datos, etc)

Ya se ha explicado en otros hilos el tema de la memoria EEPROM y se han aportado enlaces a otras webs (por si te sirve)

De todas formas es copiar el ejemplo que trae EEPROM, no hay más.

Renzo2314

sii el tema es que no se bien como usarla, no se que comando es el correcto para recibir la info que se escribio en el display y guardarla en la eeprom, he leido de todo pero no logro comprenderla bien

surbyte

Explicate entonces.
POn un ejemplo donde se vea tu problema

Leyendo tu comentario inicial te digo:
1. No hace falta guardar un texto. Basta con guardar un número que represente ese texto.
Digamos que tienes 3 textos diferentes. entonces 0..1..2 representarán los 3 textos.
Los estados son 0 y 1
Asi que lo que tienes que guardar es poco.
Arma una estructura con todas las opciones y será muy facil hacerlo

Renzo2314

a ver si me explico mejor... me decis que solo basta con guardar un numero que represente ese texto, pero como hago para asignarle a esos numeros (0, 1, 2) el texto que se escribio? como hace arduino para saber que texto estoy escribiendo, por ejemplo si pones:

 EEPROM.write((addr) + i,digitalRead(relayPin));
 digitalWrite(ledPin, LOW);

estas grabando en la eeprom en tal direccion, la lectura de un pin, lo que yo no se como hacer, es que poner en ese contexto para que grabe un texto en la eeprom, soy nuevito con esto de la eeprom y no entiendo mucho, si te podes explicar con ejemplos mas adaptados a mi nivel de aprendizaje te lo agradeceria...

ArduMyth

Estas cosas no las entiendo por ningún lado. Ya tienes el ejemplo dado. Curiosamente en otro hilo de la EEPROM pasó exactamente lo mismo.

soy nuevito con esto de la eeprom
EEPROM.write((addr) + i,digitalRead(relayPin));
 digitalWrite(ledPin, LOW);

estas grabando en la eeprom en tal direccion, la lectura de un pin
No disculpa, acabas de poner la función de escritura y sabes qué datos son cada parámetro, por tanto la comprendes, lo que contradice no sólo tu duda sino que no entiendas a @surbyte ni que no sepas sustituir la información que guardas por otra variable.

Luego cuando dices:
[...] con ejemplos mas adaptados a mi nivel de aprendizaje te lo agradeceria
No hay ejemplos adaptados. Los ejemplos son los que se te han puesto. Si no los entiendes con ejemplos funcionales explicados y documentados no pidas más datos porque no los hay. Depende de ti.
¿Con un nivel bajo de matemáticas se te podría explicar hacer una derivada? ¿O antes tendrías que ir consiguiendo una base y tener ciertos conocimientos?

Pero aquí lo RARO es que entiendes lo que hace la función y sus parámetros y dices no sabes cómo funciona o cómo guardar un texto.
Luego hay dos caminos; o lo quieres hecho o bien estás copiando y pegando y realmente no sabes lo que haces.


Si estuviese equivocado por favor explica cómo entendiendo la función y los parámetros que pasas (lo explicaste tú mismo) no sabes cambiar el valor de un pin por cualquier otra cosa que quisieras...

Renzo2314

miren, hace 2 años que uso arduino y no tengo ningun curso ni nada de arduino ni conocimientos avanzados en programacion ni nada, simplemente soy un aficionado que por medio de arduino me gusta hacer proyectos que me sirvan a mi, se me dio esta unica duda y me cree una cuenta en el foro para ver si alguien me podia sacar esa duda, yo diria que antes de prejuzgar a alguien sea quien sea deberian averiguar un poquito mas antes de creer algo de esa persona no? aparte tratemos de contestar bien sin prejuicios, el codigo que yo publique es copiado y pegado de otros proyectos que YO hice/modifique (y de otras paginas que brindaban el codigo libremente para su uso y no para comercio) yo se usar el ide de arduino y todo, pero yo aprendi en base a videos de youtube, tutoriales, etc. simplemente me surgio esta duda por que hace 1 semana no sabia absolutamente nada de la eeprom, pero en ese tiempo hasta ahora aprendi que es y como se usa pero solo guardando los valores de los pines, pero hace una semana que la conozco, y me queme la cabeza durante esa semana para descifrar como tenia que hacer para guardar el texto que escribi lcd y hasta ahora no se todavia como hacerlo, aqui no hay nada raro, aqui me parece que todos comentan creyendo que todos saben todo, si sabes esto sabes lo otro, y no es asi, por algo es un foro para ayudar a quien lo necesite si les toca a ustedes en algun momento nos tocara a nosotros, para tu informacion quiero que sepas que el codigo del switcher lo copie de una pag y lo uni con un codigo que tenia para hacer el menu de una potencia de audio que hice yo, y ese codigo incluia el eeprom que yo sabia que era pero no tenia idea de como se usa, ahora comprendi un poquito mas, yo se bien lo que hago hermano y se bien que es lo que pregunto, si van a contestar con prejuicios o sin ganas preferiria que no contesten, es simplemente una duda que tengo y listo que tanta rareza, que tanto misterio, de que me sirve que "quiera todo hecho" si el codigo ya lo hice/modifique yo, lo unico que me falta es eso, lo que yo tampoco entiendo mucho es lo de los int, byte, const byte, y otras cosas que de a poco las ire aprendiendo, pero no hace falta que me reciban asi, yo ni sabia que habia otro hilo de la eeprom y que lo explicaban si soy nuevo en el foro no se dieron cuenta?... Y para tu informacion, no existen ninguno de esos dos caminos bro... Yo no tengo idea de si se puede cambiar en lugar de que sea un pin, cualquier otra cosa, NO LO SE! POR ESO ABRI EL HILO, pero ya esta, ya se que de algo no me queda duda que al que no sabe algo ya lo prejuzgan de que o no sabe nada y esta copiando y pegando o que lo quieren hecho, gracias por resolver mi duda chicos...

surbyte

Yo te pedí algo y no respondiste.
Necesitas pensar las cosas desde otro punto de vista

Á mi esto no me ayuda a pensar en un código.


Quote
Caso1: Reles 1; 2; activos, en Switch 1, Nombre: (Dist+delay) (Todo eso configurado desde el lcd con las teclas de navegacion)

Caso2: Reles 1; 3; activos, en Switch 2, Nombre: (Dist+Flanger)

Caso3: Reles 2; 5; activos, en Switch 3, Nombre (Limpio+Rverb)
Pero supongamos que sea el caso, veré que te puedo aportar.
Lo que haré será crear una estructura que facilmente podras guardar/leer con EEPROM.get y EEPROM.put y luego el resto lo sigues tu.
Por eso te pedia los textos pero es una tontería.

Lo hare con algo generíco y luego lo modifcas tu.

Por cierto.. no te enojes y te entiendo.
Tenemos mucha gente que viene al foro a pedir cosas, es dificil a veces darse cuenta si es tu caso o no, porque todos lucen igual. Todos piden y no muestran nada o lo que muestran es el copy & paste de algo que lo consigo en 2 segundos en Google.

Ahora ten un poco de paciencia y te daré un empujón y si no sirve ya me dirás.


ArduMyth

Por respeto a @surbyte y lo hablado edito lo que he puesto.
Me basta con leer que llevas dos años usando Arduino y no comprendes; byte, const, int.
Y que admites en este tiempo haber "editado" códigos.

Quizás no entiendas que eso puede chocar de frente con quienes tomamos la educación/formación y la programación de otra forma.

Normal tus dudas y aquí lo dejo. La ayuda te la dará @surbyte.
Lo de "bro" sí me sobraba.
Saludos.

Renzo2314

Gracias Surbyte por la comprension, entiendo eso de los que preguntan y no saben absolutamente nada por que vi hilos parecidos y son insoportables, pero primero antes de prejuzgar a todos deberian fijarse (a traves de que demuestren su conocimiento o haciendoles preguntas) para ver si realmente son sanguijuelas para que no se repita esto justamente.
Gracias de antemano por la ayuda Surbyte, lo que a mi me cuesta entender es como grabo el texto que escribi en el lcd en la eeprom, nada mas, se como guardar pines, pero no textos, y tampoco tengo idea si los textos se tienen que guardar como pines o no se, como se tenga que grabar, Gracias.

EDITADO

surbyte

No se si ya se leyo o no se leyó pero Terminado el tema enre ArduMyth y Renzo2314

Y Renzo2314 yo no tengo tiempo para estar averiguando el nivel de programación que tiene cada persona. Respondo 20 mensajes o mas diarios, tu crees que alguno de los 10 novatos que llegan van a tolerar que los interrogue de ese modo?

Vamos a tu problema y por favor, terminado el debate/discusión planteado.

Esto es lo que te he hecho que no se acercará totlamente a tu necesitadad pero te va a servir. Comence con seleccionar reles y pedales y luego me perdí porque no entiendo bien tu necesidad a falta de un código que nunca mostraste.
Es mas, ahora me doy cuenta que en muchas circunstancias casi ni respondo.. pero con la intención de que salgas del atasco y luego compartas lo que resuelvas, aca tienes.


Code: [Select]
#include <EEPROM.h>

#define RELE_INICIAL   20
#define CANT_RELES     16
#define PEDALINICIAL   2
#define CANT_PEDALES   8

const char *textos[3] = {"Distor", "Flager", "Delay"};

struct datos{
  byte pedal1;
  byte pedal2;
  byte swtich;
  unsigned long tiempo;
  char texto;
};

datos dpedal[3];
int eeAddress = 0; //EEPROM address to start reading from

void setup() {
  Serial.begin(9600);
  Serial.println("Inicio ");
  dpedal[0].pedal1 =  1;
  dpedal[0].pedal2 =  2;
  dpedal[1].pedal1 =  1;
  dpedal[1].pedal2 =  3;
  dpedal[2].pedal1 =  2;
  dpedal[2].pedal2 =  5;

  dpedal[0].tiempo =  5000;
  dpedal[1].tiempo =  5000;
  dpedal[2].tiempo = 10000;
                //012345678901234567890123456789
 
  dpedal[0].texto = 0;
  dpedal[1].texto = 1;
  dpedal[2].texto = 2;

  Serial.println("Datos inicializados antes de EEPROM put y get");
  printData(dpedal[0]);
  printData(dpedal[1]);
  printData(dpedal[2]);

  Serial.println("Datos almacenados en EEPROM.");
  eeAddress = 0;
  Serial.println("1er struct en direccion 0");
  EEPROM.put(eeAddress, dpedal[0]);
  eeAddress += sizeof(datos);
  Serial.println("2do struct en direccion " + String(eeAddress));
  EEPROM.put(eeAddress, dpedal[1]);
  eeAddress += sizeof(datos);
  Serial.println("3er struct en direccion " + String(eeAddress));
  EEPROM.put(eeAddress, dpedal[2]);

  Serial.println("Datos recuperados de EEPROM.");
  datos custom;
  eeAddress = 0;
  EEPROM.get(eeAddress, custom);
  printData(custom);
  eeAddress += sizeof(custom);
  EEPROM.get(eeAddress, custom);
  printData(custom);
  eeAddress += sizeof(custom);
  EEPROM.get(eeAddress, custom);
  printData(custom);

}// end setup

void loop() {
   
}

void printData(datos temp) {
    Serial.print("Pedal1 :");
    Serial.println(temp.pedal1);

    Serial.print("Pedal2 :");
    Serial.println(temp.pedal2);

    Serial.print("Delay :");
    Serial.println(temp.tiempo);

    Serial.print("Texto LCD :");
    Serial.println(textos[temp.texto]);
}


Este codigo crea una estructura bastante aproximada a tu necesidad.
pedal1 y pedal2 pueden cambiarse segun tu requerimiento. Veras que los inicializo como tu quieres.
tiempo es la variable que alojara eluso de millis() o sea tu análogo delay() pero no uses delay.
textos tiene las etiquetas que mostrará el LCD que puedes cambiar a gusto
y solo almacenamos un número que las direcciona. Todo muy simple para el almacenamiento.
Exactamente lo que te hemos dicho desde el comienzo.

Esto es algo que con prueba error y sin estrcutura, pudiste haber sacado con los ejemplos de get y put que son muy claros.

Ahora tienes otro que espero ayude.

Renzo2314

"Y asi sucesivamente hasta el caso 8, aclaro que pueden ser combinados todos los reles que se requieran en cualquier switch, eso lo elegimos nosotros, el nombre tambien, espero que me puedan ayudar muchas gracias por su tiempo y les deseo suerte a todos! adjunto mi codigo"
(abajo de eso deje mi codigo adjunto)
desde que publique el post que esta eso, ahi esta el codigo que hice yo, voy a ver si puedo hacer algo y despues comento si resulto


Go Up