INA219 Strom Messungen schwanken stark

Hallo Zusammen,

ich bin neu hier im Forum und habe auch erst vor kurzem angefangen zu Programmieren.

Mein Ziel ist es, eine Prüfvorrichtung zu bauen, um eine Lampe mit einer weißen LED und einer RGB LED zu prüfen.

Dazu schalte ich die Farben weiß, grün, blau, rot und RGB-weiß nacheinander durch und möchte bei den einzelnen Farben den Strom messen. Wenn der Strom im richtigen Bereich liegt soll der Arduino weiter machen. Falls die Messungen alle erfolgreich sind, leuchtet eine weitere grüne Lampe für 5 sek. als Bestätigung. Falls der Strom nicht stimmt leuchtet eine rote Lampe für 5 sek.
Die Stromwerte werden über den Seriellen Monitor zur Kontrolle ausgegeben.

Ich verwende einen Arduino Nano Every(ATMEGA4809) und Adafruit INA219 High Side DC Current Sensor.
Da die Lampe 24V DC ist schalte ich mit dem Nano Relais die mir die 24V einfach durchlassen.

Mein Problem ist jetzt, dass es mal funktioniert und mal nicht. Der gemessene Strom liegt mal in dem gewünschten Bereich und bei der nächsten Messung (gleiche Lampe) deutlich daneben.

Ich bin mir nicht sicher ob das Problem an dem Programm oder an der Hardware liegt. Verschiedene INA219 habe ich schon getestet. Im Internet habe ich dazu leider auch keine Lösung gefunden.

Ich hoffe von euch kann mir da jemand weiterhelfen. Ansonsten bin ich euch auch für weitere Verbesserungen am Programm dankbar.

#include <Wire.h>
#include <Adafruit_INA219.h>

Adafruit_INA219 ina219;

const int RGREEN_PIN = 2;
const int RRED_PIN = 4;
const int RBLUE_PIN = 3;
const int WHITE = 5;
const int STOP = 6;
const int FERTIG = 8;
const int taster = 7;
int tasterstatus = 0;

int d = 2000;
int f = 200;

void setup(void)
{
  pinMode(RRED_PIN, OUTPUT);
  pinMode(RGREEN_PIN, OUTPUT);
  pinMode(RBLUE_PIN, OUTPUT);
  pinMode(WHITE, OUTPUT);
  pinMode(STOP, OUTPUT);
  pinMode(FERTIG, OUTPUT);

  pinMode(taster, INPUT);

  Serial.begin(115200);
  while (!Serial) {
    // will pause Zero, Leonardo, etc until serial console opens
    delay(1);
  }

  uint32_t currentFrequency;

  Serial.println("Hello!");

  // Initialize the INA219.
  // By default the initialization will use the largest range (32V, 2A).  However
  // you can call a setCalibration function to change this range (see comments).
  if (! ina219.begin()) {
    Serial.println("Failed to find INA219 chip");
    while (1) {
      delay(10);
    }

  }
  // To use a slightly lower 32V, 1A range (higher precision on amps):
  ina219.setCalibration_32V_1A();
  // Or to use a lower 16V, 400mA range (higher precision on volts and amps):
  //ina219.setCalibration_16V_400mA();

  Serial.println("Measuring voltage and current with INA219 ...");
}
void loop(void)
{
  float shuntvoltage = 0;
  float busvoltage = 0;
  float current_mA = 0;
  float loadvoltage = 0;
  float power_mW = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();
  busvoltage = ina219.getBusVoltage_V();
  current_mA = ina219.getCurrent_mA();
  power_mW = ina219.getPower_mW();
  loadvoltage = busvoltage + (shuntvoltage / 1000);

  //Serial.print("Bus Voltage:   "); Serial.print(busvoltage); Serial.println(" V");
  // Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
  //Serial.print("Load Voltage:  "); Serial.print(loadvoltage); Serial.println(" V");
  // Serial.print("Current:       "); Serial.print(current_mA); Serial.println(" mA");
  // Serial.print("Power:         "); Serial.print(power_mW); Serial.println(" mW");
  // Serial.println("");

  //delay(2000);


  digitalWrite(RRED_PIN, LOW);
  digitalWrite(RGREEN_PIN, LOW);
  digitalWrite(RBLUE_PIN, LOW);
  digitalWrite(WHITE, LOW);
  digitalWrite(STOP, LOW);
  digitalWrite(FERTIG, LOW);


  tasterstatus = digitalRead(taster);
  if (tasterstatus == HIGH)
  {

    Serial.println("Starte Messung...");




    digitalWrite(WHITE, HIGH);
    delay(d);


    current_mA = ina219.getCurrent_mA();

    Serial.print("Current-white:       "); Serial.print(current_mA); Serial.println(" mA");
    if (current_mA > 30 && current_mA < 33 ) {

      delay(f);
      digitalWrite(WHITE, LOW);


      digitalWrite(RGREEN_PIN, HIGH);
      delay(d);


      current_mA = ina219.getCurrent_mA();


      Serial.print("Current-green:       "); Serial.print(current_mA); Serial.println(" mA");
      if (current_mA > 7.6 && current_mA < 10.3) {


        delay(f);
        digitalWrite(RGREEN_PIN, LOW);



        digitalWrite(RBLUE_PIN, HIGH);
        delay(d);


        current_mA = ina219.getCurrent_mA();


        Serial.print("Current-blue:       "); Serial.print(current_mA); Serial.println(" mA");
        if (current_mA > 10.7 && current_mA < 14.1 ) {


          delay(f);
          digitalWrite(RBLUE_PIN, LOW);



          digitalWrite(RRED_PIN, HIGH);
          delay(d);

          current_mA = ina219.getCurrent_mA();



          Serial.print("Current-red:       "); Serial.print(current_mA); Serial.println(" mA");
          if (current_mA > 7.9 && current_mA < 10.7 ) {


            delay(f);
            digitalWrite(RRED_PIN, LOW);



            digitalWrite(RBLUE_PIN, HIGH);
            digitalWrite(RGREEN_PIN, HIGH);
            digitalWrite(RRED_PIN, HIGH);
            delay(d);

            current_mA = ina219.getCurrent_mA();


            Serial.print("Current-RGB:       "); Serial.print(current_mA); Serial.println(" mA");
            if (current_mA > 27 && current_mA < 33 ) {

              delay(f);

              digitalWrite(RRED_PIN, LOW);
              digitalWrite(RGREEN_PIN, LOW);
              digitalWrite(RBLUE_PIN, LOW);
              digitalWrite(WHITE, LOW);
              digitalWrite(STOP, LOW);

              digitalWrite(FERTIG, HIGH);
              delay(5000);

            } else {
              fehler() ;
            };
          } else {
            fehler() ;
          };
        } else {
          fehler() ;
        };
      } else {
        fehler() ;
      };
    } else {
      fehler() ;
    };

  }
}

    void fehler() {
      
      Serial.println("Fehler!");
      digitalWrite(RRED_PIN, LOW);
      digitalWrite(RGREEN_PIN, LOW);
      digitalWrite(RBLUE_PIN, LOW);
      digitalWrite(WHITE, LOW);
      digitalWrite(STOP, HIGH);
      delay(5000);

      
    }

