Compare commits

...

3 commits

Author SHA1 Message Date
e7735eb278 autohuttli: add a water tank head sensor
All checks were successful
continuous-integration/drone/push Build is passing
2024-10-19 15:46:37 +00:00
d7b42af20d autohuttli: add a ADS1110 driver 2024-10-19 15:42:01 +00:00
efaeb1ee51 autohuttli: imported the clang-format from esphome 2024-10-19 15:40:17 +00:00
9 changed files with 300 additions and 1 deletions

137
.clang-format Normal file
View file

@ -0,0 +1,137 @@
Language: Cpp
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: DontAlign
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
- Regex: '^<.*\.h>'
Priority: 1
- Regex: '^<.*'
Priority: 2
- Regex: '.*'
Priority: 3
IncludeIsMainRegex: '([-_](test|unittest))?$'
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 2
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 2000
PointerAlignment: Right
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: false
SortUsingDeclarations: false
SpaceAfterCStyleCast: true
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 2
UseTab: Never

1
.gitignore vendored
View file

@ -2,3 +2,4 @@ secrets.yaml
.cache/
.esphome/
dist/
__pycache__/

View file

@ -1,6 +1,6 @@
# autohuttli nodes
# AtomS3 Lite
## AtomS3 Lite
<https://shop.m5stack.com/products/atoms3-lite-esp32s3-dev-kit>
@ -16,3 +16,14 @@ I/O:
- IR LED on G4
- WS2812 LED on G35
- Port A on G1 and G2
## ADC I2C Unit v1.1 (ADS1110)
[Schematic](https://docs.m5stack.com/en/unit/Unit-ADC_V1.1)
[Datasheet](https://www.ti.com/lit/ds/symlink/ads1110.pdf)
Reference is 2.048V with a PGA of 1 to 8. Has a 510 k / 100 k voltage divider
giving a 6.1 divisor or a FSD of 12.5 V.
Changed to a 75 / 39 k divider giving 2.92 divisor or FSD of 5.99 V.

View file

@ -16,6 +16,11 @@ esp32:
framework:
type: arduino
external_components:
- source:
type: local
path: components
logger:
http_request:

View file

View file

@ -0,0 +1,49 @@
#include "ads1110.h"
#include "esphome/core/log.h"
#include "esphome/core/hal.h"
namespace esphome {
namespace ads1110 {
namespace {
const char *const TAG = "ads1110";
constexpr uint8_t ST = 0x80;
constexpr uint8_t SC = 0x10;
constexpr uint8_t DR_240SPS = 0 << 2;
constexpr uint8_t DR_60SPS = 1 << 2;
constexpr uint8_t DR_30SPS = 2 << 2;
constexpr uint8_t DR_15SPS = 3 << 2;
constexpr uint8_t PGA_1 = 0 << 0;
constexpr uint8_t PGA_2 = 1 << 0;
constexpr uint8_t PGA_4 = 2 << 0;
constexpr uint8_t PGA_8 = 3 << 0;
constexpr uint8_t PGA_MASK = 3 << 0;
constexpr double kVref = 2.048;
} // namespace
void ADS1110Sensor::setup() {
uint8_t config = DR_15SPS | PGA_2;
write(&config, 1);
}
void ADS1110Sensor::dump_config() {
LOG_SENSOR("", "ADS1110", this);
LOG_I2C_DEVICE(this);
LOG_UPDATE_INTERVAL(this);
}
void ADS1110Sensor::update() {
uint8_t data[3];
if (read(data, sizeof(data)) == i2c::NO_ERROR && (data[2] & ST) == 0) {
int16_t code = static_cast<int16_t>((data[0] << 8) | data[1]);
double scale = kVref / 32768;
scale /= 1 << (data[2] & PGA_MASK);
this->publish_state(code * scale);
}
}
} // namespace ads1110
} // namespace esphome

View file

@ -0,0 +1,21 @@
#pragma once
#include "esphome/components/i2c/i2c.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/core/automation.h"
#include "esphome/core/component.h"
#include <cinttypes>
namespace esphome {
namespace ads1110 {
class ADS1110Sensor : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice {
public:
void setup() override;
void update() override;
void dump_config() override;
};
} // namespace ads1110
} // namespace esphome

View file

@ -0,0 +1,31 @@
from esphome import automation
from esphome.automation import maybe_simple_id
import esphome.codegen as cg
from esphome.components import i2c, sensor
import esphome.config_validation as cv
from esphome.const import CONF_GAIN, CONF_ID, ICON_SCALE, STATE_CLASS_MEASUREMENT
CODEOWNERS = ["michaelh@juju.nz"]
DEPENDENCIES = ["i2c"]
ads1110_ns = cg.esphome_ns.namespace("ads1110")
ADS1110Sensor = ads1110_ns.class_(
"ADS1110Sensor", sensor.Sensor, cg.PollingComponent, i2c.I2CDevice
)
CONFIG_SCHEMA = (
sensor.sensor_schema(
ADS1110Sensor,
accuracy_decimals=3,
state_class=STATE_CLASS_MEASUREMENT,
)
.extend(cv.polling_component_schema("60s"))
.extend(i2c.i2c_device_schema(0x48))
)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await i2c.register_i2c_device(var, config)
await sensor.register_sensor(var, config)

44
pumper.yaml Normal file
View file

@ -0,0 +1,44 @@
substitutions:
device_name: Pump monitor
device_id: pumper
project_name: juju.pumper
project_version: "0.1"
packages:
pumper:
i2c:
sda: 2
scl: 1
scan: true
frequency: 400kHz
sensor:
- platform: ads1110
id: pressure_v
name: "Raw sensor"
unit_of_measurement: V
device_class: voltage
update_interval: 4s
filters:
- multiply: 2.92 # (75 + 39) / 39
- exponential_moving_average:
alpha: 0.1
send_every: 5
on_value:
- sensor.template.publish:
id: head
state: !lambda 'return id(pressure_v).state;'
- platform: template
id: head
name: "Head"
unit_of_measurement: m
device_class: distance
icon: mdi:water
accuracy_decimals: 3
filters:
- calibrate_linear:
- 0.5 -> 0
- 4.5 -> 10.55 # 15 PSI
<<: !include atoms3_lite.yaml