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í.
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.