Wie sieht Deine Schaltung aus?
Welchen Shund hat der INA219? alternativ welches Modul benutzt Du?
Grüße Uwe

(deleted)

Hallo,

vielen Dank für eure Antworten.

@Peter-CAD-HST, ich habe die Zeilen herausgenommen, das hat allerdings nichts gebracht.
Das mit dem SWITCH/CASE werde ich aber trotzdem noch versuchen. Danke.

Trotzdem habe ich jetzt nach knapp zwei Wochen den Fehler vermutlich gefunden. Und zwar hat das 24V Netzteil (LED-Treiber) wohl ein Schuss. Hier schwankt die Spannung sobald eine Last anliegt. Das habe ich blöderweise nicht geprüft. Dafür alle anderen Sachen ausgetauscht und mehrfach kontrolliert.

@uwefed, zur Vervollständigung habe ich trotzdem noch die Schaltung ein einem Bild dargestellt.
Ich verwende den originalen Adafruit INA219 Current Sensor Breakout mit 0,1Ohm Shunt.

Vielen Dank nochmal.

Grüße Kevin

Ich würde die Relais für jede Messung ein- und danach gleich wieder ausschalten, nicht nur wenn die Messung die gewünschten Werte ergeben hat.

Ich hoffe die Masse der 24V sind mit der Masse des Arduino verbunden und Du hast das nur nicht eingezeichnet.
Grüße Uwe

Hallo,

die Relais direkt wieder ausschalten wäre rein optisch oder hat das einen weiteren Zweck? Im Prinzip schaltet das Relais aus, ob der Wert erreicht wird oder nicht, da ich es direkt nach der Auswertung bei true oder false (void fehler) ausschalte.

Zu der Masse vom Arduino- wieso soll die Masse vom "Arbeitsstromkreis" mit Arduino verbunden werden? Die Relais dienen ja nur als Schalter um den 24V Stromkreis mit Lampe zu schließen.

Grüße Kevin

SCL und SDA brauchen auch einen Gnd!

Der INA219 ist nicht gebaut um Potentialfrei den Strom in einer Leitung zu messen.
Wenn Du das Machen willst brauchst Du eine Potentialfreie Versorgungsspannung für den UNA219 und Potentialtrennung für die I2C Schnittstelle.
Grüße Uwe