Problema con display

Hola.

Estoy con un proyecto en el que necesito sacar información por un display lcd. Funcionaba perfecto en el Arduino UNO donde estaba haciendo las pruebas pero al conectarlo al Nano en el que va a estar solo se ven cuadrados. Vuelvo a quitar el Nano para poner el UNO y todo perfecto por lo que imagino que el código y el esquema están bien. Supongo que será algo de la propia placa que no permite hacerlo igual en ambas, pero no sé lo que es y los esquemas que encuentro por internet hacen lo mismo.

¿Alguien sabe qué puedo estar haciendo mal?
Muchas gracias de antemano.

Funcionalmente la Nano y la UNO son iguales.
Lo que funciona en la UNO funciona en la Nano.

Revisa las conexiones.

1 Like

No toco nada en las conexiones. Simplemente quito los cables y se los pongo al Nano. He probado con 2 protoboards y 2 nanos, pero en ambas me lo hace.



Hola,
postea el código para saber si podría haber algún problema.Si puedes, intenta conseguir un adaptador a I2C ya que simplificará las conexiones

1 Like

Hola, he cargado códigos de prueba, cuando llegue a casa los subo. Respecto a lo de I2C, la idea es conectar este Arduino a otro por I2C, si se puede conectar ambas cosas no sé hacerlo :sweat_smile:

Pero ese es un UNO R4, no es ni parecido al UNO R3, salvo el factor de forma y el pinout, aunque se supone que es compatible en cuanto al código.

Adjunta el código (lee las Normas si no sabes como hacerlo) a ver si hay algo que no sea tan compatible.

Pues tienes toda la razón. Acabo de volver a cargar el código de prueba y funciona, pongo el mío de nuevo y no va en el Nano y si en el UNO. El código es larguísimo porque es el menú del programa con el que me ayudaste el otro día (los Arduinos maestro-esclavos I2C a 15m de distancia), por lo que adjunto la parte donde ya sé que se pilla. Sé que así no es nada eficiente, pero solo estoy haciendo pruebas hasta que todo funcione y luego ya lo iré optimizando.

Por cierto, probé en un UNO r3 y tampoco funciona.

void recogeDatos(){ //Recoge los datos de los esclavos

  bucleInicial=true;

  Wire.beginTransmission(8);    //ESCLAVO Nº 8

  for(int x=0; x<array; x++){
    temporal[x]=Wire.read();    
  }

  Wire.endTransmission();

  if(temporal[pVerificableA]==verificable  &&  temporal[pVerificableB]==verificable  &&  temporal[pVerificableC]==verificable && temporal[pVerificableD]==verificable){
    juego[2]=temporal[2]; 
    juego[3]=temporal[3]; 
    menu[2]=juego[2];    
    menu[3]=juego[3];    
  }else{
    cInicial[0]=false;
  }

  for(uint8_t x=0; x<array; x++){     
    temporal[x]=juego[x];
  }

  delay(100);

  Wire.beginTransmission(9);    //ESCLAVO Nº 9

  for(int x=0; x<array; x++){
    temporal[x]=Wire.read();    
  }

  Wire.endTransmission();

  if(temporal[pVerificableA]==verificable  &&  temporal[pVerificableB]==verificable  &&  temporal[pVerificableC]==verificable && temporal[pVerificableD]==verificable){
    juego[9]=temporal[9]; 
    juego[10]=temporal[10]; 
    menu[9]=juego[9];    
    menu[10]=juego[10];    
  }else{
    cInicial[1]=false;
  }

  for(uint8_t x=0; x<array; x++){     
    temporal[x]=juego[x];
  }

  delay(100);

  Wire.beginTransmission(10);    //ESCLAVO Nº 10

  for(int x=0; x<array; x++){
    temporal[x]=Wire.read();    
  }

  Wire.endTransmission();

  if(temporal[pVerificableA]==verificable  &&  temporal[pVerificableB]==verificable  &&  temporal[pVerificableC]==verificable && temporal[pVerificableD]==verificable){
    juego[7]=temporal[7]; 
    juego[8]=temporal[8]; 
    menu[7]=juego[8];    
    menu[7]=juego[8];    
  }else{
    cInicial[2]=false;
  }

  for(uint8_t x=0; x<array; x++){     
    temporal[x]=juego[x];
  }

  delay(100);

  Wire.beginTransmission(11);    //ESCLAVO Nº 11

  for(int x=0; x<array; x++){
    temporal[x]=Wire.read();    
  }

  Wire.endTransmission();

  if(temporal[pVerificableA]==verificable  &&  temporal[pVerificableB]==verificable  &&  temporal[pVerificableC]==verificable && temporal[pVerificableD]==verificable){
    juego[5]=temporal[5]; 
    menu[5]=juego[5];    
  }else{
    cInicial[3]=false;
  }

  for(uint8_t x=0; x<array; x++){  
    temporal[x]=juego[x];
  }

  delay(100);

  Wire.beginTransmission(12);    //ESCLAVO Nº 12

  for(int x=0; x<array; x++){
    temporal[x]=Wire.read();    
  }

  Wire.endTransmission();

  if(temporal[pVerificableA]==verificable  &&  temporal[pVerificableB]==verificable  &&  temporal[pVerificableC]==verificable && temporal[pVerificableD]==verificable){
    juego[4]=temporal[4]; 
    menu[4]=juego[4];    
  }else{
    cInicial[4]=false;
  }

  for(uint8_t x=0; x<array; x++){  
    temporal[x]=juego[x];
  }

  delay(100);

  for(uint8_t x=0; x<nEsclavos; x++){       //Comprueba que todos los esclavos estén conectados
    if(cInicial[x]==false){                 //Sabe qué esclavos no están conectados
      bucleInicial=false;                   //Sabe que al menos un esclavo no está conectado
      cuentaErroresConexion++;              //Sabe el número de esclavos no conectados
    }
  }

} //recogeDatos()

