Mostrando entradas con la etiqueta LCD. Mostrar todas las entradas
Mostrando entradas con la etiqueta LCD. Mostrar todas las entradas

viernes, 21 de noviembre de 2014

Arduino: Temperatura con DS18B20 en display LCD (I2C)


COMO MEDIR LA TEMPERATURA coN EL DS18B20 EN UN LCD (gestionado mediante i2C)

En la anterior entortada del ds18b20, se mostraba la temperatura en el monitor serial, esto solo tiene la utilidad de ver que funciona bien, pero nada de practico.
El controlador del LCD, se puede ver en Controlador I2C para LCD
En el montaje muestro el valor de la temperatura en un LCD, controlado con I2C.
Se utilizan solo los pines 4 y 5 para el bus I2C.

Librerías necesarias:


  • <OneWire.h> 
  • <Wire.h>
  • <LCD.h>
  • <LiquidCrystal_I2C.h>  

Programa

/*******************************************
Prueba del funcionamiento del:
Sensor de temperatura DS18B20
con dispaly LCD I2C
Proyecto
ds18b20_i2c
  ** EA7TB **
www.ea7tb.com
*******************************************/
#include <OneWire.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

#define BACKLIGHT_PIN     7
#define  LED_OFF  0
#define  LED_ON  1
int DS18S20_Pin = 2; //DS18S20 Señal digital en digital 2

//Temperatura chip i/o
OneWire ds(DS18S20_Pin);
LiquidCrystal_I2C  lcd(0x20,4,5,6,0,1,2,3);
void setup(void) {
 
 Serial.begin(9600);
 lcd.begin (16,2);  // inicializo el LCD 20x4
  // Switch on the backlight
  lcd.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
  lcd.setBacklight(LED_ON);

  lcd.home();
 
  lcd.setCursor(0, 0);

  for(int i=0;i<16;i++) lcd.print("*");
  lcd.setCursor(0, 1);

  lcd.print(" Hola mundo   ");
  lcd.setCursor(0,2);
  delay(1000);
  lcd.clear();
}

void loop(void) {
 float temperatura = getTemp();
 Serial.println(temperatura);
 lcd.setCursor(0,0);
 lcd.print("temperaura:");
 lcd.print(temperatura);
 delay(500);

}


float getTemp(){
 //Da la temperatura esta ª

 byte data[12];
 byte addr[8];

 if ( !ds.search(addr)) {
 
   ds.reset_search();
   return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) {
   Serial.println("CRC no es valido!");
   return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) {
   Serial.print("No se ha reconocido el dispositivo");
   return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // comienza la converesion

 byte present = ds.reset();
 ds.select(addr);
 ds.write(0xBE);


 for (int i = 0; i < 9; i++) {
  data[i] = ds.read();
 }

 ds.reset_search();

 byte MSB = data[1];
 byte LSB = data[0];

 float tempRead = ((MSB << 8) | LSB);
 float TemperatureSum = tempRead / 16;

 return TemperatureSum;

}

martes, 27 de agosto de 2013

LCD Keypad Shield


Existe en el mercado la placa LCD Keypad Shield.

Es bastante cómoda de programar con pocas lineas tenemos
  • LCD 16x2
  • 7 pulsadores. Uno de ellos Reset.
Utiliza las lineas:
  • D4, D5, D6, D7, D8, D9
  • RST
  • VCC y GND.
Problemas.
De las dos placas que he probado,
  • Una de ella tenia mal el potenciómetro de contraste.
  • A las dos le faltabas la resistencia R1 de 1K y el led PWR.
  • Las resistencias para los pulsadores no son de muy buena calidad y he tenido que medir la tensión que entregaban para poder determinar el valor que debía de medir el conversor.
En código siguiente muestra el tiempo que lleva funcionando el arduino y la tecla que pulsamos.

#include <LiquidCrystal.h>
#include <Wire.h>
/*******************************************************

Este programa se utiliza para controlar el LCD Shield

********************************************************/

// seleccionar los pines usados por el lcd
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// define los valores utilizados por el panel y los botones.
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// leer los botones
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // leer el valor leido en el puerto A0

 if (adc_key_in > 1000) return btnNONE; //valor cuando no esta pulsado ningun boton
 // For V1.1 us this threshold
 if (adc_key_in < 50)   return btnRIGHT;
 if (adc_key_in < 250)  return btnUP;
 if (adc_key_in < 450)  return btnDOWN;
 if (adc_key_in < 600)  return btnLEFT;
 if (adc_key_in < 850)  return btnSELECT;




 return btnNONE;  // cuando falla, ira a ninguno.
}

