Skip to content

Instantly share code, notes, and snippets.

@miathedev
Created April 13, 2025 11:39
Show Gist options
  • Save miathedev/ae9262903053a8769ebb7f0339775f42 to your computer and use it in GitHub Desktop.
Save miathedev/ae9262903053a8769ebb7f0339775f42 to your computer and use it in GitHub Desktop.
Meshtastic Onewire patch
From 14f33b1ebb5a8eec392efd085c2ecf88766be616 Mon Sep 17 00:00:00 2001
From: Mia Metzler <[email protected]>
Date: Sun, 13 Apr 2025 13:38:10 +0200
Subject: [PATCH] Add onewire
---
platformio.ini | 1 +
.../Telemetry/EnvironmentTelemetry.cpp | 14 +++++-
.../Telemetry/Sensor/OnewireSensor.cpp | 45 +++++++++++++++++++
src/modules/Telemetry/Sensor/OnewireSensor.h | 31 +++++++++++++
4 files changed, 90 insertions(+), 1 deletion(-)
create mode 100644 src/modules/Telemetry/Sensor/OnewireSensor.cpp
create mode 100644 src/modules/Telemetry/Sensor/OnewireSensor.h
diff --git a/platformio.ini b/platformio.ini
index 1c51e53b..42c80f3e 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -128,6 +128,7 @@ lib_deps =
https://github.com/meshtastic/DFRobot_LarkWeatherStation#4de3a9cadef0f6a5220a8a906cf9775b02b0040d
https://github.com/DFRobot/DFRobot_RainfallSensor#38fea5e02b40a5430be6dab39a99a6f6347d667e
robtillaart/[email protected]
+ milesburton/DallasTemperature@^4.0.4
; Health Sensor Libraries
sparkfun/SparkFun MAX3010x Pulse and Proximity Sensor [email protected]
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp
index 6a5e8376..7e8f5033 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.cpp
+++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp
@@ -40,7 +40,8 @@
#include "Sensor/SHTC3Sensor.h"
#include "Sensor/TSL2591Sensor.h"
#include "Sensor/VEML7700Sensor.h"
-
+#include "Sensor/OnewireSensor.h"
+OnewireSensor oneWireSensor;
BMP085Sensor bmp085Sensor;
BMP280Sensor bmp280Sensor;
BME280Sensor bme280Sensor;
@@ -115,6 +116,8 @@ int32_t EnvironmentTelemetryModule::runOnce()
#ifdef T1000X_SENSOR_EN
result = t1000xSensor.runOnce();
#elif !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR_EXTERNAL
+ if (oneWireSensor.hasSensor()) //hasSensor doesnt work here, because it cant be found over i2c
+ result = oneWireSensor.runOnce();
if (dfRobotLarkSensor.hasSensor())
result = dfRobotLarkSensor.runOnce();
if (dfRobotGravitySensor.hasSensor())
@@ -458,6 +461,10 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m
valid = valid && nau7802Sensor.getMetrics(m);
hasSensor = true;
}
+ if (true) {
+ valid = valid && oneWireSensor.getMetrics(m);
+ hasSensor = true;
+ }
if (aht10Sensor.hasSensor()) {
if (!bmp280Sensor.hasSensor() && !bmp3xxSensor.hasSensor()) {
valid = valid && aht10Sensor.getMetrics(m);
@@ -612,6 +619,11 @@ AdminMessageHandleResult EnvironmentTelemetryModule::handleAdminMessageForModule
if (result != AdminMessageHandleResult::NOT_HANDLED)
return result;
}
+ if (oneWireSensor.hasSensor()) {
+ result = oneWireSensor.handleAdminMessage(mp, request, response);
+ if (result != AdminMessageHandleResult::NOT_HANDLED)
+ return result;
+ }
if (bmp280Sensor.hasSensor()) {
result = bmp280Sensor.handleAdminMessage(mp, request, response);
if (result != AdminMessageHandleResult::NOT_HANDLED)
diff --git a/src/modules/Telemetry/Sensor/OnewireSensor.cpp b/src/modules/Telemetry/Sensor/OnewireSensor.cpp
new file mode 100644
index 00000000..47d88dfb
--- /dev/null
+++ b/src/modules/Telemetry/Sensor/OnewireSensor.cpp
@@ -0,0 +1,45 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
+
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "OnewireSensor.h"
+#include "TelemetrySensor.h"
+#include <Adafruit_BME280.h>
+#include <typeinfo>
+#include <OneWire.h>
+#include <DallasTemperature.h>
+
+OnewireSensor::OnewireSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_CUSTOM_SENSOR, "ONEWIRE") {}
+
+
+int32_t OnewireSensor::runOnce()
+{
+ LOG_INFO("Init sensor: %s", sensorName);
+ //status = true; //Sensor found mock
+ oneWire = OneWire(oneWireBus);
+ sensors = DallasTemperature(&oneWire);sensors.begin();
+ sensors.begin();
+ status = sensors.getDeviceCount() > 0;
+ LOG_INFO("Onewire sensor init status: %d", status);
+ return initI2CSensor();
+}
+
+bool OnewireSensor::hasSensor() {
+ return true;
+}
+void OnewireSensor::setup() {}
+
+bool OnewireSensor::getMetrics(meshtastic_Telemetry *measurement)
+{
+ measurement->variant.environment_metrics.has_temperature = true;
+
+ LOG_DEBUG("Onewire getMetrics");
+ //Code to take a measurement
+ sensors.requestTemperatures();
+ float temperatureC = sensors.getTempCByIndex(0);
+ measurement->variant.environment_metrics.temperature = temperatureC;
+
+ return true;
+}
+#endif
\ No newline at end of file
diff --git a/src/modules/Telemetry/Sensor/OnewireSensor.h b/src/modules/Telemetry/Sensor/OnewireSensor.h
new file mode 100644
index 00000000..84606d2f
--- /dev/null
+++ b/src/modules/Telemetry/Sensor/OnewireSensor.h
@@ -0,0 +1,31 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
+
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "TelemetrySensor.h"
+#include <Adafruit_BME280.h>
+#include <OneWire.h>
+#include <DallasTemperature.h>
+
+
+class OnewireSensor : public TelemetrySensor
+{
+ private:
+ Adafruit_BME280 bme280;
+ const int oneWireBus = 4;
+ OneWire oneWire;
+ DallasTemperature sensors;
+
+ protected:
+ virtual void setup() override;
+
+
+ public:
+ OnewireSensor();
+ virtual int32_t runOnce() override;
+ virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
+ bool hasSensor();
+};
+
+#endif
\ No newline at end of file
--
2.49.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment