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;

}

Arduino: Temperatura con DS18B20

Como medir la temperatura mediante este sensor de 1 Wire.

Información sobre el integrado.

Para mas información sobre integrado lo podemos ver en el siguiente enlace: http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf



El patillaje es el mostrado en siguiente imagen.



El montaje con el arduino seria el siguiente:




Libreria necesarias:

Se necesita la librería OneWire, 
Que debe estar en el siguiente directorio:
  • MAC: (directorio personal)/Documents/Arduino/libraries
  • Win: Mis documentos/Arduino/libraries
  • LINUX: (directorio personal)/Documents/Arduino/libraries

Esta disponible en: http://playground.arduino.cc/Learning/OneWire

Programa:

Un pequeño programa para leer la temperatura.
#include <OneWire.h>

int DS18S20_Pin = 2; //DS18S20 Señal digital en digital 2

//Temperatura chip i/o
OneWire ds(DS18S20_Pin);

void setup(void) {
 Serial.begin(9600);
}

void loop(void) {
 float temperatura = getTemp();
 Serial.println(temperatura);
 delay(100);

}


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;

}