diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index 376e6c74..1cae8cdd 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -19,6 +19,9 @@ build_src_filter = ${nrf52840_base.build_src_filter} +<../variants/promicro> lib_deps= ${nrf52840_base.lib_deps} adafruit/Adafruit SSD1306 @ ^2.5.13 + robtillaart/INA3221 @ ^0.4.1 + robtillaart/INA219 @ ^0.4.1 + adafruit/Adafruit AHTX0@^2.0.5 [env:Faketec_Repeater] extends = Faketec @@ -36,8 +39,6 @@ build_flags = ; -D MESH_DEBUG=1 lib_deps = ${Faketec.lib_deps} adafruit/RTClib @ ^2.1.3 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:Faketec_room_server] extends = Faketec @@ -54,8 +55,6 @@ build_flags = ${Faketec.build_flags} ; -D MESH_DEBUG=1 lib_deps = ${Faketec.lib_deps} adafruit/RTClib @ ^2.1.3 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:Faketec_terminal_chat] extends = Faketec @@ -69,8 +68,6 @@ build_src_filter = ${Faketec.build_src_filter} lib_deps = ${Faketec.lib_deps} densaugeo/base64 @ ~1.4.0 adafruit/RTClib @ ^2.1.3 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:Faketec_companion_radio_usb] extends = Faketec @@ -85,8 +82,6 @@ build_src_filter = ${Faketec.build_src_filter} lib_deps = ${Faketec.lib_deps} adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:Faketec_companion_radio_ble] extends = Faketec @@ -107,8 +102,6 @@ build_src_filter = ${Faketec.build_src_filter} lib_deps = ${Faketec.lib_deps} adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [ProMicroLLCC68] extends = nrf52840_base @@ -125,6 +118,10 @@ build_src_filter = ${nrf52840_base.build_src_filter} + +<../variants/promicro> +lib_deps= ${nrf52840_base.lib_deps} + robtillaart/INA3221 @ ^0.4.1 + robtillaart/INA219 @ ^0.4.1 + adafruit/Adafruit AHTX0@^2.0.5 [env:ProMicroLLCC68_Repeater] extends = ProMicroLLCC68 @@ -138,8 +135,6 @@ build_flags = ${ProMicroLLCC68.build_flags} ; -D MESH_DEBUG=1 lib_deps = ${ProMicroLLCC68.lib_deps} adafruit/RTClib @ ^2.1.3 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:ProMicroLLCC68_room_server] extends = ProMicroLLCC68 @@ -153,8 +148,6 @@ build_flags = ${ProMicroLLCC68.build_flags} ; -D MESH_DEBUG=1 lib_deps = ${ProMicroLLCC68.lib_deps} adafruit/RTClib @ ^2.1.3 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:ProMicroLLCC68_terminal_chat] extends = ProMicroLLCC68 @@ -168,8 +161,6 @@ build_src_filter = ${ProMicroLLCC68.build_src_filter} lib_deps = ${ProMicroLLCC68.lib_deps} densaugeo/base64 @ ~1.4.0 adafruit/RTClib @ ^2.1.3 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:ProMicroLLCC68_companion_radio_usb] extends = ProMicroLLCC68 @@ -183,8 +174,6 @@ build_src_filter = ${ProMicroLLCC68.build_src_filter} lib_deps = ${ProMicroLLCC68.lib_deps} adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 [env:ProMicroLLCC68_companion_radio_ble] extends = ProMicroLLCC68 @@ -204,5 +193,3 @@ build_src_filter = ${ProMicroLLCC68.build_src_filter} lib_deps = ${ProMicroLLCC68.lib_deps} adafruit/RTClib @ ^2.1.3 densaugeo/base64 @ ~1.4.0 - robtillaart/INA3221 @ ^0.4.1 - robtillaart/INA219 @ ^0.4.1 \ No newline at end of file diff --git a/variants/promicro/target.cpp b/variants/promicro/target.cpp index 072395ff..b945fcf4 100644 --- a/variants/promicro/target.cpp +++ b/variants/promicro/target.cpp @@ -77,48 +77,41 @@ mesh::LocalIdentity radio_new_identity() { static INA3221 INA_3221(TELEM_INA3221_ADDRESS, &Wire); static INA219 INA_219(TELEM_INA219_ADDRESS, &Wire); +static Adafruit_AHTX0 AHTX; bool PromicroSensorManager::begin() { - if (INA_3221.begin()) { - MESH_DEBUG_PRINTLN("Found INA3221 at address: %02X", INA_3221.getAddress()); - MESH_DEBUG_PRINTLN("%04X %04X %04X", INA_3221.getDieID(), INA_3221.getManufacturerID(), INA_3221.getConfiguration()); + initINA3221(); + initINA219(); + initAHTX(); - for(int i = 0; i < 3; i++) { - INA_3221.setShuntR(i, TELEM_INA3221_SHUNT_VALUE); - } - INA3221initialized = true; - } else { - INA3221initialized = false; - MESH_DEBUG_PRINTLN("INA3221 was not found at I2C address %02X", TELEM_INA3221_ADDRESS); - } - if (INA_219.begin()) { - MESH_DEBUG_PRINTLN("Found INA219 at address: %02X", INA_219.getAddress()); - INA219_CHANNEL = INA3221initialized ? TELEM_CHANNEL_SELF + 4 : TELEM_CHANNEL_SELF + 1; - INA_219.setMaxCurrentShunt(TELEM_INA219_MAX_CURRENT, TELEM_INA219_SHUNT_VALUE); - INA219initialized = true; - } else { - INA219initialized = false; - MESH_DEBUG_PRINTLN("INA219 was not found at I2C address %02X", TELEM_INA219_ADDRESS); - } return true; } bool PromicroSensorManager::querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) { + int nextAvalableChannel = TELEM_CHANNEL_SELF + 1; if (requester_permissions & TELEM_PERM_ENVIRONMENT) { if (INA3221initialized) { for(int i = 0; i < 3; i++) { // add only enabled INA3221 channels to telemetry if (INA3221_CHANNEL_ENABLED[i]) { - telemetry.addVoltage(INA3221_CHANNELS[i], INA_3221.getBusVoltage(i)); - telemetry.addCurrent(INA3221_CHANNELS[i], INA_3221.getCurrent(i)); - telemetry.addPower(INA3221_CHANNELS[i], INA_3221.getPower(i)); + telemetry.addVoltage(nextAvalableChannel, INA_3221.getBusVoltage(i)); + telemetry.addCurrent(nextAvalableChannel, INA_3221.getCurrent(i)); + telemetry.addPower(nextAvalableChannel, INA_3221.getPower(i)); + nextAvalableChannel++; } } } - if(INA219initialized) { - telemetry.addVoltage(INA219_CHANNEL, INA_219.getBusVoltage()); - telemetry.addCurrent(INA219_CHANNEL, INA_219.getCurrent()); - telemetry.addPower(INA219_CHANNEL, INA_219.getPower()); + if (INA219initialized) { + telemetry.addVoltage(nextAvalableChannel, INA_219.getBusVoltage()); + telemetry.addCurrent(nextAvalableChannel, INA_219.getCurrent()); + telemetry.addPower(nextAvalableChannel, INA_219.getPower()); + nextAvalableChannel++; + } + if (AHTXinitialized) { + sensors_event_t humidity, temp; + AHTX.getEvent(&humidity, &temp); + telemetry.addTemperature(TELEM_CHANNEL_SELF, temp.temperature); + telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity); } } @@ -162,4 +155,40 @@ bool PromicroSensorManager::setSettingValue(const char* name, const char* value) } } return false; -} \ No newline at end of file +} + +void PromicroSensorManager::initINA3221() { + if (INA_3221.begin()) { + MESH_DEBUG_PRINTLN("Found INA3221 at address: %02X", INA_3221.getAddress()); + MESH_DEBUG_PRINTLN("%04X %04X %04X", INA_3221.getDieID(), INA_3221.getManufacturerID(), INA_3221.getConfiguration()); + + for(int i = 0; i < 3; i++) { + INA_3221.setShuntR(i, TELEM_INA3221_SHUNT_VALUE); + } + INA3221initialized = true; + } else { + INA3221initialized = false; + MESH_DEBUG_PRINTLN("INA3221 was not found at I2C address %02X", TELEM_INA3221_ADDRESS); + } +} + +void PromicroSensorManager::initINA219() { + if (INA_219.begin()) { + MESH_DEBUG_PRINTLN("Found INA219 at address: %02X", INA_219.getAddress()); + INA_219.setMaxCurrentShunt(TELEM_INA219_MAX_CURRENT, TELEM_INA219_SHUNT_VALUE); + INA219initialized = true; + } else { + INA219initialized = false; + MESH_DEBUG_PRINTLN("INA219 was not found at I2C address %02X", TELEM_INA219_ADDRESS); + } +} + +void PromicroSensorManager::initAHTX() { + if (AHTX.begin(&Wire, 0, TELEM_AHTX_ADDRESS)) { + MESH_DEBUG_PRINTLN("Found AHT10/AHT20 at address: %02X", TELEM_AHTX_ADDRESS); + AHTXinitialized = true; + } else { + AHTXinitialized = false; + MESH_DEBUG_PRINTLN("AHT10/AHT20 was not found at I2C address %02X", TELEM_AHTX_ADDRESS); + } +} diff --git a/variants/promicro/target.h b/variants/promicro/target.h index aae02dd1..d77c4d1d 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -10,6 +10,7 @@ #include #include #include +#include #define NUM_SENSOR_SETTINGS 3 @@ -26,6 +27,7 @@ mesh::LocalIdentity radio_new_identity(); #define TELEM_INA3221_ADDRESS 0x42 // INA3221 3 channel current sensor I2C address #define TELEM_INA219_ADDRESS 0x40 // INA219 single channel current sensor I2C address +#define TELEM_AHTX_ADDRESS 0x38 // AHT10, AHT20 temperature and humidity sensor I2C address #define TELEM_INA3221_SHUNT_VALUE 0.100 // most variants will have a 0.1 ohm shunts #define TELEM_INA3221_SETTING_CH1 "INA3221-1" @@ -38,13 +40,15 @@ mesh::LocalIdentity radio_new_identity(); class PromicroSensorManager: public SensorManager { bool INA3221initialized = false; bool INA219initialized = false; + bool AHTXinitialized = false; // INA3221 channels in telemetry - int INA3221_CHANNELS[NUM_SENSOR_SETTINGS] = {TELEM_CHANNEL_SELF + 1, TELEM_CHANNEL_SELF + 2, TELEM_CHANNEL_SELF+ 3}; const char * INA3221_CHANNEL_NAMES[NUM_SENSOR_SETTINGS] = { TELEM_INA3221_SETTING_CH1, TELEM_INA3221_SETTING_CH2, TELEM_INA3221_SETTING_CH3}; bool INA3221_CHANNEL_ENABLED[NUM_SENSOR_SETTINGS] = {true, true, true}; - int INA219_CHANNEL; + void initINA3221(); + void initINA219(); + void initAHTX(); public: PromicroSensorManager(){}; bool begin() override;