Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/AnyDevice/AnyDevice.ino
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void loop() {
device.Reset();
}
} else {
if (bus.Discover().FindNextDevice(device) && device.GetModelCode() == MaximWire::DS18B20::MODEL_CODE) {
if (bus.Discover().FindNextDevice(device) && device.GetModelCode() == MaximWire::DS18B20::EmodelCode::CodeDS18B20) {
Serial.print("FOUND ");
Serial.println(device.ToString());
device.Update(bus);
Expand Down
34 changes: 19 additions & 15 deletions examples/DiscoveryDevices/DiscoveryDevices.ino
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include <MaximWire.h>

#define PIN_BUS 9
#define PIN_BUS 2

MaximWire::Bus bus(PIN_BUS);
MaximWire::DS18B20 device;
Expand All @@ -25,22 +25,26 @@ void loop() {
} else {
Serial.print(" (INVALID)");
}
if (address.GetModelCode() == MaximWire::DS18B20::MODEL_CODE) {
uint8_t modelCode = address.GetModelCode();
if (modelCode == MaximWire::DS18B20::EmodelCode::CodeDS18B20) {
Serial.print(" (DS18B20)");
MaximWire::DS18B20 device(address);
if (device.IsParasitePowered(bus)) {
Serial.print(" (PARASITE POWER)");
}
float temp = device.GetTemperature<float>(bus);
Serial.print(" temp=");
Serial.print(temp);
Serial.println();
device.Update(bus);
} else {
Serial.println();
}
} else {
Serial.println("NOTHING FOUND");
else if (modelCode == MaximWire::DS18B20::EmodelCode::CodeDS18S20) {
Serial.print(" (DS18S20)");
}
else {
Serial.println();
break;
}
MaximWire::DS18B20 device(address, modelCode);
if (device.IsParasitePowered(bus)) {
Serial.print(" (PARASITE POWER)");
}
float temp = device.GetTemperature<float>(bus);
Serial.print(" temp=");
Serial.print(temp);
Serial.println();
device.Update(bus);
}
} while (discovery.HaveMore());
delay(1000);
Expand Down
37 changes: 27 additions & 10 deletions src/DS18B20.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,21 @@ namespace MaximWire {

class DS18B20 : public Device {
public:
static constexpr uint8_t MODEL_CODE = 0x28;

// public interface
DS18B20() = default;

DS18B20(const Address& address)
: Device(address)
DS18B20(const Address& address, uint8_t modelCode = EmodelCode::CodeDS18B20)
: Device(address), precisionDenominator(getPrecisionDenominatorFromModelCode(modelCode))
{
}

DS18B20(const String& address)
: Device(address)
DS18B20(const String& address, uint8_t modelCode = EmodelCode::CodeDS18B20)
: Device(address), precisionDenominator(getPrecisionDenominatorFromModelCode(modelCode))
{
}

DS18B20(const uint8_t (&address)[Address::ADDRESS_SIZE])
: Device(address)
DS18B20(const uint8_t (&address)[Address::ADDRESS_SIZE], uint8_t modelCode = EmodelCode::CodeDS18B20)
: Device(address), precisionDenominator(getPrecisionDenominatorFromModelCode(modelCode))
{
}

Expand All @@ -32,6 +30,11 @@ class DS18B20 : public Device {

template <typename T>
T GetTemperature(Bus& bus);

enum EmodelCode : uint8_t {
CodeDS18B20 = 0x28,
CodeDS18S20 = 0x10,
};

// implementation specific
enum ECommands : uint8_t {
Expand Down Expand Up @@ -72,6 +75,9 @@ class DS18B20 : public Device {
};

static constexpr int16_t UNKNOWN_TEMPERATURE = 0x550;
private:
uint8_t precisionDenominator;
uint8_t getPrecisionDenominatorFromModelCode(uint8_t modelCode);
};

template <>
Expand Down Expand Up @@ -112,7 +118,7 @@ float DS18B20::GetTemperature<float>(Bus& bus) {
if (temperature == UNKNOWN_TEMPERATURE) {
return NAN;
} else {
return (float)temperature / 16;
return (float)temperature / precisionDenominator;
}
}

Expand All @@ -122,8 +128,19 @@ int DS18B20::GetTemperature<int>(Bus& bus) {
if (temperature == UNKNOWN_TEMPERATURE) {
return 0;
} else {
return temperature / 16;
return temperature / precisionDenominator;
}
}

uint8_t DS18B20::getPrecisionDenominatorFromModelCode(uint8_t modelCode){
uint8_t denominator = 16; // Default: DS18B20
switch(modelCode) {
case EmodelCode::CodeDS18B20:
break;
case EmodelCode::CodeDS18S20:
denominator = 2;
break;
}
return denominator;
}
}