LCD con Arduino

Hola muy buenas, soy un nuevo Arduinista, hoy mismo he recibido mi placa duemilanove y algunas cositas más:
-Una Pantalla LCD de 16X2 GDM1602K
-Un servo...
Ahora mismo me encuentro intentar hacer el típico hola mundo con el LCD, pero no la consigo poner en funcionamiento he probado varias cosas, he visto mucho tutoriales de conexión. pero nada, no se si es la pantalla que me ha salido mala.
Aquí dejo el conexionado que he utilizado:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup() {
    lcd.begin(16, 2);
    lcd.print("hello, world!");
}

void loop() {
}

Como vereis el contraste no lo he conectado a nada, pero en las pruebas lo he puesto directamente a 5v y luego a masa y en masa hace un indicio pero nada.

Como he leido en la libreria de LiquidCrystal.h:

  1. LiquidCrystal(rs, enable, d4, d5, d6, d7)
  2. LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
  3. LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
  4. LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
    Con esta última prueba lo he probado con la opción 2 como podéis observar en el código y el esquema.
    y nada ¿Alguna idea?

Un saludo.

Yo tarde en obtener resultados , hay que repasar las cosas cien veces
Mira mi post de entonces , espero que te ayude
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1262531462

Hola Sento

Yo ahora ando haciendo un reloj con termómetro y excepto algunas cosas que tengo que depurar ya funciona bastante bien, para representar la hora y la temperatura tengo un LCD de 20 x 4 que básicamente es igual que el tuyo en el esquema del que saqué la información en el pin 3 del LCD tenía un potenciómetro pero como no tengo le he puesto una resistencia de 1K, después de leer tu post se la he quitado y en la pantalla no se ve nada, así que creo que ahí puede estar el problema.
Lo que puedes hacer es cargar el ejemplo que viene con arduino, si te funciona pues haces tu programa, si no funciona revisa las conexiones, es el método de ensayo error que uso yo.

Suerte

hola yo hace poco he echo unas pequeñas practicas con un lcd y lo he publicado en un blog que estoy haciendo con mis practicas.
Por si quieres echarle un pistazo :http://robocodes.guiskas.com/2010/05/practica1-lcd-con-ldr/

Usa la función 1 ya que la lectura de la LCD no tiene mucha utilidad

Aqui te dejo el esquema de conexión que acabo de probar y que parece que funciona con el ejemplo del 'Hello World' de la LiquidCristal

Un saludo

Ante todo muchas gracias por contestar a todos tan pronto.

-Hola vic20: He probado lo que me has dicho y le he puesto de 5v a una resistencia de 1K al pin V0 del contraste y nada.

-Hola miguelec2007: He leído un poco por encima el post y me parece que lo conseguistes al poner el RW a masa, como en el esquema de Chiva.