void setup()
{
  Serial.begin(9600);
 lcd.begin(16, 2);              // Definir el lcd
 lcd.setCursor(0,0);
 lcd.print("Pulsa un boton");
}
 
void loop()
{
 lcd.setCursor(9,1);            // posiciona el cursor para indicar el tiempo
 lcd.print(millis()/1000);      // Muestra los segundos desde el comienzo


 lcd.setCursor(0,1);            // posiciona el cursor en la segunda linea.
 lcd_key = read_LCD_buttons();  // lee los botones

 switch (lcd_key)               // dependiendo del boton pulsado hara una accion
 {
   case btnRIGHT:
     {
     lcd.print("RIGHT ");
     Serial.println("RIGHT");
     delay(300);
     break;
     }
   case btnLEFT:
     {
     lcd.print("LEFT   ");
     Serial.println("LEFT   ");
     delay(300);
     break;
     }
   case btnUP:
     {
     lcd.print("UP    ");
     Serial.println("UP    ");
     delay(300);
     break;
     }
   case btnDOWN:
     {
     lcd.print("DOWN  ");
     Serial.println("DOWN  ");
     delay(300);
     break;
     }
   case btnSELECT:
     {
     lcd.print("SELECT");
     Serial.println("SELECT");
     delay(300);
     break;
     }
     case btnNONE:
     {
     lcd.print("NONE  ");
    delay(300);
     break;
     }
 }
}

jueves, 14 de febrero de 2013

Arduino: Modulo I2C LCD

El arduino están limitadas el numero de entradas y salidas.
Para aumentar dicho numero tiene implementado el Bus I2C. Con el podemos expandir el numero de periféricos utilizando solamente dos pines.

El modulo que se describe, es un interfase I2C para LCD.
  • Con solo dos lineas podemos gobernar un LCD compatible con el chip 44870.
  • Dirección del Bus 0x20 (no se puede modificar)
  • Transistor para la retro iluminación del LCD.
  • Potenciómetro de contraste.
  • Preparado para soldar directamente al LCD
Para utilizarlo es recomendable utilizar la librería LiquidCrystal_I2C.

Ejemplo para un dsiplay 16x4

/*******************************************
Prueba del funcionamiento del dispaly
Proyecto
LCD 16x4 I2c
  ** EA7TB **
www.ea7tb.com
*/
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> 

#define BACKLIGHT_PIN     7
#define  LED_OFF  0
#define  LED_ON  1


LiquidCrystal_I2C  lcd(0x20,4,5,6,0,1,2,3);

void setup()
{
  lcd.begin (16,4);  // inicializo el LCD 20x4
  // Switch on the backlight
  lcd.setBacklightPin(BACKLIGHT_PIN,NEGATIVE);
  lcd.setBacklight(LED_ON);

  lcd.home();
 
  lcd.setCursor(0, 0);

  for(int i=0;i<16;i++) lcd.print("*");
  lcd.setCursor(0, 1);

  lcd.print(" Hola mundo   ");
  lcd.setCursor(0,2);
  lcd.print("Display 16x4");
  lcd.setCursor(0, 3);
  for(int i=0;i<16;i++) lcd.print("*");
 
  delay(1000);
  lcd.clear();
}

void loop()
{
  lcd.setCursor(0,0);
  lcd.print("Proyecto");
  lcd.setCursor(0,1);
  lcd.print("LCD 16x4 I2C ");
  lcd.setCursor(0,2);
  lcd.print("  ** EA7TB **");
  lcd.setCursor(0,3);
  lcd.print("www.ea7tb.com");
  delay(5000);
 }


Una vez modificado el potenciómetro.