Ir al contenido principal

► Sensor de temperatura DS1822 Y Arduino UNO

Sensor de Temperaura DS1822 y Arduino UNO

Materiales requeridos:
  • Arduino UNO 
  • Protoboard
  • Sensor de temperatura DS1822 Dallas (Ahora maxim)  (-55~125'C). (error ~2,0º)
  • Cables y resistencia de 4.7K
Diagrama de conexion de Sensor de temperatura DS1822 y Arduino

En este diagrama se mustra una manera de como conectar arduino con el sensor de temperatura DS1822 el cable negro va al pin de GND que seria nuestra tierra, el cable rojo va al pin de 5v el cual seria la alimentación o corriente de nuestro sensor y el cable azul esta conectado a el pin 10 el cual es un pin de entrada digital PWM en donde se hará la lectura de valores del sensor que en este caso se traduce en temperatura (centigrados o fahrenheit).



Si podemos apreciar en el protoboard esta conectada una resistencia de 4.7K entre la entrada de corriente o alimentación llamada Vcc  a nuestro sensor y la salida de datos del mismo llamada DQ (Dren). Se conecta de esta manera para el correcto funcionamiento del sensor.

Caracteristicas de sensor de Temperatura (Informacion adicional pero importante)

Sensor Digital
Resolucion de 9 y 12 bits
Rango de operacion de -50 a 125 grados centigrados
Precision de +-2 grados
Protocolo de comunicacion OneWire ()

Manual del sensor:
http://www.embeddeddatasystems.com/assets/images/supportFiles/manuals/DS1822Z.pdf

Imagen relacionada


Fotos de la conexión (Como yo hice la conexión) 


Código Arduino para la comunicación con sensor DS1822

Este codigo esta escrito para aceptar a tres tipos de sensores de la familia Dallas los cuales serian DS18S20, DS18B20, DS1822. Basicamente lo que hace este codigo es:

  • Buscar la dirección del sensor en este caso con la cual se identifica que tipo de sensor es.
  • Leer la dirección.
  • Verificar la integración de datos atravez de CRC para la direccion del sensor.  
  • Reconocimiento del sensor y elección del mismo
  • Mando de hexadecimal (0x44) para recibir datos del sensor
  • Presentacion de hexadecimal en respuesta (sensor)
  • Conversion de respuesta a temperatura real 
  • Eleccion de resolucion de sensor (de 9 BIT A 12 BIT)
  • Operaciones para calcular grados (Centigrados o Fahrenheit)
  • Impresion de resultados
#include onewire.h="" //LIBRERIA DE COMUNICACION POR PROTOCOLO ONE WIRE

// DS1822 SENSOR DE TEMPERATURA
OneWire ds(10);  // INICIALIZANDO EL PIN 10 EN CANAL ONEWIRE

void setup(void) {
  // INICIANDO EL MICROCONTOLADOR EN BAUDIOS :(9600) 
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte type_s;
  byte present = 0;
  byte data[12];
  byte addr[12];
  float centigrados, fahrenheit;
  
//PROCESO DE COMUNICACION CON EL SENSOR
  ds.reset_search();// SE BUSCA LA DIRECCION QUE ARROJA EL SENSOR
  if (!ds.search(addr)) {// SI NO HAY NINGUN SENSOR O NO SE ENCUENTRA NUNGUNA DIRECCION 
      Serial.print("NO HAY DIRECCIONES DE SENSORES ENCONTRADOS.\n");
      ds.reset_search();// SE REINICIA LA BUSQUEDA DE DIRECCION
      return;
  }

  //Serial.print("R=");
  for( i = 0; i < 12; i++) {  //CICLO QUE MUESTRA LA DIRECCION HEXADECIMAL EN 12 POSICIONES
    //Serial.print(addr[i], HEX); CADENADA IDENTIFICACION DE SENSOR EJEMPLO DE CADENA DE SENSOR DS1822 22C35E5000E5DEF991AA
    //Serial.print(" ");
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) { //VERIFICACION DE INTEGRIDAD DE DATOS
      //Serial.print("CRC NO VALIDO!\n");
      return;
  }

//ELECCION DEL TIPO DE SENSOR DE TEMPERATURA SEGUN LA DIRECCION ARROJADA Y VALIDADA DE CRC PARA ELECCION DE FAMILIA DE SENOSOR 
//IDENTIFICACION DEL SENSOR DEL FABRICANTE DALLAS (AHORA MAXIM) 
  if ( addr[0] == 0x10) {
      //Serial.print("EL DISPOSITIVO ES DE LA FAMILIA DS18S20.\n");
  }
  else if ( addr[0] == 0x28) {
      //Serial.print("EL DISPOSITIVO ES DE LA FAMILIA DS18B20.\n");
  }else if ( addr[0] == 0x22) {
      //Serial.print("EL DISPOSITIVO ES DE LA FAMILIA DS1822.\n");
  }else {
      Serial.print("EL DISPOSITIVO NO ES RECONOCIDO: 0x");
      Serial.println(addr[0],HEX);
      return;
  }

  ds.reset();
  ds.select(addr); //DIRECCION ESPECIFICA DE COMUNICACION CON EL SENSOR
  ds.write(0x44,1);// SE EMITE UN COMANDO PARA QUE EL SENSOR DE TEMPERATURA INICIE CONVERSIONES Y PUEDA MOSTRAR TEMPERATURAS (COMUNICACION CON EL SENSOR)

  delay(1000);// ESPERA DE 750 MILISEGUNDOS PARA QUE RESPONDA APROXIMADAMENTE EL SENSOR
  

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);// ESCRIBIENDO BLOQUES DE DATOS

  //Serial.print("P=");
  //Serial.print(present,HEX); //PRESENTACION DEL HEXADECIMAL EN RESPUESTA
 // Serial.print(" ");
  for ( i = 0; i < 9; i++) {//AQUI SE REPRESENTAN LOS 9 BITS QUE NECESITAMOS COMO MINIMO
    data[i] = ds.read();
   // Serial.print(data[i], HEX);
    //Serial.print(" ");
  }
 // Serial.print(" CRC="); 
 // Serial.print( OneWire::crc8( data, 8), HEX); IMPRESION DEL CRC EN HEXADECIMAL 
 // Serial.println();

//------------TEMPERATURA -------------------
 // CONVERSION DE DATOS A LA TEMPERATURA REAL ACTUAL
 //PORQUE EL RESULTADO ES ENTERO DE 16BITS DEBE DE SER ALMACENADO
 //EN UNA VARIABLE DE int16_t INCLUSO CUANDO SE COMPILA EN UN PROCESADOR DE 32BITS
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // RESOLUCION PREDETERMINADA DE 9 BIT
    if (data[7] == 0x10) {
      // "count remain" PROPORCIONA UNA RESOLUCION COMPLETA DE 12BITS
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    //SI LOS BIT SON MENORES A 9 LOS BIT ARROJADOS SON INDEFINIDOS ASI QUE SE CONTEMPLAN COMO 0 YA 
    //NO ESTA EN RANGO DE RESOLUCION DE LAS FAMILIAS DE SENSOR DE TEMPERATURA
    if (cfg == 0x00) raw = raw & ~7;  // 9 BIT DE RESOLUCION, 93.75 ms TIEMPO DE CONVERSION
    else if (cfg == 0x20) raw = raw & ~3; // 10 BIT DE REOLUCION, 187.5 ms TIEMPO DE CONVERSION
    else if (cfg == 0x40) raw = raw & ~1; // 11 BIT DE RESOLUCION, 375 ms TIEMPO DE CONVERSION
    //12 BIT RESOLUCION POR DEFECTO 750ms TIEMPO DE CONVERSION
  }
  centigrados = (float)raw / 16.0;//CONVERSION A CENTIGRADOS
  fahrenheit = centigrados * 1.8 + 32.0;//CONVERSION DE CENTIGRADOS A FAHRENHEIT
  //Serial.print("  Temperatura = ");
  float centigrados2 =(fahrenheit-32)/1.8; //CONVERSION DE FAHRENHEIT A CENTIRADOS
  Serial.println(centigrados2); // IMPRESION DE RESULTADO EN CENTIGRADOS
 // Serial.print(" Centigrados, ");
 // Serial.print(fahrenheit);
 // Serial.println(" Fahrenheit");
}       
Resultado en monitor serie en el IDE de  Arduino:



Comentarios

Entradas más populares de este blog

Bienvenidos

Este blog es una base de conocimientos de distintos proyectos tecnológicos los cuales pueden ser proyectos simples o proyectos complejos según la magnitud de los mismos. El objetivo es almacenar un conjunto de  ideas, conceptos o datos de proyectos que puedan ser consultados para reutilizarlos en nuevos proyectos o con fines de aprendizaje.