-Hola Chiva: He puesto más o menos como lo tienes tu ahí, en el esquema saltandome lo del pin 13 con el pin y la resistencia (Que por cierto en la duemilanove el pin 13 no es el ledpin el que ya tiene la resistencia incorporada para un led?) que no entiendo para que está puesto. (Haaam viendo otra vez el circuito veo que es el hardware en sí de la duemilanove por que también está puesto el pulsador de reset y el led de PWR oki pues nada, he probado tal y como lo tienes ahí y nada.
¿Tendrá algo que ver, con el no haber conectado los 2 ultimos pines (A, K)?
He comprobado con el polimetro en continuidad para ver si es que había realizado mal las soldaduras del LCD y parece que no.

Un saludo. y muchas gracias!

Otra cosa que se me acaba de ocurrir, es que no todos los LCD tienen el mismo patillaje de salida, aunque sean el HDnoseque, mirate la hoja de características para estar seguro.

Un saludo

Prueba con la libreria lcd4bits , A y K son la retroiluminacion

Ahora luego cuando tenga un rato probaré al librería lcd4bits.
En cuanto a la hoja de características es esta:

Bueno despues de varias pruebas he decidido pasarme y comprarme un potenciometro de 10k y al final era eso. en un extremo del contraste está todo negro y en el otro extremo todo blanco, así que si no lo ajustas manualmente con un potenciometro no ves nada.
Un saludo a todos y muchas gracias por la ayuda prestada!

Bonitos cables enrrollados y trenzados, jejeje

Un saludo

jejejeje para no liarme con tanto cablerio ;D

Y esta tarde que he tenido un ratito de Paz ya he probado mi servo-motor y ha funcionado de lujo!

Un saludo

Al final siempre lo conecto como un compañero del foro Igor R lo puso en el post que puso miguelec:

  • pin 1 Vss => Unido a masa
  • pin 2 Vdd => Unido a +5 voltios
  • pin 3 Vo => Poti de 10 Kohm (los otros dos extremos del poti a +5V y GND respectivamente)
  • pin 4 RS => Unido a pin 8 Arduino
  • pin 5 R/W => Unido a masa (no uso la opción de crear carácter)
  • pin 6 E => Unido a pin 9 Arduino
  • pin 7 DB0 => No conectado (control 4 bits)
  • pin 8 DB1 => No conectado (control 4 bits)
  • pin 9 DB2 => No conectado (control 4 bits)
  • pin 10 DB3 => No conectado (control 4 bits)
  • pin 11 DB4 => Unido a pin 10 Arduino
  • pin 12 DB5 => Unido a pin 11 Arduino
  • pin 13 DB6 => Unido a pin 12 Arduino
  • pin 14 DB7 => Unido a pin 13 Arduino
  • pin 15 A => Unido +5V a través de R=120 ohm
  • pin 16 K => Unido GND

En mi programa Arduino:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

Un saludo

Hola amigos estoy intentando con el arduino el LCD y 2 pulsador, interactuar entre todo esto.

Mi intención es que cuando pulso un pulsador aparezca en el LCD como que lo he pulsado. y cuando no pulso nada, pues eso, que aparezca otro texto.

El código que he escrito hace que me aparezcan caracteres en la pantalla pero que no paran de moverse muy locos.

Adjunto el código:

// Includes:
#include <LiquidCrystal.h>

// Ponemos en los pines las Entradas/Salidas:
const int pulsador1=0; /* Pin del pulsador 1 */
const int pulsador2=1; /* Pin del pulsador 2 */

//Constantes que cambiamos:
int Estadopulsador1=0;
int Estadopulsador2=0;

// LCD
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
  //Inicializamos el pulsador como salida
  pinMode(pulsador1, INPUT);
    //Introducimos el tipo de LCD que utilizamos
  lcd.begin(16, 2);
 
  // Escrimos en el LCD
  //*lcd.print("hello, world!");
  //Situar el cursor en la columna 0 y la fila 1
  //*lcd.setCursor(0,1);
  //*lcd.print("Prueba!!");
  
}

void loop() {
  Estadopulsador1 = digitalRead(pulsador1);
  Estadopulsador2 = digitalRead(pulsador2);
  
  if(Estadopulsador1 == HIGH){
    lcd.print("Pulsador1");
    }
    else{
      lcd.print("Nada pulsado");
      }
  if(Estadopulsador2 == HIGH){
    lcd.print("pulsador2");
   } 
    else{
      lcd.print("Nada pulsado");
      }
}

El código parece que tiene sentido ¿no?
Un saludo.

Así a primera vista, no has tenido en cuenta el rebote del pulsador

Un saludo

Usa una variable como FLAG o bandera de estado

Ejemplo:

int flag1;
int flag2;
int switchPin1 = 9;
int switchPin1 = 10;

void setup()
{
flag1 = 0;
flag2 = 0;
pinMode(switchPin1, INPUT);
pinMode(switchPin2, INPUT);
lcd.begin(16, 2);
}

void loop()
{

if ((digitalRead(switchPin1)==1) && (flag1==0))
{
//Se pulsa boton 1
lcd.clear();
lcd.setCursor(0,0);
lcd.print("BOTON 1 ");
flag1 = 1;
}
if ((digitalRead(switchPin1)==0) && (flag1==1))
{
//Se deja de pulsar boto 1
lcd.clear();
lcd.setCursor(0,0);
lcd.print("NO SE PULSA NADA");
flag1 = 0;
}
if ((digitalRead(switchPin2)==1) && (flag2==0))
{
//Se pulsa boton 2
lcd.clear();
lcd.setCursor(0,0);
lcd.print("BOTON 2");
flag2 = 1;
}
if ((digitalRead(switchPin2)==0) && (flag2==1))
{
//Se deja de pulsar boton 2
lcd.clear();
lcd.setCursor(0,0);
lcd.print("NO SE PULSA NADA");
flag2 = 0;
}
}

