Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?
20/08/2014 #1

Avatar de Meta

No funciona este código
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.
20/08/2014 #2

Avatar de JoaquinFerrero

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.
24/08/2014 #3

Avatar de Meta

Hola:

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

http://www.dfrobot.com/wiki/index.ph...KU:_DFR0009%29

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=Re...stalCreateChar

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



25/08/2014 #4

Avatar de JoaquinFerrero

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:

Código PHP:
byte caracter 0;

lcd.createChar(caractersmiley);

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

Código 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 04i++) {
    
lcd.createChar(icaracteres[i]);

25/08/2014 #5

Avatar de Meta

Muy bueno, unir todo esos bytes en una sola variable.
25/08/2014 #6

Avatar de JoaquinFerrero

También se puede poner en forma binaria, para que sean más fáciles de editar:
Código 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:
Código PHP:
enum nombres {
    
SUPERDOS 0,
    
ALTAVOZ,
    
ALTAVOZ_ON,
    
SUPERDOCE
};
lcd.createChar(ALTAVOZcaracteres[ALTAVOZ]);   /* crear */
lcd.write(byte(ALTAVOZ));                       /* usar  */ 
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.