From a73fa612b4d4132965889de2c5b011f5e8dfe9bb Mon Sep 17 00:00:00 2001 From: Thomas Kunze Date: Mon, 8 Oct 2018 21:51:27 +0200 Subject: [PATCH] add bme680 example --- examples/knx-esp-bme680/bme680.knxprod | Bin 0 -> 41039 bytes examples/knx-esp-bme680/bme680.xml | 98 +++++++++ examples/knx-esp-bme680/knx-bme680.ino | 257 ++++++++++++++++++++++ visualstudio/knx-bme680.vgdbproj | 283 +++++++++++++++++++++++++ 4 files changed, 638 insertions(+) create mode 100644 examples/knx-esp-bme680/bme680.knxprod create mode 100644 examples/knx-esp-bme680/bme680.xml create mode 100644 examples/knx-esp-bme680/knx-bme680.ino create mode 100644 visualstudio/knx-bme680.vgdbproj diff --git a/examples/knx-esp-bme680/bme680.knxprod b/examples/knx-esp-bme680/bme680.knxprod new file mode 100644 index 0000000000000000000000000000000000000000..05f7fbe60508201790c35e0fa6aeabc972d3427a GIT binary patch literal 41039 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 literal 0 HcmV?d00001 diff --git a/examples/knx-esp-bme680/bme680.xml b/examples/knx-esp-bme680/bme680.xml new file mode 100644 index 0000000..5239f18 --- /dev/null +++ b/examples/knx-esp-bme680/bme680.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/knx-esp-bme680/knx-bme680.ino b/examples/knx-esp-bme680/knx-bme680.ino new file mode 100644 index 0000000..1eee699 --- /dev/null +++ b/examples/knx-esp-bme680/knx-bme680.ino @@ -0,0 +1,257 @@ +#include +#include + +// declare array of all groupobjects with their sizes in byte +GroupObject groupObjects[] +{ + GroupObject(2), + GroupObject(2), + GroupObject(2), + GroupObject(2), + GroupObject(2), + GroupObject(1), + GroupObject(2), + GroupObject(2), + GroupObject(1), + GroupObject(2) +} +; + +// create named references for easy access to group objects +GroupObject& goRawTemperature = groupObjects[0]; +GroupObject& goPressure = groupObjects[1]; +GroupObject& goRawHumidity = groupObjects[2]; +GroupObject& goGasResistance = groupObjects[3]; +GroupObject& goIaqEstimate = groupObjects[4]; +GroupObject& goIaqAccurace = groupObjects[5]; +GroupObject& goTemperature = groupObjects[6]; +GroupObject& goHumidity = groupObjects[7]; +GroupObject& goTriggerSample = groupObjects[8]; +GroupObject& goCo2Ppm = groupObjects[9]; + +#define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // 360 minutes - 4 times a day + +// Helper functions declarations +void checkIaqSensorStatus(void); +void errLeds(void); +uint8_t* saveBme680State(uint8_t* buffer); +uint8_t* loadBme680State(uint8_t* buffer); +void triggerCallback(GroupObject& go); +void updateState(); + +///const uint8_t bsec_config_iaq[304] = +// { 0, 6, 4, 1, 61, 0, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 40, 0, 1, 0, 137, 65, 0, 63, 0, 0, 64, 63, 205, 204, 76, 62, 0, 0, 225, 68, 0, 192, 168, 71, 0, 0, 0, 0, 0, 80, 10, 90, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 2, 0, 0, 244, 1, 225, 0, 25, 10, 144, 1, 0, 0, 112, 65, 0, 0, 0, 63, 16, 0, 3, 0, 10, 215, 163, 60, 10, 215, 35, 59, 10, 215, 35, 59, 9, 0, 5, 0, 0, 0, 0, 0, 1, 51, 0, 9, 0, 10, 215, 163, 59, 205, 204, 204, 61, 225, 122, 148, 62, 41, 92, 15, 61, 0, 0, 0, 63, 0, 0, 0, 63, 154, 153, 89, 63, 154, 153, 25, 62, 1, 1, 0, 0, 128, 63, 6, 236, 81, 184, 61, 51, 51, 131, 64, 12, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 254, 0, 2, 1, 5, 48, 117, 100, 0, 44, 1, 151, 7, 132, 3, 197, 0, 144, 1, 64, 1, 64, 1, 48, 117, 48, 117, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 48, 117, 100, 0, 100, 0, 48, 117, 100, 0, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 100, 0, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 44, 1, 0, 0, 0, 0, 98, 149, 0, 0 }; +const uint8_t bsec_config_iaq[304] = + { 0, 6, 4, 1, 61, 0, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 40, 0, 1, 0, 137, 65, 0, 63, 0, 0, 64, 63, 205, 204, 76, 62, 0, 0, 225, 68, 0, 168, 19, 73, 0, 0, 0, 0, 0, 80, 10, 90, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 2, 0, 0, 244, 1, 225, 0, 25, 10, 144, 1, 0, 0, 112, 65, 0, 0, 0, 63, 16, 0, 3, 0, 10, 215, 163, 60, 10, 215, 35, 59, 10, 215, 35, 59, 9, 0, 5, 0, 0, 0, 0, 0, 1, 51, 0, 9, 0, 10, 215, 163, 59, 205, 204, 204, 61, 225, 122, 148, 62, 41, 92, 15, 61, 0, 0, 0, 63, 0, 0, 0, 63, 154, 153, 89, 63, 154, 153, 25, 62, 1, 1, 0, 0, 128, 63, 6, 236, 81, 184, 61, 51, 51, 131, 64, 12, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 254, 0, 2, 1, 5, 48, 117, 100, 0, 44, 1, 151, 7, 132, 3, 197, 0, 144, 1, 64, 1, 64, 1, 48, 117, 48, 117, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 48, 117, 100, 0, 100, 0, 48, 117, 100, 0, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 100, 0, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 44, 1, 0, 0, 0, 0, 253, 222, 0, 0 }; + + +// Create an object of the class Bsec +Bsec iaqSensor; +uint16_t stateUpdateCounter = 0; +uint8_t sendCounter = 0; +uint32_t cyclSend = 0; +bool trigger = false; + +// Entry point for the example +void setup(void) +{ + Serial.begin(115200); + delay(5000); + Serial.println("start"); + // register group objects + knx.registerGroupObjects(groupObjects, 10); + + // read adress table, association table, groupobject table and parameters from eeprom + knx.readMemory(); + + // register callback for reset GO + goTriggerSample.updateHandler = triggerCallback; + + + iaqSensor.begin(BME680_I2C_ADDR_SECONDARY, Wire); + checkIaqSensorStatus(); + + iaqSensor.setConfig(bsec_config_iaq); + checkIaqSensorStatus(); + + bsec_virtual_sensor_t sensorList[7] = { + BSEC_OUTPUT_RAW_TEMPERATURE, + BSEC_OUTPUT_RAW_PRESSURE, + BSEC_OUTPUT_RAW_HUMIDITY, + BSEC_OUTPUT_RAW_GAS, + BSEC_OUTPUT_IAQ_ESTIMATE, + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE, + BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY, + }; + + knx.setSaveCallback(saveBme680State); + knx.setRestoreCallback(loadBme680State); + + if (knx.configured()) + { + cyclSend = knx.paramInt(0); + Serial.printf("Zykl. send: %d\n", cyclSend); + } + + // start the framework. Will get wifi first. + knx.start(); + + iaqSensor.updateSubscription(sensorList, 7, BSEC_SAMPLE_RATE_LP); + checkIaqSensorStatus(); + String output = "Timestamp [ms], raw temperature [°C], pressure [hPa], raw relative humidity [%], gas [Ohm], IAQ, IAQ accuracy, temperature [°C], relative humidity [%]"; + Serial.println(output); +} + +// Function that is looped forever +void loop(void) +{ + // don't delay here to much. Otherwise you might lose packages or mess up the timing with ETS + knx.loop(); + + // only run the application code if the device was configured with ETS + if(!knx.configured()) + return; + + if (iaqSensor.run()) + { + String output = String(millis()); + output += ", " + String(iaqSensor.rawTemperature); + output += ", " + String(iaqSensor.pressure); + output += ", " + String(iaqSensor.rawHumidity); + output += ", " + String(iaqSensor.gasResistance); + output += ", " + String(iaqSensor.iaqEstimate); + output += ", " + String(iaqSensor.iaqAccuracy); + output += ", " + String(iaqSensor.temperature); + output += ", " + String(iaqSensor.humidity); + Serial.println(output); + updateState(); + + if (sendCounter++ == cyclSend || trigger) + { + sendCounter = 0; + trigger = false; + + goRawTemperature.objectWrite(iaqSensor.rawTemperature); + goPressure.objectWrite(iaqSensor.pressure); + goRawHumidity.objectWrite(iaqSensor.rawHumidity); + goGasResistance.objectWrite(iaqSensor.gasResistance); + goIaqEstimate.objectWrite(iaqSensor.iaqEstimate); + goIaqAccurace.objectWrite(iaqSensor.iaqAccuracy); + goTemperature.objectWrite(iaqSensor.temperature); + goHumidity.objectWrite(iaqSensor.humidity); + } + } + else { + checkIaqSensorStatus(); + } +} + +// Helper function definitions +void checkIaqSensorStatus(void) +{ + if (iaqSensor.status != BSEC_OK) { + if (iaqSensor.status < BSEC_OK) { + String output = "BSEC error code : " + String(iaqSensor.status); + Serial.println(output); + for (;;) + errLeds(); /* Halt in case of failure */ + } + else { + String output = "BSEC warning code : " + String(iaqSensor.status); + Serial.println(output); + } + } + + if (iaqSensor.bme680Status != BME680_OK) { + if (iaqSensor.bme680Status < BME680_OK) { + String output = "BME680 error code : " + String(iaqSensor.bme680Status); + Serial.println(output); + for (;;) + errLeds(); /* Halt in case of failure */ + } + else { + String output = "BME680 warning code : " + String(iaqSensor.bme680Status); + Serial.println(output); + } + } +} + +void errLeds(void) +{ + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, HIGH); + delay(100); + digitalWrite(LED_BUILTIN, LOW); + delay(100); +} + +uint8_t* loadBme680State(uint8_t* buffer) +{ + // Existing state in EEPROM + Serial.println("Reading state from EEPROM"); + + for (uint8_t i = 0; i < BSEC_MAX_STATE_BLOB_SIZE; i++) { + Serial.println(buffer[i], HEX); + } + + iaqSensor.setState(buffer); + checkIaqSensorStatus(); + return buffer + BSEC_MAX_STATE_BLOB_SIZE; +} + +uint8_t* saveBme680State(uint8_t* buffer) +{ + iaqSensor.getState(buffer); + checkIaqSensorStatus(); + + Serial.println("Writing state to EEPROM"); + + for (uint8_t i = 0; i < BSEC_MAX_STATE_BLOB_SIZE; i++) { + Serial.println(buffer[i], HEX); + } + return buffer + BSEC_MAX_STATE_BLOB_SIZE; +} + +void updateState(void) +{ + bool update = false; + if (stateUpdateCounter == 0) { + /* First state update when IAQ accuracy is >= 1 */ + if (iaqSensor.iaqAccuracy >= 3) { + update = true; + stateUpdateCounter++; + } + } + else { + /* Update every STATE_SAVE_PERIOD minutes */ + if ((stateUpdateCounter * STATE_SAVE_PERIOD) < millis()) { + update = true; + stateUpdateCounter++; + } + } + + if (update) { + knx.writeMemory(); + } +} + +// callback from trigger-GO +void triggerCallback(GroupObject& go) +{ + Serial.println("trigger"); + Serial.println(go.objectReadBool()); + if (!go.objectReadBool()) + return; + + trigger = true; + /* We call bsec_update_subscription() in order to instruct BSEC to perform an extra measurement at the next + possible time slot + */ + Serial.println("Triggering ULP plus."); + bsec_virtual_sensor_t sensorList[1] = { + BSEC_OUTPUT_IAQ_ESTIMATE, + }; + + iaqSensor.updateSubscription(sensorList, 1, BSEC_SAMPLE_RATE_ULP_MEASUREMENT_ON_DEMAND); + checkIaqSensorStatus(); +} \ No newline at end of file diff --git a/visualstudio/knx-bme680.vgdbproj b/visualstudio/knx-bme680.vgdbproj new file mode 100644 index 0000000..86b5086 --- /dev/null +++ b/visualstudio/knx-bme680.vgdbproj @@ -0,0 +1,283 @@ + + + Release + + + + Unknown + + + 58afeecd-06e2-4bb7-a13f-e1d5dbaed13f + true + true + ..\examples\knx-esp-bme680 + basic_config_state_ulp_plus.ino + + + + knx-bme680.ino + + + + + + + + .. + ..\.. + + Output\$(PlatformName.defuse)\$(ConfigurationName.defuse) + false + + + + + + + + + + + + + Default + + + + COM5 + + 115200 + 8 + None + One + None + + + 0 + false + false + true + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + true + true + true + + + + true + + + + + True + + true + true + + Enabled + true + true + true + + true + + + + false + + apiModeling.google.GTest + core.builtin.BuiltinFunctions + core.builtin.NoReturnFunctions + core.CallAndMessage + core.DivideZero + core.DynamicTypePropagation + core.NonnilStringConstants + core.NonNullParamChecker + core.NullDereference + core.StackAddressEscape + core.UndefinedBinaryOperatorResult + core.uninitialized.ArraySubscript + core.uninitialized.Assign + core.uninitialized.Branch + core.uninitialized.CapturedBlockVariable + core.uninitialized.UndefReturn + core.VLASize + cplusplus.NewDelete + cplusplus.NewDeleteLeaks + cplusplus.SelfAssignment + deadcode.DeadStores + nullability.NullPassedToNonnull + nullability.NullReturnedFromNonnull + security.insecureAPI.getpw + security.insecureAPI.gets + security.insecureAPI.mkstemp + security.insecureAPI.mktemp + security.insecureAPI.UncheckedReturn + security.insecureAPI.vfork + unix.API + unix.cstring.BadSizeArg + unix.cstring.NullArg + unix.Malloc + unix.MallocSizeof + unix.MismatchedDeallocator + unix.StdCLibraryFunctions + unix.Vfork + + + -analyzer-store=region + -analyzer-opt-analyze-nested-blocks + -analyzer-eagerly-assume + + + + + + NodeMCU 1 0 (ESP-12E Module) + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + main + true + false + false + false + 0 + + + gdbstub + + 74880 + 115200 + 50 + !DTR;RTS;SLEEP;DTR;!RTS;SLEEP;!DTR;SLEEP + Enabled + false + + size4M + freq40M + QIO + + + + true + Disabled + 0 + false + false + true + false + false + + _estack + 0 + false + true + + + esp8266:esp8266:nodemcuv2 + COM5 + + + + CpuFrequency + 80 + + + VTable + flash + + + FlashSize + 4M1M + + + LwIPVariant + v2mss536 + + + Debug + Serial + + + DebugLevel + None____ + + + FlashErase + none + + + UploadSpeed + 115200 + + + + Sketch + + + + + \ No newline at end of file