From 7eac405ed84d0be3ddd668005947378cf143cbe3 Mon Sep 17 00:00:00 2001 From: Michael Doppler <76885460+mdop@users.noreply.github.com> Date: Mon, 29 Apr 2024 07:56:42 +0000 Subject: [PATCH] fix negative anwser interpretation --- esphome/components/mcp3428/mcp3428.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/components/mcp3428/mcp3428.cpp b/esphome/components/mcp3428/mcp3428.cpp index 57048da85e..fe515b386f 100644 --- a/esphome/components/mcp3428/mcp3428.cpp +++ b/esphome/components/mcp3428/mcp3428.cpp @@ -102,6 +102,12 @@ float MCP3428Component::request_measurement(MCP3428Multiplexer multiplexer, MCP3 } // got valid measurement, clean up unused bits from the anwser code and prepare tick size + bool negative = false; + if (anwser[0] & 0b10000000 != 0) { + // negative number, clean up bit and mark as negative + negative = true; + anwser[0] &= 0b01111111; + } float tick_voltage = 2.048f / 32768; // ref voltage 2.048V/non-sign bits, default 15 bits switch (resolution) { case MCP3428Resolution::MCP3428_12_BITS: @@ -132,6 +138,9 @@ float MCP3428Component::request_measurement(MCP3428Multiplexer multiplexer, MCP3 } // convert code (first 2 bytes of cleaned up anwser) into voltage ticks int16_t ticks = anwser[0] << 8 | anwser[1]; + if (negative) { + ticks *= (-1); + } this->status_clear_warning(); return tick_voltage * ticks;