diff --git a/firmware-esp8266.ino b/firmware-esp8266.ino index d856db8..3fce259 100644 --- a/firmware-esp8266.ino +++ b/firmware-esp8266.ino @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Added Digital Sensor Switch Support, Improved MQTT Setup Routine v32 - Added MQTT Support! v31 - Fixed an issue with DHT11 Sensors @@ -27,7 +28,7 @@ Display* display = NULL; -int currentVersion = 33; +int currentVersion = 34; boolean printMemory = false; String board = "Generic"; diff --git a/src/communication/MQTT.cpp b/src/communication/MQTT.cpp index 3c104ca..1a3a881 100644 --- a/src/communication/MQTT.cpp +++ b/src/communication/MQTT.cpp @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Added Digital Sensor Switch Support v32 - Added MQTT Support! */ @@ -106,7 +107,7 @@ void MQTT::publishForAutoDiscovery(Sensor* sensor) if(category==NULL) category = "Unnamed"; - if(sensor->getMqttClass()=="resistance" || sensor->getMqttClass()=="altitude" || sensor->getMqttClass()=="flux" || sensor->getMqttClass()=="" || sensor->getMqttClass()=="raw") + if(sensor->getMqttClass()=="plevel" || sensor->getMqttClass()=="resistance" || sensor->getMqttClass()=="altitude" || sensor->getMqttClass()=="flux" || sensor->getMqttClass()=="" || sensor->getMqttClass()=="raw" || sensor->getMqttClass()=="voltage") { pPayload = "{\"name\": \""+sensor->getName()+"\", \"state_topic\": \"Sensate/"+category+"/"+sensor->getName()+"/value\""; if(sensor->isBinary()) diff --git a/src/controller/Bridge.cpp b/src/controller/Bridge.cpp index e983e7c..3791d0d 100644 --- a/src/controller/Bridge.cpp +++ b/src/controller/Bridge.cpp @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Added Digital Sensor Switch Support v32 - Added MQTT Support! v29 - First Public Release @@ -604,6 +605,9 @@ void tryInitMQTT() { void configureExpansionPort(int portNumber, JsonObject& portConfig) { Serial.println("Configure Expansion Port: "); + + portConfig.prettyPrintTo(Serial); + Serial.println(""); SensorCalculation* calc = NULL; @@ -641,6 +645,8 @@ void configureExpansionPort(int portNumber, JsonObject& portConfig) { calc = new SensorCalculationRawToPercent(portConfig["c1"], portConfig["c2"], portNumber); else if (portConfig["s"]["cf"] == "RAW") calc = new SensorCalculationRaw(portNumber); + else if (portConfig["s"]["cf"] == "CALC_RAW_VREF") + calc = new SensorCalculationRawToVoltage(portConfig["c1"], portConfig["c2"], portNumber); if(calc==NULL) { @@ -709,6 +715,7 @@ void configurePort(int portNumber, JsonObject& portConfig) { Serial.println("Configure Onboard Port:" + port); portConfig.prettyPrintTo(Serial); + Serial.println(""); SensorCalculation* calc = NULL; @@ -746,6 +753,8 @@ void configurePort(int portNumber, JsonObject& portConfig) { calc = new SensorCalculationRawToPercent(portConfig["c1"], portConfig["c2"], portNumber); else if (portConfig["s"]["cf"] == "RAW") calc = new SensorCalculationRaw(portNumber); + else if (portConfig["s"]["cf"] == "CALC_RAW_VREF") + calc = new SensorCalculationRawToVoltage(portConfig["c1"], portConfig["c2"], portNumber); if(calc==NULL) { diff --git a/src/input/SensorCalculation.cpp b/src/input/SensorCalculation.cpp index b20316b..719fff2 100644 --- a/src/input/SensorCalculation.cpp +++ b/src/input/SensorCalculation.cpp @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Added Digital Sensor Switch Support v32 - Added MQTT Support! v29 - First Public Release @@ -161,13 +162,22 @@ SensorCalculationCalcAltitude::SensorCalculationCalcAltitude(int portNumber) : S SensorCalculationRawToPercent::SensorCalculationRawToPercent(float calcValue1, float calcValue2, int portNumber) : SensorCalculation() { - _valueType = "humidity"; + _valueType = "plevel"; _valueUnit = "%"; _portNumber = portNumber; _calcValue1 = calcValue1; _calcValue2 = calcValue2; } +SensorCalculationRawToVoltage::SensorCalculationRawToVoltage(float calcValue1, float calcValue2, int portNumber) : SensorCalculation() +{ + _valueType = "voltage"; + _valueUnit = "V"; + _portNumber = portNumber; + _calcValue1 = calcValue1; + _calcValue2 = calcValue2; +} + SensorCalculationRaw::SensorCalculationRaw(int portNumber) : SensorCalculation() { _valueType = "raw"; @@ -352,17 +362,32 @@ Data* SensorCalculationRawToPercent::calculate(Sensor* sensor, float rawValue, b return new Data (sensor, percent, "PERCENT"); } +Data* SensorCalculationRawToVoltage::calculate(Sensor* sensor, float rawValue, bool postData) +{ + float refVoltage = _calcValue1; + float maxADCValue = _calcValue2; + + float rawVoltage = rawValue / maxADCValue; + float vResult = rawVoltage * refVoltage; + + if(display!=NULL && _portNumber>=0) + display->drawValue(_portNumber, sensor->getName(), sensor->getShortName(), vResult, _valueUnit); + if(!postData) + return NULL; + return new Data (sensor, vResult, "VOLT"); +} + Data* SensorCalculationRaw::calculate(Sensor* sensor, float rawValue, bool postData) { if(display!=NULL && _portNumber>=0) display->drawValue(_portNumber, sensor->getName(), sensor->getShortName(), rawValue, _valueUnit); if(!postData) return NULL; - return new Data (sensor, rawValue, "UNKNOWN"); + return new Data (sensor, rawValue, "NONE"); } Data* SensorCalculationRaw::calculate(Sensor* sensor, bool boolValue, bool postData) -{ +{ if(display!=NULL && _portNumber>=0) display->drawValue(_portNumber, sensor->getName(), sensor->getShortName(), boolValue, "ON", "OFF"); if(!postData) diff --git a/src/input/SensorCalculation.h b/src/input/SensorCalculation.h index e32152a..296759d 100644 --- a/src/input/SensorCalculation.h +++ b/src/input/SensorCalculation.h @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Added Digital Sensor Switch Support v32 - Added MQTT Support! v29 - First Public Release @@ -153,5 +154,13 @@ class SensorCalculationRaw : public SensorCalculation { Data* calculate(Sensor* sensor, bool, bool); }; +class SensorCalculationRawToVoltage : public SensorCalculation { + private: + float _calcValue1,_calcValue2; + public: + SensorCalculationRawToVoltage(float, float, int); + Data* calculate(Sensor* sensor, float, bool); +}; + #endif \ No newline at end of file diff --git a/src/input/analog/SensorAnalogue.cpp b/src/input/analog/SensorAnalogue.cpp index 8509f71..78d0513 100644 --- a/src/input/analog/SensorAnalogue.cpp +++ b/src/input/analog/SensorAnalogue.cpp @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Changes for Digital Sensor Switch Support v29 - First Public Release v32 - Added MQTT Support! @@ -44,16 +45,16 @@ Data* SensorAnalogue::read(bool shouldPostData) for (int i = 0; i < 10; i++) { - adc = adc + (float) analogRead(0); // ADC = A0 + adc = adc + (float) analogRead(0); // ADC = A0 } - adc = adc / (float)10; + adc = adc / 10.0; if(!std::isinf(adc)) { if(_rSplit!=0) { - double rT = ((double) adc)*_rSplit/(1024-adc); + double rT = ((double) adc)*_rSplit/(1023-adc); shouldPostData = smartSensorCheck(rT, _smartValueThreshold, shouldPostData); return _calculation->calculate(this, (float)rT, shouldPostData); } diff --git a/src/input/i2c/Ads1x15.cpp b/src/input/i2c/Ads1x15.cpp index 729951f..2390fe0 100644 --- a/src/input/i2c/Ads1x15.cpp +++ b/src/input/i2c/Ads1x15.cpp @@ -11,6 +11,7 @@ SOURCE: https://github.com/sensate-io/firmware-esp8266.git @section HISTORY + v34 - Added Generic Analog Sensor Support v33 - Changes for Digital Sensor Switch Support v32 - Added MQTT Support! v29 - First Public Release @@ -41,8 +42,13 @@ Ads1x15::Ads1x15 (long id, String category, String shortName, String name, Strin if (!init48) { init48 = true; - ads1x15_48 = new Adafruit_ADS1015(0x48); - ads1x15_48->setGain(GAIN_ONE); + + if(type == "ADS1115") + ads1x15_48 = new Adafruit_ADS1115(0x48); + else + ads1x15_48 = new Adafruit_ADS1015(0x48); + + ads1x15_48->setGain(GAIN_TWOTHIRDS); ads1x15_48->begin(); } ads1x15 = ads1x15_48; @@ -51,8 +57,13 @@ Ads1x15::Ads1x15 (long id, String category, String shortName, String name, Strin if (!init49) { init49 = true; - ads1x15_49 = new Adafruit_ADS1015(0x49); - ads1x15_49->setGain(GAIN_ONE); + + if(type == "ADS1115") + ads1x15_48 = new Adafruit_ADS1115(0x49); + else + ads1x15_49 = new Adafruit_ADS1015(0x49); + + ads1x15_49->setGain(GAIN_TWOTHIRDS); ads1x15_49->begin(); } ads1x15 = ads1x15_49; @@ -62,8 +73,13 @@ Ads1x15::Ads1x15 (long id, String category, String shortName, String name, Strin if (!init4A) { init4A = true; - ads1x15_4A = new Adafruit_ADS1015(0x4A); - ads1x15_4A->setGain(GAIN_ONE); + + if(type == "ADS1115") + ads1x15_48 = new Adafruit_ADS1115(0x4A); + else + ads1x15_4A = new Adafruit_ADS1015(0x4A); + + ads1x15_4A->setGain(GAIN_TWOTHIRDS); ads1x15_4A->begin(); } ads1x15 = ads1x15_4A; @@ -72,8 +88,13 @@ Ads1x15::Ads1x15 (long id, String category, String shortName, String name, Strin if (!init4B) { init4B = true; - ads1x15_4B = new Adafruit_ADS1015(0x4B); - ads1x15_4B->setGain(GAIN_ONE); + + if(type == "ADS1115") + ads1x15_48 = new Adafruit_ADS1115(0x4B); + else + ads1x15_4B = new Adafruit_ADS1015(0x4B); + + ads1x15_4B->setGain(GAIN_TWOTHIRDS); ads1x15_4B->begin(); } ads1x15 = ads1x15_4B; @@ -93,7 +114,7 @@ Data* Ads1x15::read(bool shouldPostData) for (int i = 0; i < numberOfSamples; i++) { adcMax = adcMax + (float) ads1x15->readADC_SingleEnded(0); - + if (_channel == 1) adc = adc + (float) ads1x15->readADC_SingleEnded(1); if (_channel == 2) @@ -108,9 +129,8 @@ Data* Ads1x15::read(bool shouldPostData) if (adc >= adcMax-20) adc = adcMax; - if(_preResistor!=0 && _postResistor!=0) + if((_preResistor!=0 && _postResistor!=0) || (_preResistor==0 && _postResistor==0)) { - adc = adc/adcMax*1024; shouldPostData = smartSensorCheck(adc, _smartValueThreshold, shouldPostData); return _calculation->calculate(this, adc, shouldPostData); }