Beispiel #1
0
float DS18B20::getTempC() {
    sendCommand(MATCH_ROM, CONVERT_T, !selectedPowerMode);
    delayForConversion(selectedResolution, selectedPowerMode);
    readScratchpad();
    uint8_t lsb = selectedScratchpad[TEMP_LSB];
    uint8_t msb = selectedScratchpad[TEMP_MSB];

    switch (selectedResolution) {
        case 9:
            lsb &= 0xF8;
            break;
        case 10:
            lsb &= 0xFC;
            break;
        case 11:
            lsb &= 0xFE;
            break;
    }

    uint8_t sign = msb & 0x80;
    int16_t temp = (msb << 8) + lsb;

    if (sign) {
        temp = ((temp ^ 0xffff) + 1) * -1;
    }

    return temp / 16.0;
}
Beispiel #2
0
/** Reads the DS18B20 temperature from scratchpad.
 *
 * A conversion must have been triggered before using startConversion.
 * @param temperature Pointer to a float variable which will hold the temperature
 * @return 0 if temperature is valid; -1 if device not ready;
 *         -2 in case of CRC error
 */
int DS18B20::readTemperature(float* temperature)
{
  // make sure that a temperature conversion has been started before
  if (false == _conversionStarted)
  {
    return -1;
  }

  int result = readScratchpad();

  if (0 == result)
  {
    *temperature = ((int16_t)_scratchpad.tempLow) | ((int16_t)_scratchpad.tempHigh << 8);

    if (TemperatureSensor::DS18B20Type == _temperatureSensor)
    {
      // DS18S20 type has 12 bit resolution (0.0625 Kelvin per LSB)
      *temperature *= 0.0625;
    }
    else if (TemperatureSensor::DS18S20Type == _temperatureSensor)
    {
      // DS18S20 type has 9 bit resolution (0.5 Kelvin per LSB)
      *temperature *= 0.5;
    }
    else
    {
      // unknown type
      result = -1;
    }
  }

  return result;
}
Beispiel #3
0
uint8_t DS18B20::select(uint8_t address[]) {
    if (isConnected(address)) {
        memcpy(selectedAddress, address, 8);

        if (readScratchpad()) {
            selectedResolution = getResolution();

            sendCommand(MATCH_ROM, READ_POWER_SUPPLY);
            selectedPowerMode = oneWire.read_bit();

            return 1;
        }
    }

    return 0;
}
Beispiel #4
0
uint8_t readTempData_ds18b20(int *temperature) {
	if(resetSensor() != 0){
		return 1;
	}
	OWWriteByte(0xCC); //skip rom

	OWWriteByte(0x44); //convert T
	_delay_ms(800);
	if(resetSensor() != 0){
			return 1;
	}
	OWWriteByte(0xCC); //skip rom
	OWWriteByte(0xBE); //read scratchpad
	*temperature = readScratchpad(2);
	//*temperature = 0xFC90;
	return 0;
}