Espero te sirva.

Se puede optimizar el codigo, solo es para que veas que puedes usar una variable de estado.

Si lo que vas a hacer no tiene mucha necesidad de tiempo

// Includes:
#include <LiquidCrystal.h>

// Ponemos en los pines las Entradas/Salidas:
const int pulsador1=0; /* Pin del pulsador 1 */
const int pulsador2=1; /* Pin del pulsador 2 */

//Constantes que cambiamos:
int Estadopulsador1=0;
int Estadopulsador2=0;

// LCD
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() {
  //Inicializamos el pulsador como salida
  pinMode(pulsador1, INPUT);
    //Introducimos el tipo de LCD que utilizamos
  lcd.begin(16, 2);

  // Escrimos en el LCD
  //*lcd.print("hello, world!");
  //Situar el cursor en la columna 0 y la fila 1
  //*lcd.setCursor(0,1);
  //*lcd.print("Prueba!!");
  
}

void loop() {
  Estadopulsador1 = digitalRead(pulsador1);
  Estadopulsador2 = digitalRead(pulsador2);
  
  if(Estadopulsador1 == HIGH){
    lcd.print("Pulsador1");
    [glow]delay(5)[/glow]
    }
    else{
      lcd.print("Nada pulsado");
      }
  if(Estadopulsador2 == HIGH){
    lcd.print("pulsador2");
    [glow]delay(5)[/glow]
   }
    else{
      lcd.print("Nada pulsado");
      }
}

El valor del delay sería ir probando ya que depende de variables físicas asi que no se cual sería el correcto.

diablet69, tu código soluciona que al apretar el botón no se refresque la pantalla constantemente (que puede ser otro problema y que a lo mejor también tenga) pero el debouncing no lo soluciona. El ideal sería una una mezcla de los dos.

Si nos puedes decir cuando te salen los carácteres raros, mucho mejor, sin hacer nada, un momento al apretar el botón, mientras lo tienes apretado, etc.

Un saludo

Hola Chiva, le he puesto los delay(5); y nada.
¿Cuando pasa?:
Nada más conectar el USB se enciende todo y empiezan a correr las palabras por el LCD.
No hace falta que toque ningún pulsador para que no funcione.

Un saludo

He hecho otro código y he conseguido que me funcionara.

//Interactua con un pulsador el LCD
#include <LiquidCrystal.h>

const int pulsador1 = 1;                 //pulsador 1 al pin 1
const int pulsador2 = 2;                 //pulsador 2 al pin 2
int estado1 = 0;                         //inicializamos en 0
int estado2 = 0;                         //inicializamos en 0

LiquidCrystal lcd(8, 9, 10, 11, 12, 13); 

void setup() {
  
  pinMode(pulsador1, INPUT);             //Pulsador1 entrada
  pinMode(pulsador2, INPUT);             //Pulsador2 entrada
  lcd.begin(16, 2);                      //LCD de 16x2
  lcd.print("Esta pulsado:");            //imprimir en LCD
  }

void loop() {
  
  estado1 = digitalRead(pulsador1);      //leer pulsador1 y guardarlo en estado1
  estado2 = digitalRead(pulsador2);      //leer pulsador2 y guardarlo en estado2
  lcd.setCursor(0, 1);                   //Situar el curson en la columna 0 fila 1
  if (estado1 == HIGH) {                 //Si el pulsador 1 esta en "ON" imprimir 1
    lcd.print("1 ");
    delay(5);                            //Esperar 5mS
      }
      else {                           //Si no está pulsado
          if (estado2 == HIGH) {       //Si está pulsado pulsador2 imprime 2
          lcd.print("2 ");
          }
            else {                   //Si no está pulsado
          lcd.print("NO");             // imprime NO
        delay(5);                      //Esperar 5mS
    }
  }
}

Pd: Si cambio el:
const int buttonPina = 2;
Por:
const int buttonPina = 0;
y cambio el pulsador de pin al 0 no me va ¿El pin 0 del Arduino es un pin especial o algo? que no me funciona?

Un saludo

Como está escrito en la placa, los pines 0 y 1 son los que realizan las funciones de comunicación serie, por lo que a lo mejor si lo tienes conectado al PC pues influye algo, en teoría no debería pasar nada

Un saludo