KY-001

Esta placa sensora está basada en un chip DS18B20 que es capaz de medir la temperatura y mandarla digitalizada via datos serie.

Tendríamos a grandes rasgos una placa que:
- 12 bits de resolución en la medida
- Alimentación entre 3,0 y 5,5V
- Rango de medida entre -55ºC hasta +125ºC
- Tiempo de conversión de 750ms como máximo

CARACTERISTICAS

Las características principales de esta placa son:
- Chip sensor DS18B20
- Solo requiere un pin con el protocolo 1-Wire bus
- Lectura almacenada en su ROM interna de 64bits
- No requiere componentes externos
- Rango de alimentación entre 3,0V y 5,5V
- Rango de medida entre -55ºC y +125ºC
- Precisión de ±0,5ºC entre -10ºC y +85ºC
- Resolución de la medida seleccionable entre 9bits o 12bits (por defecto 12bits)

Si queremos ver la hoja de características completa del DS18B20, podemos consultar su datasheet


PINEADO

El pineado de esta placa es:

1 : Este pin es la entrada negativa que alimenta la placa. Alimenta directamente al DS18B20 y a la resistencia del led incluido.

2 : Este pin es la entrada positiva que alimenta la placa. Tiene que estar entre +3,0V y +5,5V. Alimenta directamente al DS18B20.

3 : Este pin es la entrada/salida de datos del sensor. Está conectada directamente al DS18B20 y además al led de control SMD que tenemos en la placa. Cuando el led se ilumine sabremos que el sensor se está comunicando con la placa anfitriona.















LED's INDICADORES

Tenemos un led SMD que nos indica la trasferencia de datos entre el sensor y la placa anfitriona. Está conectada al pin de entrada/salida

PROBEMOS EL SENSOR KY-001

Vamos a montar en una placa protoboard el sensor KY-001 y conectarlo a un Arduino Mega. Mandaremos la temperatura al puerto serie USB del Arduino Mega y así podremos ver la medida en el visor serie el IDE. Además de la temperatura enviaremos también todo tipo de datos de control que nos ayudarán a entender el funcionamiento del sensor y como se comunica con el Arduino.

NECESITAREMOS

Placa sensora KY-001

Placa protoboard grande

Arduino Mega 2560

Diodo LED rojo de 5mm y una resistencia que calcularemos de 220Ω y 1/4W

Cableado macho-macho o hilo rígido que entre en la protoboard

Soporte AFTP para Arduino Mega y protoboard grande

Cable USB corto de USB tipo A a USB tipo B

ESQUEMA

En es esquema podemos ver:

- La placa Arduino Mega se encarga de alimentar la protoboard
- La placa sensora KY-001 está conectada en la protoboard y conectada a la alimentación de +5V
- El led y la resistencia están conectados a la alimentación de +5V para indicarnos cuando tiene alimentación la protoboard
- El pin de la placa sensora de entrada/salida está conectado al pin 10 del Arduino Mega
- La alimentación de todo el sistema se realiza a través del puerto USB

Para calcular la resistencia del LED solo tenemos que ver el voltaje que va a caer en la resistencia y dividirlo entre la intensidad que queremos que pase por el LED.
La tensión que tiene la resistencia sería el voltaje total menos el voltaje que se queda el LED rojo (aprox. 1,5V). Esto nos deja 5V-1,5V = 3,5V caen en la resistencia.
Vamos a fijar una intensidad por el LED de 15mA (suficientes para que se encienda a buen brillo un LED rojo). Tendriamos entonces una resistencia de 3,5V/0,015A = 233,33Ω
El valor mas cercano al calculado es de 220Ω (Rojo-Rojo-Marrón). Las resistencias comunes de 1/4W deberían servir, ya que la potencia disipada por nuestra resistencia será de 3,5Vx0,015A = 0,05W, valor muy por debajo de los 0,25W máximos que es capaz la resistencia de disipar.


Vamos a ver algunas imágenes mas de cerca del montaje

Detalle de la conexión de la placa sensora

Detalle de la conexión de la placa sensora

Detalle de la conexión del LED y la resistencia

Detalle de la conexión de la placa Arduino Mega

PROGRAMACIÓN

¿Qué vamos a programar?, una lectura cada tres segundos de la temperatura que tiene el sensor. El resultado de la lectura se enviará por el puerto serie al visor serie del IDE del ordenador.
Como es un programa de prueba vamos a mandar datos de control al puerto serie para visualizarlos y ver las lecturas en bruto desde la placa y como el programa va gestionando los datos.
Ahora vamos a añadir a nuestro IDE la librería OneWire, que podemos descargar desde aquí.

Pulsamos "Programa - Incluir Librería - Añadir biblioteca .ZIP..."

Esto abre una ventana, donde buscaremos en nuestro ordenador la librería que descargamos

Comprobamos que la librería a aparecido


A continuación tenemos el código fuente del Sketch terminado para consultarlo. Se puede escribir copiándolo o descargarlo desde aquí

CÓDIGO ARDUINO
/*
 * AFPT - Arduino Fácil Para Todos
 * 
 * Prueba Arduino Mega + KY001
 * 
 * Modulo_KY-001.ino
 * 
 * www.fantasystudios.es/arduino
 * 
 * Creado el 12 de Abril de 2020
 * Por Manuel Peláez
 * 
 */


