uint8_t DallasTemperature::getResolution(const uint8_t* deviceAddress) { // this model has a fixed resolution of 9 bits but getTemp calculates // a full 12 bits resolution and we need 750ms convert time if (isDS18S20Model(deviceAddress)) return 12; ScratchPad scratchPad; if (readScratchPadCRC(deviceAddress, scratchPad)) { #if REQUIRESONLY12BITCONVERSION return 12; #else switch (scratchPad[CONFIGURATION]) { case TEMP_12_BIT: return 12; case TEMP_11_BIT: return 11; case TEMP_10_BIT: return 10; case TEMP_9_BIT: return 9; } #endif } return 0; }
bool DallasTemperature::setResolution(const uint8_t* deviceAddress, uint8_t newResolution) { ScratchPad scratchPad; if (readScratchPadCRC(deviceAddress, scratchPad)) { // DS18S20 has a fixed 9-bit resolution if (!isDS18S20Model(deviceAddress)) { uint8_t resolution; #if REQUIRESONLY12BITCONVERSION resolution = TEMP_12_BIT; #else switch (newResolution) { case 12: resolution = TEMP_12_BIT; break; case 11: resolution = TEMP_11_BIT; break; case 10: resolution = TEMP_10_BIT; break; case 9: default: resolution = TEMP_9_BIT; break; } #endif scratchPad[CONFIGURATION] = resolution; writeScratchPad(deviceAddress, scratchPad, false); } return true; // new value set } return false; }
void DallasTemperature::setLowAlarmTemp(const uint8_t* deviceAddress, char celsius) { // make sure the alarm temperature is within the device's range if (celsius > 125) celsius = 125; else if (celsius < -55) celsius = -55; ScratchPad scratchPad; if (readScratchPadCRC(deviceAddress, scratchPad)) { scratchPad[LOW_ALARM_TEMP] = (uint8_t) celsius; writeScratchPad(deviceAddress, scratchPad, true); } }
int16_t DallasTemperature::getTempRaw(const uint8_t* deviceAddress) { ScratchPad scratchPad; if (!readScratchPadCRC(deviceAddress, scratchPad)) { return DEVICE_DISCONNECTED; } // return DEVICE_DISCONNECTED when a reset has been detected to force it to be reconfigured if (detectedReset(scratchPad)) { return DEVICE_DISCONNECTED; } return calculateTemperature(deviceAddress, scratchPad); }
bool DallasTemperature::hasAlarm(const uint8_t* deviceAddress) { ScratchPad scratchPad; if (readScratchPadCRC(deviceAddress, scratchPad)) { float temp = calculateTemperature(deviceAddress, scratchPad); // check low alarm if ((char) temp <= (char) scratchPad[LOW_ALARM_TEMP]) return true; // check high alarm if ((char) temp >= (char) scratchPad[HIGH_ALARM_TEMP]) return true; } // no alarm return false; }
bool DallasTemperature::initConnection(const uint8_t* deviceAddress) { #if REQUIRESRESETDETECTION ScratchPad scratchPad; bool writeSettings = false; if (isParasitePowered(deviceAddress)) { return false; } // Reload settings from EEPROM so we can skip writing EEPROM if the values are already set recallScratchpad(deviceAddress); if (!readScratchPadCRC(deviceAddress, scratchPad)) { return false; } #if REQUIRESONLY12BITCONVERSION if(scratchPad[CONFIGURATION] != TEMP_12_BIT){ scratchPad[CONFIGURATION] = TEMP_12_BIT; writeSettings = true; } #endif // Make sure that HIGH_ALARM_TEMP is set to zero in EEPROM // This value will be loaded on power on if (scratchPad[HIGH_ALARM_TEMP]) { // conditional to avoid wear on eeprom. scratchPad[HIGH_ALARM_TEMP] = 0; writeSettings = true; } if (writeSettings){ writeScratchPad(deviceAddress, scratchPad, true); // save settings to eeprom } // Write HIGH_ALARM_TEMP again, but don't save to EEPROM, so that it reverts to 0 on reset // from this point on, if we read a scratchpad with a 0 value in HIGH_ALARM (detectedReset() returns true) // it means the device has reset or the previous write of the scratchpad above was unsuccessful. // Either way, initConnection() should be called again scratchPad[HIGH_ALARM_TEMP] = 1; writeScratchPad(deviceAddress, scratchPad, false); #endif return true; }
char DallasTemperature::getLowAlarmTemp(const uint8_t* deviceAddress) { ScratchPad scratchPad; if (readScratchPadCRC(deviceAddress, scratchPad)) return (char) scratchPad[LOW_ALARM_TEMP]; return DEVICE_DISCONNECTED_C; }