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);
    }
}
Пример #4
0
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;
}