|
|
- // -----------------------------------------------------------------------------
- // DHT Sensor
- // -----------------------------------------------------------------------------
-
- #pragma once
-
- #include "Arduino.h"
- #include "BaseSensor.h"
- #include <OneWire.h>
- #include <DallasTemperature.h>
-
- #define DS18B20_OK 0
- #define DS18B20_NOT_FOUND 1
- #define DS18B20_OUT_OF_RANGE 2
- #define DS18B20_CONVERSION_ERROR 3
-
- class DS18B20Sensor : public BaseSensor {
-
- public:
-
- DS18B20Sensor(unsigned char gpio, bool pull_up = false): BaseSensor() {
- _gpio = gpio;
- if (pull_up) pinMode(_gpio, INPUT_PULLUP);
- init();
- }
-
- // Pre-read hook (usually to populate registers with up-to-date data)
- void pre() {
-
- _device->requestTemperatures();
-
- // TODO: enable?
- /*
- while (!_device->isConversionComplete()) {
- delay(1);
- }
- */
-
- }
-
- // Descriptive name of the sensor
- String name() {
- char buffer[20];
- snprintf(buffer, sizeof(buffer), "DS18B20 %s@ GPIO%d",
- _device->isParasitePowerMode() ? "(P) " : "",
- _gpio
- );
- return String(buffer);
- }
-
- // Descriptive name of the slot # index
- String slot(unsigned char index) {
- if (index < _count) {
- DeviceAddress address;
- _device->getAddress(address, index);
- char buffer[40];
- snprintf(buffer, sizeof(buffer), "%02X%02X%02X%02X%02X%02X%02X%02X @ %s",
- address[0], address[1], address[2], address[3],
- address[4], address[5], address[6], address[7],
- name().c_str()
- );
- return String(buffer);
- }
- _error = DS18B20_OUT_OF_RANGE;
- return String();
- }
-
- // Type for slot # index
- magnitude_t type(unsigned char index) {
- if (index < _count) return MAGNITUDE_TEMPERATURE;
- _error = DS18B20_OUT_OF_RANGE;
- return MAGNITUDE_NONE;
- }
-
- // Current value for slot # index
- double value(unsigned char index) {
- if (index < _count) {
- double t = _device->getTempCByIndex(index);
- if (t != DEVICE_DISCONNECTED_C) {
- _error = DS18B20_OK;
- return t;
- }
- _error = DS18B20_CONVERSION_ERROR;
- }
- _error = DS18B20_OUT_OF_RANGE;
- return 0;
- }
-
- protected:
-
- void init() {
- OneWire * wire = new OneWire(_gpio);
- _device = new DallasTemperature(wire);
- _device->begin();
- _device->setWaitForConversion(false);
- _count = _device->getDeviceCount();
- if (_count == 0) _error = DS18B20_NOT_FOUND;
- }
-
- unsigned char _gpio;
-
- DallasTemperature * _device;
-
-
- };
|