/* * DS18B20.cpp * * Created on: Feb 28, 2018 * Author: sebastian */ #define READ_SCRATCH 0xBE #define WRITE_SCRATCH 0x4E #define READ_ROM 0x33 #define SKIP_ROM 0xCC #define CONVERT_T 0x44 #include "DS18B20.h" /* * | -- 8 BIT CRC -- | -- 48 BIT SERIAL NUMBER -- | -- 8 BIT FAMILY CODE (28h) -- | */ uint8_t ROM[8] = {0,0,0,0,0,0,0,0}; double deviceID; /** * initialize the Temperatur Sensor * This lib is written for only ONE device on the 1-Wire Bus */ void DS18B20_init(void){ OneWire_init(); if(OW_reset()){ logger_error("Unable to reset 1-Wire Bus, no Device present %s\n", strerror(errno)); return; } DS18B20_readRom(); deviceID = double (ROM[1]);// | ROM[5] << 8 | ROM[5] << 16 | ROM[5] << 24 | ROM[5] << 32 | ROM[5] << 40); if(ROM[7] == 0x28){ logger(V_HAL, "Found Temperatur Sensor on 1-Wire Bus\n"); logger(V_HAL, "Device ID: %12X", deviceID); } } void DS18B20_readRom(void){ OW_writeByte(READ_ROM); uint8_t i; for(i = 8; i >= 0; i--){ ROM[i] = OW_readByte(); } } /** * Reads the Temperatur of the DS18B20 Sensor * It rounds the value read from the Sensor rounded to the next integer */ int8_t DS18B20_readTemp (void){ OW_writeByte(SKIP_ROM); OW_writeByte(CONVERT_T); while(!OW_readBit()){ //wait to finish conversion //TODO don't wait forever } OW_writeByte(READ_SCRATCH); uint8_t scratchPad[9]; uint8_t i; int8_t temp; for(i = 0; i < 9; i++){ scratchPad[i] = OW_readByte(); } //Information about temperatur is stored in byte[0] and byte[1] temp = scratchPad[0] >> 4; temp |= (scratchPad[1] << 4) & 0xF0; return temp; //todo return a float value and do proper rounding }