Merge pull request #811 from fdlamotte/tracker_l1_environment_sensors

Tracker l1: environment sensors
This commit is contained in:
ripplebiz
2025-09-23 15:34:22 +10:00
committed by GitHub
6 changed files with 30 additions and 134 deletions

View File

@@ -70,7 +70,7 @@ static Adafruit_INA260 INA260;
#define TELEM_INA226_SHUNT_VALUE 0.100
#define TELEM_INA226_MAX_AMP 0.8
#include <INA226.h>
static INA226 INA226(TELEM_INA226_ADDRESS);
static INA226 INA226(TELEM_INA226_ADDRESS, TELEM_WIRE);
#endif
#if ENV_INCLUDE_MLX90614
@@ -108,7 +108,13 @@ bool EnvironmentSensorManager::begin() {
#endif
#if ENV_PIN_SDA && ENV_PIN_SCL
#ifdef NRF52_PLATFORM
Wire1.setPins(ENV_PIN_SDA, ENV_PIN_SCL);
Wire1.setClock(100000);
Wire1.begin();
#else
Wire1.begin(ENV_PIN_SDA, ENV_PIN_SCL, 100000);
#endif
MESH_DEBUG_PRINTLN("Second I2C initialized on pins SDA: %d SCL: %d", ENV_PIN_SDA, ENV_PIN_SCL);
#endif

View File

@@ -3,6 +3,7 @@ extends = nrf52_base
board = seeed-wio-tracker-l1
board_build.ldscript = boards/nrf52840_s140_v7.ld
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-I lib/nrf52/s140_nrf52_7.3.0_API/include
-I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52
-I variants/wio-tracker-l1
@@ -22,18 +23,19 @@ build_flags = ${nrf52_base.build_flags}
-D DISPLAY_ROTATION=1
-D DISABLE_DIAGNOSTIC_OUTPUT
-D AUTO_OFF_MILLIS=0
-D GPS_BAUD_RATE=9600
-D ENV_PIN_SDA=PIN_WIRE1_SDA
-D ENV_PIN_SCL=PIN_WIRE1_SCL
build_src_filter = ${nrf52_base.build_src_filter}
+<WioTrackerL1Board.cpp>
+<../variants/wio-tracker-l1>
+<helpers/ui/GxEPDDisplay.cpp>
+<helpers/sensors>
lib_deps= ${nrf52_base.lib_deps}
adafruit/Adafruit SH110X @ ^2.1.13
${sensor_base.lib_deps}
adafruit/Adafruit GFX Library @ ^1.12.1
stevemarple/MicroNMEA @ ^2.0.6
zinggjm/GxEPD2 @ 1.6.2
bakercp/CRC32 @ ^2.0.0
adafruit/Adafruit BME280 Library @ ^2.3.0
[env:WioTrackerL1Eink_companion_radio_ble]
extends = WioTrackerL1Eink
@@ -51,7 +53,7 @@ build_flags = ${WioTrackerL1Eink.build_flags}
-D QSPIFLASH=1
; -D MESH_PACKET_LOGGING=1
; -D MESH_DEBUG=1
-D UI_RECENT_LIST_SIZE=9
-D UI_RECENT_LIST_SIZE=6
-D UI_SENSORS_PAGE=1
build_src_filter = ${WioTrackerL1Eink.build_src_filter}
+<helpers/nrf52/SerialBLEInterface.cpp>

View File

@@ -3,6 +3,7 @@ extends = nrf52_base
board = seeed-wio-tracker-l1
board_build.ldscript = boards/nrf52840_s140_v7.ld
build_flags = ${nrf52_base.build_flags}
${sensor_base.build_flags}
-I lib/nrf52/s140_nrf52_7.3.0_API/include
-I lib/nrf52/s140_nrf52_7.3.0_API/include/nrf52
-I variants/wio-tracker-l1
@@ -13,16 +14,18 @@ build_flags = ${nrf52_base.build_flags}
-D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1
-D PIN_OLED_RESET=-1
; -D MESH_DEBUG=1
-D GPS_BAUD_RATE=9600
-D ENV_PIN_SDA=PIN_WIRE1_SDA
-D ENV_PIN_SCL=PIN_WIRE1_SCL
build_src_filter = ${nrf52_base.build_src_filter}
+<WioTrackerL1Board.cpp>
+<../variants/wio-tracker-l1>
+<helpers/ui/SH1106Display.cpp>
+<helpers/sensors>
lib_deps= ${nrf52_base.lib_deps}
${sensor_base.lib_deps}
adafruit/Adafruit SH110X @ ^2.1.13
adafruit/Adafruit GFX Library @ ^1.12.1
stevemarple/MicroNMEA @ ^2.0.6
[env:WioTrackerL1_Repeater]
extends = WioTrackerL1

View File

@@ -11,8 +11,13 @@ WRAPPER_CLASS radio_driver(radio, board);
VolatileRTCClock fallback_clock;
AutoDiscoverRTCClock rtc_clock(fallback_clock);
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1);
WioTrackerL1SensorManager sensors = WioTrackerL1SensorManager(nmea);
#ifdef ENV_INCLUDE_GPS
MicroNMEALocationProvider nmea = MicroNMEALocationProvider(Serial1, &rtc_clock);
EnvironmentSensorManager sensors = EnvironmentSensorManager(nmea);
#else
EnvironmentSensorManager sensors = EnvironmentSensorManager();
#endif
#ifdef DISPLAY_CLASS
DISPLAY_CLASS display;
@@ -42,107 +47,6 @@ void radio_set_tx_power(uint8_t dbm) {
radio.setOutputPower(dbm);
}
void WioTrackerL1SensorManager::start_gps()
{
if (!gps_active)
{
MESH_DEBUG_PRINTLN("starting GPS");
digitalWrite(PIN_GPS_STANDBY, HIGH);
gps_active = true;
}
}
void WioTrackerL1SensorManager::stop_gps()
{
if (gps_active)
{
MESH_DEBUG_PRINTLN("stopping GPS");
digitalWrite(PIN_GPS_STANDBY, LOW);
gps_active = false;
}
}
bool WioTrackerL1SensorManager::begin()
{
Serial1.setPins(PIN_GPS_TX, PIN_GPS_RX); // be sure to tx into rx and rx into tx
Serial1.begin(GPS_BAUDRATE);
pinMode(PIN_GPS_STANDBY, OUTPUT);
digitalWrite(PIN_GPS_STANDBY, HIGH); // Wake GPS from standby
delay(500);
// We'll consider GPS detected if we see any data on Serial1
if (Serial1.available() > 0)
{
MESH_DEBUG_PRINTLN("GPS detected");
}
else
{
MESH_DEBUG_PRINTLN("No GPS detected");
}
digitalWrite(PIN_GPS_STANDBY, LOW); // Put GPS back into standby mode
return true;
}
bool WioTrackerL1SensorManager::querySensors(uint8_t requester_permissions, CayenneLPP &telemetry)
{
if (requester_permissions & TELEM_PERM_LOCATION)
{ // does requester have permission?
telemetry.addGPS(TELEM_CHANNEL_SELF, node_lat, node_lon, node_altitude);
}
return true;
}
void WioTrackerL1SensorManager::loop()
{
static long next_gps_update = 0;
_location->loop();
if (millis() > next_gps_update && gps_active) // don't bother if gps position is not enabled
{
if (_location->isValid())
{
node_lat = ((double)_location->getLatitude()) / 1000000.;
node_lon = ((double)_location->getLongitude()) / 1000000.;
node_altitude = ((double)_location->getAltitude()) / 1000.0;
MESH_DEBUG_PRINTLN("lat %f lon %f", node_lat, node_lon);
}
next_gps_update = millis() + (1000 * 60); // after initial update, only check every minute TODO: should be configurable
}
}
int WioTrackerL1SensorManager::getNumSettings() const { return 1; } // just one supported: "gps" (power switch)
const char *WioTrackerL1SensorManager::getSettingName(int i) const
{
return i == 0 ? "gps" : NULL;
}
const char *WioTrackerL1SensorManager::getSettingValue(int i) const
{
if (i == 0)
{
return gps_active ? "1" : "0";
}
return NULL;
}
bool WioTrackerL1SensorManager::setSettingValue(const char *name, const char *value)
{
if (strcmp(name, "gps") == 0)
{
if (strcmp(value, "0") == 0)
{
stop_gps();
}
else
{
start_gps();
}
return true;
}
return false; // not supported
}
mesh::LocalIdentity radio_new_identity() {
RadioNoiseListener rng(radio);
return mesh::LocalIdentity(&rng); // create new random identity

View File

@@ -7,6 +7,7 @@
#include <helpers/radiolib/CustomSX1262Wrapper.h>
#include <helpers/AutoDiscoverRTCClock.h>
#include <helpers/ArduinoHelpers.h>
#include <helpers/sensors/EnvironmentSensorManager.h>
#ifdef DISPLAY_CLASS
#if defined(WIO_TRACKER_L1_EINK)
#include <helpers/ui/GxEPDDisplay.h>
@@ -17,30 +18,10 @@
#endif
#include <helpers/sensors/EnvironmentSensorManager.h>
class WioTrackerL1SensorManager : public SensorManager
{
bool gps_active = false;
LocationProvider *_location;
void start_gps();
void stop_gps();
public:
WioTrackerL1SensorManager(LocationProvider &location) : _location(&location) {}
bool begin() override;
bool querySensors(uint8_t requester_permissions, CayenneLPP &telemetry) override;
void loop() override;
int getNumSettings() const override;
const char *getSettingName(int i) const override;
const char *getSettingValue(int i) const override;
bool setSettingValue(const char *name, const char *value) override;
};
extern WioTrackerL1Board board;
extern WRAPPER_CLASS radio_driver;
extern AutoDiscoverRTCClock rtc_clock;
extern WioTrackerL1SensorManager sensors;
extern EnvironmentSensorManager sensors;
#ifdef DISPLAY_CLASS
extern DISPLAY_CLASS display;
extern MomentaryButton user_btn;

View File

@@ -78,8 +78,8 @@
#define PIN_WIRE_SDA (14)
#define PIN_WIRE_SCL (15)
#define PIN_WIRE1_SDA (17)
#define PIN_WIRE1_SCL (18)
#define PIN_WIRE1_SDA (18)
#define PIN_WIRE1_SCL (17)
#define I2C_NO_RESCAN
#define DISPLAY_ADDRESS 0x3D // SH1106 OLED I2C address
@@ -88,7 +88,7 @@
#define PIN_GPS_TX PIN_SERIAL1_RX
#define PIN_GPS_RX PIN_SERIAL1_TX
#define PIN_GPS_STANDBY (0)
#define PIN_GPS_EN (18)
#define PIN_GPS_EN (PIN_GPS_STANDBY)
// QSPI Pins
#define PIN_QSPI_SCK (19)