/* Ladungsmessung mit INA219, 06.04.2022 - Bibliothek von https://arduino-projekte.webnode.at/meine-libraries/stromsensor-ina219/ - Shunt 0,01 Ohm, Teiler 100 - Messbereich Shunt 320 mV - Messspannung max. 32 V - Messungen alle 2 Sekunden - Laufzeit ca. 24 Stunden - Anzeige zweistellig mit Schieberegister, Displays gemeinsame Anode - Messbereich 0,1 bis 99 Ah - www.buschke.net */ //Bibliotheken I2C und INA laden #include "Wire.h" #include "MyINA219.h" //Pin-Zuordnung #define CLOCKPIN 2 //Pin 4 #define LATCHPIN 3 //Pin 5 Einer #define DATAPIN 4 //Pin 6 #define clockpin 5 //Pin 11 #define latchpin 6 //Pin 12 Zehner #define datapin 7 //Pin 13 #define punktPin 8 //Pin 14 #define blinkLED 9 //Pin 15 #define minusPin 10 //Pin 16 byte sieben_seg_ziffern[10] = { B00000001, //0 B01001111, //1 B00010010, //2 B00000110, //3 B01001100, //4 B00100100, //5 B00100000, //6 B00001111, //7 B00000000, //8 B00000100 //9 }; //I2C-Adresse Messsensor = 0x40 MyINA219 INA(0x40); // globale Variablen INA float current, y; void setup() { pinMode(LATCHPIN, OUTPUT); pinMode(CLOCKPIN, OUTPUT); pinMode(DATAPIN, OUTPUT); pinMode(latchpin, OUTPUT); pinMode(clockpin, OUTPUT); pinMode(datapin, OUTPUT); pinMode(punktPin, OUTPUT); pinMode(blinkLED, OUTPUT); pinMode(minusPin, OUTPUT); Serial.begin(115200); delay(100); Wire.begin(); //INA219 initialisieren INA.reset(); //Ruecksetzen aller Register des INA219 INA.setRange(INA219_RANGE_32); //Messbereich Bus-Spannung = 32 V (alternativ ...RANGE_16 = 16 Volt) INA.setGain(INA219_GAIN_320); //Messbereich Shuntspannung = +/-320 mV INA.init(); //beide Schieberegister auf Null stellen digitalWrite(LATCHPIN, LOW); shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, sieben_seg_ziffern[0]); digitalWrite(LATCHPIN, HIGH); digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, LSBFIRST, sieben_seg_ziffern[0]); digitalWrite(latchpin, HIGH); digitalWrite(minusPin, LOW); digitalWrite(punktPin, HIGH); delay(100); } void loop() { float tempAdd = 0; float Minutenwert = 0; float Anzeigewert = 0; float Grundzahl = 0; byte Zehner = 0; byte Einer = 0; digitalWrite(blinkLED, HIGH); //Schleife für 24 Stunden for(int Minuten = 1440; Minuten > 0; Minuten--) { //Schleife für eine Minute for(byte Messungen = 30; Messungen > 0; Messungen--) { // Messwerte abfragen INA.startSingleMeas(); while (!INA.conversionReady()); //Warte, bis Messung fertig ist if (!INA.currentOverflow() && !INA.voltageOverflow()) { INA.readRawValues(); //Einlesen der Rohwerte delay(200); //Berechnen des Stromes y = INA.calcCurrent(); current = y / 100; } // Messungen eine Minute addieren und Mittelwert errechnen float m = tempAdd + current; tempAdd = m; Minutenwert = tempAdd / 30; // bei 30 Messungen pro Minute digitalWrite(blinkLED, LOW); delay(1585); //+ 15 ms Laufzeit der Loop digitalWrite(blinkLED, HIGH); delay(200); Serial.print(" Minuten: "); Serial.println(Minuten); Serial.print("Anzahl der Messungen: "); Serial.println(Messungen); Serial.print("Meßwert: "); Serial.println(current); Serial.print("Minutenwert: "); Serial.println(Minutenwert); Serial.println(); Serial.println(); } //Ende der Minutenschleife //Auswertung nach einer Minute Messzeit // Minutenwerte addieren float h = Anzeigewert + Minutenwert; Anzeigewert = h; Minutenwert = 0; tempAdd = 0; //Minuszeichen ermitteln if(Anzeigewert < 0) { digitalWrite(minusPin, HIGH); Grundzahl = abs(Anzeigewert); } else { digitalWrite(minusPin, LOW); Grundzahl = Anzeigewert; } //Umrechnung in Ah float a = Grundzahl; float Ah = a / 60; //Kommastelle ermitteln if (Ah < 9.9) { Ah = Ah * 10; digitalWrite(punktPin, LOW); } else { digitalWrite(punktPin, HIGH); } byte value = round(Ah); if(value > 99) { value = 0; Anzeigewert = 0; tempAdd = 0; } //Zehnerstelle auszählen for(byte i = value; i > 9; i = i - 10) { byte Addition = Zehner + 1; Zehner = Addition; } Serial.print(" Zehnerstelle: "); Serial.println(Zehner); zehnerWrite(Zehner); byte k = Zehner * 10; value = value - k; //Einerstelle auszählen for(byte i = value; i > 0; i--) { byte Addition = Einer + 1; Einer = Addition; } Serial.print(" Einerstelle: "); Serial.println(Einer); einerWrite(Einer); Einer = 0; Zehner = 0; } //Ende der 24 Stunden Schleife } void einerWrite(byte E) { digitalWrite(LATCHPIN, LOW); shiftOut(DATAPIN, CLOCKPIN, LSBFIRST, sieben_seg_ziffern[E]); digitalWrite(LATCHPIN, HIGH); } void zehnerWrite(byte Z) { digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, LSBFIRST, sieben_seg_ziffern[Z]); digitalWrite(latchpin, HIGH); }