ESP8266 & Sensor de Temperatura DS18B20 y libreria Onewire
Existen una gran variedad de sensores para medir temperatura en dispositivos como Arduino y ESP8266, en este caso hemos elegido el Sensor DS18B20 este sensor en particular no se conecta atravez de un GPIO Analogo, tecnicamente es un sensor digital que utiliza el protocolo Onewire o 1-wire diseñado por dallas semiconductor, Existen gran cantidad de tutoriales en la red sobre este protocolo.
Referencia: Datasheet DS18B20 Maxim
Materiales Requeridos
Prueba
Utilizaremos un modulo ESP8266 12E NodeMCU y la libreria Onewire en este caso se detalla paso a paso el metodos de envio y solicitud de datos del sensor.
Conexiones , GND, 5V, GPIO(2) PIN D4
Codigo Arduino IDE
En este caso el código indica paso a paso el proceso de solicitud de datos a la sonda, este ejemplo fácilmente se puede modificar para otras implementaciones con onewire, he decidido utilizar este ejemplo para comprender paso a paso como funciona el protocolo Onewire.
- Requiere Libreria Onewire.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
#include < OneWire.h > OneWire ds(2); void setup() { // put your setup code here, to run once: Serial.begin(115200); } void temperature(){ byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; if ( !ds.search(addr)) { /// Serial.println("No more addresses."); /// Serial.println(); ds.reset_search(); delay(250); return; } if ( ds.search(addr)) { Serial.println("fallo"); } for( i = 0; i < 8; i++) { addr[i]; } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } // the first ROM byte indicates which chip switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: // Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); //Serial.println("Paso 7"); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } OneWire::crc8(data, 8); int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms } float celsius_web; celsius = (float)raw / 16.0; if (isnan(celsius)) { Serial.println("isnan"); } Serial.print("Temperature: "); Serial.print(celsius); } void loop() { // put your main code here, to run repeatedly: temperature(); delay(1000); } |
Conclusiones
Aunque se considere que simplemente probamos el sensor, este tutorial invita a adecuar el Sensor y las resistencia para facilitar conexionado en pruebas, este sensor lo utilizaremos en gran cantidad de pruebas futuras.
Una gran ventaja del uso de estos sensores, dado que al ser digitales y utilizar un protocolo, permite crear una red de sensores a una sola entrada(GPIO).