diff --git a/examples/AnyDevice/AnyDevice.ino b/examples/AnyDevice/AnyDevice.ino index 200c7d5..31c985e 100644 --- a/examples/AnyDevice/AnyDevice.ino +++ b/examples/AnyDevice/AnyDevice.ino @@ -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); diff --git a/examples/DiscoveryDevices/DiscoveryDevices.ino b/examples/DiscoveryDevices/DiscoveryDevices.ino index 22993c6..fe113d9 100644 --- a/examples/DiscoveryDevices/DiscoveryDevices.ino +++ b/examples/DiscoveryDevices/DiscoveryDevices.ino @@ -4,7 +4,7 @@ #include -#define PIN_BUS 9 +#define PIN_BUS 2 MaximWire::Bus bus(PIN_BUS); MaximWire::DS18B20 device; @@ -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(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(bus); + Serial.print(" temp="); + Serial.print(temp); + Serial.println(); + device.Update(bus); } } while (discovery.HaveMore()); delay(1000); diff --git a/src/DS18B20.h b/src/DS18B20.h index 9490f77..4089523 100644 --- a/src/DS18B20.h +++ b/src/DS18B20.h @@ -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)) { } @@ -32,6 +30,11 @@ class DS18B20 : public Device { template T GetTemperature(Bus& bus); + + enum EmodelCode : uint8_t { + CodeDS18B20 = 0x28, + CodeDS18S20 = 0x10, + }; // implementation specific enum ECommands : uint8_t { @@ -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 <> @@ -112,7 +118,7 @@ float DS18B20::GetTemperature(Bus& bus) { if (temperature == UNKNOWN_TEMPERATURE) { return NAN; } else { - return (float)temperature / 16; + return (float)temperature / precisionDenominator; } } @@ -122,8 +128,19 @@ int DS18B20::GetTemperature(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; +} }