fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

pingüino con lcd
 
Avisos
Vaciar todo

pingüino con lcd

13 Respuestas
5 Usuarios
0 Reactions
17.3 K Visitas
residente
Respuestas: 213
Topic starter
(@residente)
Estimable Member
Registrado: hace 19 años

Hola, estoy probando un programa sencillo para familiarizarme con pingüino, pero no consigo que vaya bien, seguro es alguna tontería que por lo oxidado que estoy no me doy cuenta.
En el programa solo quiero mostrar las veces que le doy al pulsador, pero solo veo caracteres raros con este programa.
#define LCD_RS 8
#define LCD_E 9
#define led 14
#define entrada 13

void lcdPulseEnable() {
digitalWrite(LCD_E, HIGH);
delayMicroseconds(1);
digitalWrite(LCD_E, LOW);
delayMicroseconds(1);
}

void lcdWriteNibble(uchar c){
int i;
for(i=0; i<4; i++){
digitalWrite(4+i, (c >> i) & 0x01);
}
lcdPulseEnable();
}

void lcdWriteByte(uchar c, int mode) {
digitalWrite(LCD_RS, mode);
lcdWriteNibble(c >> 4);
lcdWriteNibble(c);
}

void lcdSendControl(uchar c) {
lcdWriteByte(c, LOW);
}

void lcdSendData(uchar c) {
lcdWriteByte(c, HIGH);
}

void lcdSetAddress(uchar line, uchar column) {
lcdSendControl( 0x80 + 0x40 * (line - 1) + (column - 1));
}

void lcdPrint(char *string) {
int i;
for( i=0; string; i++) {
lcdSendData(string);
}
}

void lcdInit() {
int i;

pinMode(LCD_E, OUTPUT);
digitalWrite(LCD_E, LOW);
pinMode(LCD_RS, OUTPUT);
digitalWrite(LCD_RS, LOW);
for(i = 4; i < 8; i++) {
pinMode(i, OUTPUT);
}
delay(20);
lcdWriteNibble(0x03);
delayMicroseconds(1);
lcdWriteNibble(0x03);
delayMicroseconds(1);
lcdWriteNibble(0x02);
delayMicroseconds(200);
lcdSendControl(0x28); // 4 Bit, 2 Lines
delayMicroseconds(1);
lcdSendControl(0x0C); // Display On
delayMicroseconds(1);
lcdSendControl(0x01); // Clear display
delay(2);
lcdSendControl(0x02); // Cursor home
delay(2);
}

void setup() {
lcdInit();
pinMode(13,INPUT);
pinMode(14,OUTPUT);
}

void loop() {

int j=0;
int dato=0;

lcdSetAddress(1, 1);
lcdPrint("GMZ010");
lcdSetAddress(2, 1);
lcdPrint(dato);

if (digitalRead(entrada)){
digitalWrite(led,HIGH);

}
else
digitalWrite(led,LOW);{
j++;
dato=j;
}

}

Espero vuestra ayuda.Gracias.

Responder
12 respuestas
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

Buenas, hace un tiempo publiqué unas librerías que servian para la LCD. No estaban terminadas al 100% pero funcionaban: http://foro.webdearde.com/viewtopic.php?f=19&t=3217&p=33961 " onclick="window.open(this.href);return false;

También creo que la última versión de pinguino incluye algo para LCD, ¿no?

Un saludo.

Responder
bastian
Respuestas: 384
(@bastian)
Ardero
Registrado: hace 17 años

Una cosa si que me parece rara... cuando defines la función lcdprint, lo haces con

void lcdPrint(char *string) {
int i;
for( i=0; string; i++) {
lcdSendData(string);
}
}

El parametro que necesita la función, según la definición es un puntero a un vector de caracteres, pero cuando llamas a la función en el loop para mostrar el número de pulsaciones ...
int j=0;
int dato=0;

lcdSetAddress(1, 1);
lcdPrint("GMZ010");
lcdSetAddress(2, 1);
lcdPrint(dato);//aquí puede estar el problema
el parametro que le pasas en un int... no una cadena...

Salu2!

Responder
sphinx
Respuestas: 651
(@sphinx)
Ardero
Registrado: hace 17 años

residente, solo un detalle.
En el código que has puesto, el último "else" de todos tiene una llave detrás de la instrucción "digitalWrite(led,LOW);" , cuando parece que debería estar antes. Si no te ha dado error al compilar, supongo que no será un problema. Solo lo comento por si acaso.
Por otro lado, no he experimentado con LCDs y Pinguino, lo siento.

Slds, Sphinx.

Responder
residente
Respuestas: 213
Topic starter
(@residente)
Estimable Member
Registrado: hace 19 años

Muchas gracias por las respuestas.
FJ_Sanchez, como dices la ultima versión de pingüino incluye ya una libreria lcd, he usado ese código por que es el que esta en los ejemplos de la wiky y las funciones están sin descripción todavía.
Bastian como el código de la lcd ha sido copiar y pegar, pues ni me fije en esas cosas, vi que funcionaba la lcd y se lo achacaba el error a la parte de la programación que yo hice.
Sphinx pues si que da error también por ese paréntesis, pero como cuando hay un error en pinguino salen 5000 lineas, pues no me di cuenta..
Ya he conseguido usar la librería lcd de pingüino, aunque como he dicho las funciones todavía están sin descripción en la wiky, pero bueno he conseguido mas o menos lo que buscaba, que era poder mostrar un numero, también me ha quedado claro el tema del cursor, ahora estoy intentando hacer que mi pulsador se comporte como un interruptor.
pongo el nuevo programa usando la libreria, se ha reducido bastante como era de esperar
char dato=0;
void setup(){
//8 bits mode
//lcd(8, 9, 0, 1, 2, 3, 4, 5, 6, 7); // RS, E, D0 ~ D7

//4 bits mode, dont use last four pins ...
lcd(8, 9, 0, 1, 2, 3, 0, 0, 0, 0); // RS, E, D4 ~ D8

//LCD format
lcd.begin(2, 0);

pinMode(13,INPUT);
pinMode(14,OUTPUT);
}

void loop()
{
// Output string
lcd.home();

lcd.setCursor(5, 0);//(columna,fila)
lcd.print("GMZ010");
lcd.setCursor(0, 1);
lcd.printNumber(dato,10);//el 10 es la base
}

Muchas gracias de nuevo, espero ir poniéndome al día con la programación de pingüino, que esto de no tener que sacar el micro es una maravilla, no el odioso t20.

Responder
Página 1 / 3
Compartir: