====== RC-Glied Batterie Spannungs Messung ====== Wichtig zu wissen, das ganze geht nur wegen der Vernachlässigung von Vc1! Diese Methode ist relativ ungenau, bietet aber einen groben Überblick ob eine Batterie fast leer ist. ===== Formeln ===== {{:projekte:hardware_tricks:batterie_messungen:codecogseqn.png?200|}} ===== Schaltplan ===== Die 3.3V Spannungsquelle soll die "Referenzspannung" der I/Os angeben. Im Falle des RaspberryPis ist das 3.3V. Im Falle eines 5V Arduinos 5V. Diese Spannungsquelle ist die Betriebsspannung des CPUs. {{:projekte:hardware_tricks:batterie_messungen:schaltplan.png?direct&400|}} ===== Code - Arduino===== #include void setup() { // put your setup code here, to run once: Serial.begin(115200); } const int rcpin = 2; const float vih_voltage = 2.85; const float capacity = 100 * pow(10, -9); const float resistor = 100000; const int dischargeDelay = 200; float meassureVoltage(){ //Pin auf Low setzen zum entladen des Kondensators pinMode(2, OUTPUT); digitalWrite(rcpin, LOW); delay(dischargeDelay); //Warten bis Kondensator leer long startMicros = micros(); //Startzeit festlegen pinMode(2, INPUT); //Pin auf Input legen um zu detektieren wann Pin High while(!digitalRead(rcpin)){ //Warte solange Pin nicht High } long endMicros = micros(); //Neue Zeit speichern long finalMicros = endMicros - startMicros; //Dauer des Vorgangs berechnen //Serial.println(finalMicros); //Berechnen der Spannung float vbat = (vih_voltage * capacity * resistor) /((float)(finalMicros * pow(10, -6))); return vbat; } void loop() { Serial.println(meassureVoltage()); } ===== Code - Java RaspberryPi ===== package rc_meassure; import com.pi4j.io.gpio.GpioController; import com.pi4j.io.gpio.GpioFactory; import com.pi4j.io.gpio.GpioPinDigitalInput; import com.pi4j.io.gpio.GpioPinDigitalOutput; import com.pi4j.io.gpio.Pin; import com.pi4j.io.gpio.PinState; import com.pi4j.io.gpio.RaspiPin; import static java.lang.Math.pow; import java.util.concurrent.TimeUnit; /** * * In einer echten Java Anwendung würde man das nicht so machen, das dient wirklich nur als Beispiel. */ public class RC_meassure { /** * @param args the command line arguments */ static Pin rcPin = RaspiPin.GPIO_00; static final int r = 100000; static final float c = (float) (100 * pow(10, -9)); /** * Vih = 0.625*Vdd * http://www.farnell.com/datasheets/1835725.pdf */ static final float vih = (float) 2.976473; public static void main(String[] args) throws InterruptedException { GpioController gpio = GpioFactory.getInstance(); gpio.unexportAll(); final GpioPinDigitalOutput outPin = gpio.provisionDigitalOutputPin(rcPin); outPin.setShutdownOptions(true, PinState.LOW); outPin.low(); //Entlade Kondensator; TimeUnit.SECONDS.sleep(1); //gpio.shutdown(); gpio.unprovisionPin(outPin); long startTime = System.nanoTime(); final GpioPinDigitalInput inPin = gpio.provisionDigitalInputPin(rcPin); while(inPin.isLow()){ //warte } long estimatedTime = System.nanoTime() - startTime; gpio.unprovisionPin(inPin); System.out.println(estimatedTime); System.out.println("Voltage: " + meassureRCVoltage(estimatedTime, r, c, vih)); } static float meassureRCVoltage(long t, float r, float c, float vih_voltage){ float vbat = (vih_voltage * c * r) /((float)(t * pow(10, -9))); return vbat; } }