diff --git a/src/configuration.h b/src/configuration.h
index ac8f9435a7..ec32c72d1d 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -111,6 +111,7 @@ along with this program. If not, see .
#define MCP9808_ADDR 0x18
#define INA_ADDR 0x40
#define INA_ADDR_ALTERNATE 0x41
+#define INA_ADDR_WAVESHARE_UPS 0x43
#define INA3221_ADDR 0x42
#define QMC6310_ADDR 0x1C
#define QMI8658_ADDR 0x6B
diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp
index b6eca5fa4c..146daa3dcf 100644
--- a/src/detect/ScanI2CTwoWire.cpp
+++ b/src/detect/ScanI2CTwoWire.cpp
@@ -183,8 +183,13 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
case ATECC608B_ADDR:
- type = ATECC608B;
- if (atecc.begin(addr.address) == true) {
+#ifdef RP2040_SLOW_CLOCK
+ if (atecc.begin(addr.address, Wire, Serial2) == true)
+#else
+ if (atecc.begin(addr.address) == true)
+#endif
+
+ {
LOG_INFO("ATECC608B initialized\n");
} else {
LOG_WARN("ATECC608B initialization failed\n");
@@ -254,6 +259,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
case INA_ADDR:
case INA_ADDR_ALTERNATE:
+ case INA_ADDR_WAVESHARE_UPS:
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFE), 2);
LOG_DEBUG("Register MFG_UID: 0x%x\n", registerValue);
if (registerValue == 0x5449) {
diff --git a/src/modules/Telemetry/Sensor/INA219Sensor.cpp b/src/modules/Telemetry/Sensor/INA219Sensor.cpp
index 5a1faa99ff..ecb5643686 100644
--- a/src/modules/Telemetry/Sensor/INA219Sensor.cpp
+++ b/src/modules/Telemetry/Sensor/INA219Sensor.cpp
@@ -4,6 +4,10 @@
#include "configuration.h"
#include
+#ifndef INA219_MULTIPLIER
+#define INA219_MULTIPLIER 1.0f
+#endif
+
INA219Sensor::INA219Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_INA219, "INA219") {}
int32_t INA219Sensor::runOnce()
@@ -26,7 +30,7 @@ void INA219Sensor::setup() {}
bool INA219Sensor::getMetrics(meshtastic_Telemetry *measurement)
{
measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V();
- measurement->variant.environment_metrics.current = ina219.getCurrent_mA();
+ measurement->variant.environment_metrics.current = ina219.getCurrent_mA() * INA219_MULTIPLIER;
return true;
}
diff --git a/variants/rpipico-slowclock/platformio.ini b/variants/rpipico-slowclock/platformio.ini
new file mode 100644
index 0000000000..e583c4b0d5
--- /dev/null
+++ b/variants/rpipico-slowclock/platformio.ini
@@ -0,0 +1,28 @@
+[env:pico_slowclock]
+extends = rp2040_base
+board = rpipico
+upload_protocol = jlink
+# debug settings for external openocd with RP2040 support (custom build)
+debug_tool = custom
+debug_init_cmds =
+ target extended-remote localhost:3333
+ $INIT_BREAK
+ monitor reset halt
+ $LOAD_CMDS
+ monitor init
+ monitor reset halt
+
+# add our variants files to the include and src paths
+build_flags = ${rp2040_base.build_flags}
+ -DRPI_PICO
+ -Ivariants/rpipico_slowclock
+ -DDEBUG_RP2040_PORT=Serial2
+ -DHW_SPI1_DEVICE
+ -L "${platformio.libdeps_dir}/${this.__env__}/BSEC2 Software Library/src/cortex-m0plus"
+ -g
+ -DNO_USB
+lib_deps =
+ ${rp2040_base.lib_deps}
+debug_build_flags = ${rp2040_base.build_flags}
+ -g
+ -DNO_USB
\ No newline at end of file
diff --git a/variants/rpipico-slowclock/variant.h b/variants/rpipico-slowclock/variant.h
new file mode 100644
index 0000000000..fb97ec0fbf
--- /dev/null
+++ b/variants/rpipico-slowclock/variant.h
@@ -0,0 +1,87 @@
+#define ARDUINO_ARCH_AVR
+
+// Build with slow system clock enabled to reduce power consumption.
+#define RP2040_SLOW_CLOCK
+
+#ifdef RP2040_SLOW_CLOCK
+// Redefine UART1 serial log output to avoid collision with UART0 for GPS.
+#define SERIAL2_TX 4
+#define SERIAL2_RX 5
+// Reroute log output in SensorLib when USB is not available
+#define log_e(...) Serial2.printf(__VA_ARGS__)
+#define log_i(...) Serial2.printf(__VA_ARGS__)
+#define log_d(...) Serial2.printf(__VA_ARGS__)
+#endif
+
+// Expecting the Waveshare Pico GPS hat
+#define HAS_GPS 1
+
+// Enable OLED Screen
+#define HAS_SCREEN 1
+#define USE_SH1106 1
+#define RESET_OLED 13
+
+// Redefine I2C0 pins to avoid collision with UART1/Serial2.
+#define I2C_SDA 8
+#define I2C_SCL 9
+
+// Redefine Waveshare UPS-A/B I2C_1 pins:
+#define I2C_SDA1 6
+#define I2C_SCL1 7
+// Waveshare UPS-A/B uses a 0.01 Ohm shunt for the INA219 sensor
+#define INA219_MULTIPLIER 10.0f
+
+// Waveshare Pico GPS L76B pins:
+#define GPS_RX_PIN 1
+#define GPS_TX_PIN 0
+
+// Wakeup from backup mode
+// #define PIN_GPS_FORCE_ON 14
+// No GPS reset available
+#undef PIN_GPS_RESET
+/*
+ * For PPS output the resistor R20 needs to be populated with 0 Ohm
+ * on the Waveshare Pico GPS board.
+ */
+#define PIN_GPS_PPS 16
+/*
+ * For standby mode switching the resistor R18 needs to be populated
+ * with 0 Ohm on the Waveshare Pico GPS board.
+ */
+#define PIN_GPS_STANDBY 17
+
+#define BUTTON_PIN 18
+#define EXT_NOTIFY_OUT 22
+#define LED_PIN PIN_LED
+
+#define BATTERY_PIN 26
+// ratio of voltage divider = 3.0 (R17=200k, R18=100k)
+#define ADC_MULTIPLIER 3.1 // 3.0 + a bit for being optimistic
+#define BATTERY_SENSE_RESOLUTION_BITS ADC_RESOLUTION
+
+#define USE_SX1262
+
+#undef LORA_SCK
+#undef LORA_MISO
+#undef LORA_MOSI
+#undef LORA_CS
+
+#define LORA_SCK 10
+#define LORA_MISO 12
+#define LORA_MOSI 11
+#define LORA_CS 3
+
+#define LORA_DIO0 RADIOLIB_NC
+#define LORA_RESET 15
+#define LORA_DIO1 20
+#define LORA_DIO2 2
+#define LORA_DIO3 RADIOLIB_NC
+
+#ifdef USE_SX1262
+#define SX126X_CS LORA_CS
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+#define SX126X_DIO2_AS_RF_SWITCH
+#define SX126X_DIO3_TCXO_VOLTAGE 1.8
+#endif
\ No newline at end of file