No funciona este código

#1
Buenas:

Uso Arduino UNO r3 y el LCD keypad Shield FD Robot.
Código:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
byte smiley[8] = { B00000, B10001, B00000, B00000, B10001, B01110, B00000 };  

void setup() {
        lcd.createChar(0, smiley);
        lcd.begin(16, 2);          
        lcd.write(0);
}

void loop() {}
No interpreto los mensajes de errores que me dice Arduino IDE 1.5.7.

LCD_5.1.ino: In function 'void setup()':
LCD_5.1.ino:8:20: error: call of overloaded 'write(int)' is ambiguous
LCD_5.1.ino:8:20: note: candidates are:
In file included from LCD_5.1.ino:1:0:
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\src/LiquidCrystal.h:82:18: note: virtual size_t LiquidCrystal::write(uint8_t)
virtual size_t write(uint8_t);
^
In file included from C:\Program Files (x86)\Arduino\libraries\LiquidCrystal\src/LiquidCrystal.h:5:0,
from LCD_5.1.ino:1:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*)
size_t write(const char *str) {
^
¿Alguna ayudita?

Saludo.
 
#2
El mensaje de error dice que el método lcd.write() está definido en dos sitios distintos: en Print.h y LiquidCrystal.h, por lo que no sabe por cuál decidirse.
 
#3
Hola:

Pues si, me acabo de dar cuante que el 13 está demás.

http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)

No hace falta.

Probando códigos, no usar el 0, solo a partir del 1 es cuando funciona.

Código:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte smiley[8] = {0x10,0x1e,0x2,0x1e,0x10,0x1f,0x0}; 
byte alta[8] = {0x1,0x3,0xf,0xf,0xf,0x3,0x1};
byte voz[8] = {0x8,0x10,0x0,0x18,0x0,0x10,0x8};
byte vacio[8] = {0x17,0x11,0x17,0x14,0x17,0x0,0x1f,0x0};

void setup() {
        lcd.createChar(1, smiley);          
        lcd.createChar(2, alta);    
        lcd.createChar(3, voz); 
        lcd.createChar(4, vacio);
        lcd.begin(16, 2);     
        lcd.setCursor(0,0);
        lcd.write(1); 
        lcd.setCursor(1,0);
        lcd.write(2);
        lcd.setCursor(2,0);
        lcd.write(3);
        lcd.setCursor(6,0);
        lcd.write(4);
     //   lcd.clear();
}

void loop() {
  /*      
  lcd.setCursor(1,0);
        lcd.write(2);
        lcd.setCursor(2,0);
        lcd.write(3);
        delay(1000);
        lcd.setCursor(1,0);
        lcd.write(4);
        lcd.setCursor(2,0);
        lcd.write(4);
        delay(1000);
        */
}
Aquí me funciona el 0.
Código:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
};

void setup() {
  lcd.createChar(0, smiley);
  lcd.begin(16, 2);  
  lcd.write(byte(0));
}

void loop() {}
Por lo que se ve, hay que sustituir el write(0); por write(byte(0));
En cambio el write(1); no hace falta sustituirlo por write(byte(1));

http://arduino.cc/en/pmwiki.php?n=Reference/LiquidCrystalCreateChar

Por fin lo entiendo. Puedo hacer los dibujos que me de la gana.



:D:D:D:D:D:D:D:D
 
#4
Lo pone en la documentación de createChar():

«When referencing custom character "0", if it is not in a variable, you need to cast it as a byte, otherwise the compiler throws an error. See the example below».

Entonces, sí que puedes redefinir y escribir el carácter 0 si usas el cast byte(), o utilizas una variable:

PHP:
byte caracter = 0;

lcd.createChar(caracter, smiley);

lcd.write(caracter);
Puedes incluso reunir a los caracteres que quieres redefinir en una única variable:

PHP:
byte caracteres[][8] = {
    {0x10,0x1e,0x02,0x1e,0x10,0x1f,0x00,0x00},  /* 0 : smiley */
    {0x01,0x03,0x0f,0x0f,0x0f,0x03,0x01,0x00},  /* 1 : alta */
    {0x08,0x10,0x00,0x18,0x00,0x10,0x08,0x00},  /* 2 : voz */  
    {0x17,0x11,0x17,0x14,0x17,0x00,0x1f,0x00}   /* 3 : vacio */
};

for(byte i = 0; i < 4; i++) {
    lcd.createChar(i, caracteres[i]);
}
 
#6
También se puede poner en forma binaria, para que sean más fáciles de editar:
PHP:
byte caracteres[][8] = {
    {                        /* 0 : superdos */
        B10000,
        B11110,
        B00010,
        B11110,
        B10000,
        B11111,
        B00000,
        B00000
    },
    {                        /* 1 : altavoz */
        B00001,
        B00011,
        B01111,
        B01111,
        B01111,
        B00011,
        B00001,
        B00000
    },
    {                        /* 2 : altavoz ON */
        B01000,
        B10000,
        B00000,
        B11000,
        B00000,
        B10000,
        B01000,
        B00000
    },
    {                        /* 3 : superdoce */
        B10111,
        B10001,
        B10111,
        B10100,
        B10111,
        B00000,
        B11111,
        B00000
    }
};
Y luego, si el compilador lo soporta, se puede usar enum para hacer más fácil la identificación de los caracteres en el programa:
PHP:
enum nombres {
    SUPERDOS = 0,
    ALTAVOZ,
    ALTAVOZ_ON,
    SUPERDOCE
};
lcd.createChar(ALTAVOZ, caracteres[ALTAVOZ]);   /* crear */
lcd.write(byte(ALTAVOZ));                       /* usar  */
 
Última edición:
Arriba