Ecternal MOSFET for parasite DS18B20
This commit is contained in:
parent
c6db901051
commit
1b52d8065e
@ -29,6 +29,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
bool degC = true;
|
bool degC = true;
|
||||||
// using parasite power on the sensor
|
// using parasite power on the sensor
|
||||||
bool parasite = false;
|
bool parasite = false;
|
||||||
|
int8_t parasitePin = -1;
|
||||||
// how often do we read from sensor?
|
// how often do we read from sensor?
|
||||||
unsigned long readingInterval = USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL;
|
unsigned long readingInterval = USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL;
|
||||||
// set last reading as "40 sec before boot", so first reading is taken after 20 sec
|
// set last reading as "40 sec before boot", so first reading is taken after 20 sec
|
||||||
@ -53,6 +54,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
static const char _enabled[];
|
static const char _enabled[];
|
||||||
static const char _readInterval[];
|
static const char _readInterval[];
|
||||||
static const char _parasite[];
|
static const char _parasite[];
|
||||||
|
static const char _parasitePin[];
|
||||||
|
|
||||||
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
|
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
|
||||||
float readDallas() {
|
float readDallas() {
|
||||||
@ -94,12 +96,14 @@ class UsermodTemperature : public Usermod {
|
|||||||
DEBUG_PRINTLN(F("Requesting temperature."));
|
DEBUG_PRINTLN(F("Requesting temperature."));
|
||||||
oneWire->reset();
|
oneWire->reset();
|
||||||
oneWire->skip(); // skip ROM
|
oneWire->skip(); // skip ROM
|
||||||
oneWire->write(0x44,parasite); // request new temperature reading (TODO: parasite would need special handling)
|
oneWire->write(0x44,parasite); // request new temperature reading
|
||||||
|
if (parasite && parasitePin >=0 ) digitalWrite(parasitePin, HIGH); // has to happen within 10us (open MOSFET)
|
||||||
lastTemperaturesRequest = millis();
|
lastTemperaturesRequest = millis();
|
||||||
waitingForConversion = true;
|
waitingForConversion = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void readTemperature() {
|
void readTemperature() {
|
||||||
|
if (parasite && parasitePin >=0 ) digitalWrite(parasitePin, LOW); // deactivate power (close MOSFET)
|
||||||
temperature = readDallas();
|
temperature = readDallas();
|
||||||
lastMeasurement = millis();
|
lastMeasurement = millis();
|
||||||
waitingForConversion = false;
|
waitingForConversion = false;
|
||||||
@ -175,6 +179,12 @@ class UsermodTemperature : public Usermod {
|
|||||||
delay(25); // try to find sensor
|
delay(25); // try to find sensor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (parasite && pinManager.allocatePin(parasitePin, true, PinOwner::UM_Temperature)) {
|
||||||
|
pinMode(parasitePin, OUTPUT);
|
||||||
|
digitalWrite(parasitePin, LOW); // deactivate power (close MOSFET)
|
||||||
|
} else {
|
||||||
|
parasitePin = -1;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (temperaturePin >= 0) {
|
if (temperaturePin >= 0) {
|
||||||
DEBUG_PRINTLN(F("Temperature pin allocation failed."));
|
DEBUG_PRINTLN(F("Temperature pin allocation failed."));
|
||||||
@ -321,6 +331,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
top["degC"] = degC; // usermodparam
|
top["degC"] = degC; // usermodparam
|
||||||
top[FPSTR(_readInterval)] = readingInterval / 1000;
|
top[FPSTR(_readInterval)] = readingInterval / 1000;
|
||||||
top[FPSTR(_parasite)] = parasite;
|
top[FPSTR(_parasite)] = parasite;
|
||||||
|
top[FPSTR(_parasitePin)] = parasitePin;
|
||||||
DEBUG_PRINTLN(F("Temperature config saved."));
|
DEBUG_PRINTLN(F("Temperature config saved."));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,6 +357,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
readingInterval = top[FPSTR(_readInterval)] | readingInterval/1000;
|
readingInterval = top[FPSTR(_readInterval)] | readingInterval/1000;
|
||||||
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
|
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
|
||||||
parasite = top[FPSTR(_parasite)] | parasite;
|
parasite = top[FPSTR(_parasite)] | parasite;
|
||||||
|
parasitePin = top[FPSTR(_parasitePin)] | parasitePin;
|
||||||
|
|
||||||
if (!initDone) {
|
if (!initDone) {
|
||||||
// first run: reading from cfg.json
|
// first run: reading from cfg.json
|
||||||
@ -360,12 +372,21 @@ class UsermodTemperature : public Usermod {
|
|||||||
delete oneWire;
|
delete oneWire;
|
||||||
pinManager.deallocatePin(temperaturePin, PinOwner::UM_Temperature);
|
pinManager.deallocatePin(temperaturePin, PinOwner::UM_Temperature);
|
||||||
temperaturePin = newTemperaturePin;
|
temperaturePin = newTemperaturePin;
|
||||||
|
pinManager.deallocatePin(parasitePin, PinOwner::UM_Temperature);
|
||||||
// initialise
|
// initialise
|
||||||
setup();
|
setup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
||||||
return !top[FPSTR(_parasite)].isNull();
|
return !top[FPSTR(_parasitePin)].isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
void appendConfigData()
|
||||||
|
{
|
||||||
|
oappend(SET_F("addInfo('")); oappend(SET_F(FPSTR(_name))); oappend(SET_F(":")); oappend(SET_F(FPSTR(_parasite)));
|
||||||
|
oappend(SET_F("',1,'<i>(if no Vcc connected)</i>');")); // 0 is field type, 1 is actual field
|
||||||
|
oappend(SET_F("addInfo('")); oappend(SET_F(FPSTR(_name))); oappend(SET_F(":")); oappend(SET_F(FPSTR(_parasitePin)));
|
||||||
|
oappend(SET_F("',1,'<i>(for external MOSFET)</i>');")); // 0 is field type, 1 is actual field
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t getId()
|
uint16_t getId()
|
||||||
@ -379,3 +400,4 @@ const char UsermodTemperature::_name[] PROGMEM = "Temperature";
|
|||||||
const char UsermodTemperature::_enabled[] PROGMEM = "enabled";
|
const char UsermodTemperature::_enabled[] PROGMEM = "enabled";
|
||||||
const char UsermodTemperature::_readInterval[] PROGMEM = "read-interval-s";
|
const char UsermodTemperature::_readInterval[] PROGMEM = "read-interval-s";
|
||||||
const char UsermodTemperature::_parasite[] PROGMEM = "parasite-pwr";
|
const char UsermodTemperature::_parasite[] PROGMEM = "parasite-pwr";
|
||||||
|
const char UsermodTemperature::_parasitePin[] PROGMEM = "parasite-pwr-pin";
|
||||||
|
Loading…
Reference in New Issue
Block a user