¿Cambiaste la placa en el administrador de placas, no?

Si lo hiciste correctamente es evidente que el código no es 100% compatible con el ATmega328.

Si, lo cambié. Pero no encuentro qué puede ser por más que lo repaso. De hecho, lo programé pensando que iba a acabar en un Nano.

Piletazo.:

¿Probaste ajustar el contraste con el potenciómetro?

Si, hace lo mismo. Hacia la derecha se ven los cuadrados y al revés nada.

Maldición! Jaja

¿La librería LiquidCrystal es la que que se descarga desde el gestor y de Arduino o de otro autor o fuente?

¿Probaste el ejemplo HelloWorld de la librería?
Verifica que pines utiliza el ejemplo, puede que no coincidan con los que usas.

Es la biblioteca del gestor. Al poner el código de ejemplo si funcionan y son los mismos pines.

He encontrado el error y ahora me siento tremendamente estúpido :sweat_smile:

Resulta que estaba iniciando el dispositivo como maestro de la siguiente manera: "Wire.beginTransmission(0);" cuando la forma correcta sería: "Wire.begin(0);". Como misteriosamente funcionaba en los rev4, no presté atención a ese tipo de fallos. Ahora ya funciona. Pero tengo una duda sobre el sketch.

El mensaje que muestra al compilar indica un 64% de almacenamiento de programa y un 96% de la memoria dinámica. ¿Podría darme problemas utilizar un porcentaje tan alto de memoria?

He notado que no utilizas int y uint8_t de forma consistente.

Arduino Uno trabaja con 16 bits y Arduino 4 con 32.

Es posible que en otras partes del código que publicaste y después borraste haya algo (operaciones aritméticas, tal vez) que sea sensible a esta diferencia.

Qué versión de IDE utilizas?

Nop.
El ATmega328 del UNO R3 es de 8 bits no de 16.

1 Like

2.3.2

¿Cuál sería la forma correcta de escribir esos for para Arduino 3 y 4?

No es incorrecto como los has escrito, es una cuestión de gustos.
Por lógica se espera que uses un tipo de datos en los contadores (siempre que el rango de datos lo permita, claro).
Pero si en un for() usas byte y en otro int no está mal pero es deseable que uses uno u otro pero no ambos por una cuestión de claridad y consistencia.

Por ejemplo, en general uso byte (o sea *uint8_t) salvo que necesite contemplar valores negativos o que excedan el rango del byte (255).

1 Like