class CurrentSensor: """ Converts an analog current with a resistor to a scaled unit, which was read by an ADC. The maximum analog voltage is defined with the resistor. At 20mA, a voltage drop of 3.2V occurs across a 160 Ω resistor. The lower_unit and upper_unit is to scale the unit. The order of conversion: 1) current out from sensor e.G: 4mA - 20mA 2) resistor to have a voltage drop. U = R * I 3) raw_value from ADC what the microcontroller reads 4) calculatig the voltage from raw_value 5) calculating the current from voltage 6) normalized value 0-1 from current 7) scaled unit from normalized value """ def __init__( self, bits=12, lower_current=0.004, upper_current=0.02, ref_voltage=3.3, resistor=160, lower_unit=0, upper_unit=100, ): self.bits = bits self.lower_current = lower_current self.upper_current = upper_current self.ref_voltage = ref_voltage self.resistor = resistor self.lower_unit = lower_unit self.upper_unit = upper_unit @property def delta_current(self): return self.upper_current - self.lower_current @property def delta_unit(self): return self.upper_unit - self.lower_unit @property def increments(self): return 2**self.bits - 1 def convert(self, raw_value) -> float: """ Return a scaled unit """ voltage = raw_value / self.increments * self.ref_voltage current = voltage / self.resistor norm = (current - self.lower_current) / self.delta_current return norm * self.delta_unit + self.lower_unit