#include <OneWire.h>

//Informamos a la libreria que el pin i/o del DS18S20 esta conectado al pin 10 del Arduino
OneWire ds(10);

void setup() {
  // put your setup code here, to run once:
  //Inicializamos el puerto serie con el ordenador a 9600 baudios
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

  //Inicializamos las variables
  int ByteAlto;         //guardare la lectura del byte alto de la temperatura
  int ByteBajo;         //guardare la lectura del byte bajo de la temperatura
  int Lectura;          //Para unir los dos byte de temperatura en uno solo
  int Signo;            //para almacenar el signo de la lectura
  int TempC;            //Valor de la temperatura leida * 100
  int Entero;           //para almacenar el valor entero de la lectura
  int Decimal;          //para almacenar el valor de los decimales de la lectura
  
  byte a;               //para usarlo de indice en los bucles for
  byte presente = 0;    //para almacenar el numero de dispositivo
  byte datos[12];       //array de datos leidos de la temperatura de cada dispositivo
  byte dire[8];         //array de datos leidas de los dispositivos que haya en el sistema 

  //Vamos a ver los dispositivos que hay en el sistema
  if (!ds.search(dire)) {
    Serial.print("No hay mas direcciones.\n");
    ds.reset_search();
    return;
  }

  //Muestra los datos de control leidos del dispositivo
  Serial.print("R=");
  for(a=0;a<8;a++) {
    Serial.print(dire[a], HEX);
    Serial.print(" ");
  }

  //comprobamos el CRC de los datos de control leidos y almacenados
  if (OneWire::crc8(dire,7) != dire[7]) {
    Serial.print("¡CRC no válido!\n");
    return;
  }

  //vemos que modelo esta conectado al Arduino, en nuestro caso sera el segundo
  if (dire[0] == 0x10) {
    Serial.print("Dispositivo de la familia DS18S20-10.\n");
  }
  else if (dire[0] == 0x28) {
    Serial.print("Dispositivo de la familia DS18B20-28.\n");
  }
  else {
    Serial.print("Dispositivo no reconocido: 0x");
    Serial.println(dire[0],HEX);
  }


  //Iniciamos la conversion y la lectura
  ds.reset();         //resetea el dispositivo
  ds.select(dire);    //selecciona la direccion del dispositivo
  ds.write(0x44,1);   //incia la conversion

  delay(3000);        //Esperamos 3 seg (se recomienda no bajar de 750 y el fabricante recomienda minimo 1000)

  presente = ds.reset();  //vemos si esta presente el dispositivo
  ds.select(dire);        //selecciona la direccion del dispositivo
  ds.write(0xBE);         //lee el registro del dispositivo sensor de temperatura

  Serial.print("P=");
  Serial.println(presente,HEX);
  
  //vemos los 9 bytes de datos que acabamos de leer y almacenar en el array datos
  Serial.print("Datos= ");
  for (a=0;a<9;a++) {
    datos[a] = ds.read();
    Serial.print(datos[a],HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8(datos,8),HEX);
  Serial.println();

  //Convertimos los datos en bruto HEX a temperatura Celsius
  ByteBajo = datos[0];                    //asignamos el byte bajo de la lectura
  ByteAlto = datos[1];                    //asignamos el byte alto de la lectura
  Lectura = (ByteAlto << 8) + ByteBajo;   //desplazamos 8 bits a la izquierda del byte alto y le sumamos el bajo
  Signo = Lectura & 0x8000;               //borramos los 11 primeros bits y nos quedamos con el 12 que es el signo
  
  //si el signo es 1 (negativo) realizamos una inversion binaria y sumamos 1 (realizar complemento a 2)
  if (Signo) {
    Lectura = (Lectura ^ 0xffff) + 1;
  }

  //Conversion del valor leido que segun el fabricante es multiplicarlo por 6,25
  //Asi tenemos un valor de la temperatura 100 veces el real ejem: 25,34º serian 2534 el valor de TempC
  TempC = (6 * Lectura) + (Lectura / 4);

  //separamos el valor entero y decimal de la lectura al dividirlo entre 100
  Entero = TempC /100;
  Decimal = TempC % 100;

  //Visializamos todos los datos para controlar el proceso
  Serial.println("Datos de control:");
  Serial.print("ByteBajo = ");
  Serial.println(ByteBajo,HEX);
  Serial.print("ByteAlto = ");
  Serial.println(ByteAlto,HEX);
  Serial.print("Lectura = ");
  Serial.print(Lectura,HEX);
  Serial.print(" ");
  Serial.println(Lectura);
  Serial.print("TempC = ");
  Serial.println(TempC);

  //Presentamos los datos de temeratura en el visor serie
  Serial.print("Temperatura: ");
  if (Signo) {
    Serial.print("-");
  }
  Serial.print(Entero);
  Serial.print(".");
  if (Decimal < 10) {   //este if añade un 0 cuando el valor del decimal esta entre 0 y 9
    Serial.print("0");  //para que aparezca 25,05 en lugar de 25,5 que daria a error al leerlo
  }
  Serial.print(Decimal);
  Serial.println("\n");
  
}

CÓDIGO ARDUINO

A continuación tenemos un video con todo el proceso completo.