105 lines
2.9 KiB
C++
105 lines
2.9 KiB
C++
/**
|
|
* @file DS18B20.cpp
|
|
* @author your name (you@domain.com)
|
|
* @brief
|
|
* @version 0.1
|
|
* @date 2020-06-09
|
|
*
|
|
* @copyright Copyright (c) 2020
|
|
*
|
|
*/
|
|
|
|
#include "DS18B20.h"
|
|
|
|
#define STARTCONV 0x44
|
|
#define READSCRATCH 0xBE // Read EEPROM
|
|
#define TEMP_LSB 0
|
|
#define TEMP_MSB 1
|
|
#define SCRATCHPADSIZE 9
|
|
#define OFFSET_CRC8 8 /**< 9th byte has the CRC of the complete data */
|
|
|
|
//Printf debugging
|
|
//#define DS_DEBUG
|
|
|
|
int Ds18B20::readDevices() {
|
|
byte addr[8];
|
|
|
|
int amount = -1;
|
|
while (this->mDs->search(addr)) {
|
|
amount++;
|
|
}
|
|
this->mDs->reset_search();
|
|
return amount;
|
|
}
|
|
|
|
int Ds18B20::readAllTemperatures(float* pTemperatures, int maxTemperatures) {
|
|
byte addr[8];
|
|
uint8_t scratchPad[SCRATCHPADSIZE];
|
|
int currentTemp = 0;
|
|
|
|
while (this->mDs->search(addr)) {
|
|
#ifdef DS_DEBUG
|
|
Serial.print(" ROM =");
|
|
for (i = 0; i < 8; i++) {
|
|
Serial.write(' ');
|
|
Serial.print(addr[i], HEX);
|
|
}
|
|
#endif
|
|
this->mDs->reset();
|
|
this->mDs->select(addr);
|
|
this->mDs->write(STARTCONV);
|
|
this->mDs->reset();
|
|
this->mDs->select(addr);
|
|
this->mDs->write(READSCRATCH);
|
|
|
|
// Read all registers in a simple loop
|
|
// byte 0: temperature LSB
|
|
// byte 1: temperature MSB
|
|
// byte 2: high alarm temp
|
|
// byte 3: low alarm temp
|
|
// byte 4: DS18S20: store for crc
|
|
// DS18B20 & DS1822: configuration register
|
|
// byte 5: internal use & crc
|
|
// byte 6: DS18S20: COUNT_REMAIN
|
|
// DS18B20 & DS1822: store for crc
|
|
// byte 7: DS18S20: COUNT_PER_C
|
|
// DS18B20 & DS1822: store for crc
|
|
// byte 8: SCRATCHPAD_CRC
|
|
#ifdef DS_DEBUG
|
|
Serial.write("\r\nDATA:");
|
|
for (uint8_t i = 0; i < 9; i++) {
|
|
Serial.print(scratchPad[i], HEX);
|
|
}
|
|
#else
|
|
delay(50);
|
|
#endif
|
|
for (uint8_t i = 0; i < 9; i++) {
|
|
scratchPad[i] = this->mDs->read();
|
|
}
|
|
uint8_t crc8 = this->mDs->crc8(scratchPad, 8);
|
|
|
|
/* Only work an valid data */
|
|
if (crc8 == scratchPad[OFFSET_CRC8]) {
|
|
int16_t fpTemperature = (((int16_t) scratchPad[TEMP_MSB]) << 11)
|
|
| (((int16_t) scratchPad[TEMP_LSB]) << 3);
|
|
float celsius = (float) fpTemperature * 0.0078125;
|
|
#ifdef DS_DEBUG
|
|
Serial.printf("\r\nTemp%d %f °C (Raw: %d, %x =? %x)\r\n", (currentTemp+1), celsius, fpTemperature, crc8, scratchPad[8]);
|
|
#endif
|
|
/* check, if the buffer as some space for our data */
|
|
if (currentTemp < maxTemperatures) {
|
|
pTemperatures[currentTemp] = celsius;
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
currentTemp++;
|
|
}
|
|
this->mDs->reset();
|
|
#ifdef DS_DEBUG
|
|
Serial.println(" No more addresses.");
|
|
Serial.println();
|
|
#endif
|
|
|
|
return currentTemp;
|
|
} |