Problem mit meinem Projekt / Uno setzt sich unregelmäßig zurück

Grüßt Euch,

ich bin an einem kleinen Projekt (Getränkemischer Jacky-Cola) am Arbeiten und habe ein Problem das sich der Arduino Uno in unregelmäßigen Abständen/zurücksetzt.

Ich habe schon folgendes ausprobiert bzw. getestet:

  • zweiten neuen Arduino Uno gekauft um auszuschließen das der was hat.
  • Der Uno läuft mit Netzteil (12v/10A)
  • Die zwei Pumpen laufen auf 12v direkt.
  • Die 5v Led´s hatten zuerst alle einen 330 Ohm Wiederstand, da war das zurücksetzen viel öfter, jetzt habe ich alle Led´s mit 220 Ohm bestückt, ist deutlich besser geworden. Habe auch schon ohne der Led´s probiert, genauso wie mit den 220 Ohm (deutlich besser aber nach einer Zeit trotzdem Aussetzer.
  • Es gibt kein Muster, wobei der Reset immer wieder Auftritt
  • Kurzschlüsse und Pins/Lötstellen gecheckt.
  • Auch beim längeren Laufen der Pumpen (Verdacht auf Überlast der 5v-Versorgung) kein Unterschied. Mal kommt der Reset mal nicht.
  • Die Tasten/Buttons haben alle einen 10 kOhm Wiederstand.

Vielleicht weis jemand Warum oder Worauf der Uno reagiert sodass der in den Reset geht?
Wenn alles funktioniert dann kann man auch alle Mischungs- und Größenvarianten perfekt abfragen somit denke ich, das ich irgendwo in meinem Sketch einen kleinen Fehler habe oder vielleicht irgendwo eine Pause/Delay einbauen muss damit der Uno die Loops usw macht ohne zu Resetten.

Hier ist mein Sketch. Vielen Dank im Voraus für Eure Hilfe!

#include <Eventually.h>
#include "HX711.h"

#define Start_Button 11

#define Taste_Button 4
#define Taste_L 5
#define Taste_M 6
#define Taste_H 7
#define Taste_A 20

#define Size_Button 8
#define Size_02 9
#define Size_04 10

#define ScaleClock 2
#define ScaleData 3

#define Motor_Jack 12
#define Motor_Cola 13

HX711 scale;
EvtManager mgr;

int Taste_State = Taste_M;
int Size_State = Size_02;

int Mix_Array[21][15];

void setup() {

  Serial.begin(115200);
  Serial.println(__FILE__);
  Serial.print("LIBRARY VERSION: ");
  Serial.println(HX711_LIB_VERSION);
  Serial.println();

  pinMode(Taste_L, OUTPUT);
  pinMode(Taste_M, OUTPUT);
  pinMode(Taste_H, OUTPUT);
  pinMode(Taste_Button, INPUT);

  pinMode(Size_02, OUTPUT);
  pinMode(Size_04, OUTPUT);
  pinMode(Size_Button, INPUT);

  pinMode(Start_Button, INPUT);

  pinMode(Motor_Jack, OUTPUT);
  pinMode(Motor_Cola, OUTPUT);

  //Add Blinkshow

  WriteTasteState(Taste_State);
  WriteSizeState(Size_State);

  scale.begin(ScaleData, ScaleClock);

  scale.set_offset(4294682396);
  scale.set_scale(1024.810);

  Mix_Array[Taste_L][Size_02] = 40;
  Mix_Array[Taste_M][Size_02] = 50;
  Mix_Array[Taste_H][Size_02] = 60;
  Mix_Array[Taste_A][Size_02] = 80;
  Mix_Array[Taste_L][Size_04] = 80;
  Mix_Array[Taste_M][Size_04] = 100;
  Mix_Array[Taste_H][Size_04] = 120;
  Mix_Array[Taste_A][Size_04] = 160;

  Standby();

}

void Standby() {
  mgr.resetContext();

  digitalWrite(Motor_Jack, HIGH);
  digitalWrite(Motor_Cola, HIGH);

  mgr.addListener(new EvtPinListener(Taste_Button, (EvtAction)NextTasteState));
  mgr.addListener(new EvtPinListener(Size_Button, (EvtAction)NextSizeState));
  mgr.addListener(new EvtPinListener(Start_Button, (EvtAction)Start));
}

void Start() {

  mgr.resetContext();
  bool x = false;
  unsigned long previousMillis = 0;
  unsigned long currentMillis;
  unsigned long total;
  float weight;
  int jack = Mix_Array[Taste_State][Size_State];

  if(Size_State == Size_04) {
    total = 400;
  } else {
    total = 200;
  }

  for(int i = 0; i <= 3; i++) {
    digitalWrite(Taste_L, LOW);
    digitalWrite(Taste_M, LOW);
    digitalWrite(Taste_H, LOW);
    delay(200);
    digitalWrite(Taste_L, HIGH);
    digitalWrite(Taste_M, HIGH);
    digitalWrite(Taste_H, HIGH);
    delay(200);
  }

  scale.tare();

  while(x == false && weight < jack && digitalRead(Start_Button) == LOW) {
    
    digitalWrite(Motor_Jack, LOW);
    digitalWrite(Motor_Cola, HIGH);

    if (currentMillis - previousMillis > 100000) {
      x = true;
    }

    weight = scale.get_units(3);

    Serial.println(weight);
    Serial.println(jack);
  }

  while(x == false && weight < total && digitalRead(Start_Button) == LOW) {
    
    digitalWrite(Motor_Jack, HIGH);
    digitalWrite(Motor_Cola, LOW);

    if (currentMillis - previousMillis > 200000) {
      x = true;
    }

  weight = scale.get_units(3);

    Serial.println(weight);
    Serial.println(total);
  }

    digitalWrite(Motor_Jack, HIGH);
    digitalWrite(Motor_Cola, HIGH);

  for(int i = 0; i <= 3; i++) {
    digitalWrite(Taste_L, LOW);
    digitalWrite(Taste_M, LOW);
    digitalWrite(Taste_H, LOW);
    delay(200);
    digitalWrite(Taste_L, HIGH);
    digitalWrite(Taste_M, HIGH);
    digitalWrite(Taste_H, HIGH);
    delay(200);
  }

  WriteTasteState(Taste_State);

  Standby();

}

void WriteSizeState(int Size_State) {
  if(Size_State == Size_02) {
    digitalWrite(Size_02, HIGH);
    digitalWrite(Size_04, LOW);
  }
  if(Size_State == Size_04) {
    digitalWrite(Size_02, LOW);
    digitalWrite(Size_04, HIGH);
  }
}

void NextSizeState() {
 mgr.resetContext();
 if(Size_State == Size_02) {
    Size_State = Size_04;
    } else {
      Size_State = Size_02;
    }
  
  WriteSizeState(Size_State);

  Standby();
}

void WriteTasteState(int Taste_State) {
  if(Taste_State == Taste_L) {
    digitalWrite(Taste_L, HIGH);
    digitalWrite(Taste_M, LOW);
    digitalWrite(Taste_H, LOW);
  } 
  if(Taste_State == Taste_M) {
    digitalWrite(Taste_L, LOW);
    digitalWrite(Taste_M, HIGH);
    digitalWrite(Taste_H, LOW);
  } 
  if(Taste_State == Taste_H) {
    digitalWrite(Taste_L, LOW);
    digitalWrite(Taste_M, LOW);
    digitalWrite(Taste_H, HIGH);
  } 
  if(Taste_State == Taste_A) {
    for(int i = 0; i <= 3; i++) {
      digitalWrite(Taste_L, LOW);
      digitalWrite(Taste_M, LOW);
      digitalWrite(Taste_H, LOW);
      delay(200);
      digitalWrite(Taste_L, HIGH);
      digitalWrite(Taste_M, HIGH);
      digitalWrite(Taste_H, HIGH);
      delay(200);
    }
  }
}

void NextTasteState() {
  unsigned long previousMillis = 0;
  unsigned long currentMillis;
  bool i = false;
  mgr.resetContext();
  
  if(Taste_State == Taste_L) {
    Taste_State = Taste_M;
    } else {
      if(Taste_State == Taste_M) {
       Taste_State = Taste_H;
       } else {
            Taste_State = Taste_L; 
         }
      }

  previousMillis = millis();
  currentMillis = millis();
  while(i == false) {

    if (currentMillis - previousMillis < 3000) {
        if (digitalRead(Taste_Button) == HIGH) {
          currentMillis = millis();
        } else {
          i = true;
        }
    } else {
      if (digitalRead(Taste_Button) == HIGH) {
        Taste_State = Taste_A;
        i = true;
      } else {
        i = true;
      }
    }
  }

  WriteTasteState(Taste_State);

  Standby();

}

USE_EVENTUALLY_LOOP(mgr)

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Danke, sorry das wusste ich nicht (neu hier)

Hallo
Wie oft passiert das denn. Ich würde mal die Motoren abklemmen und trocken testen. Es könnte ein EMV Problem sein.

Das klingt schon sehr nach Fehler der Spannungsversorgung des Uno.
Was ist das für ein Uno ? Bitte einen Link posten.
Was sind das für Pumpen ? Bitte einen Link posten.
Wie steuerst du die Pumpen an ?
Hast du Freilaufdioden angeschlossen ?
Wieviel Leds hast du angeschlossen ?

Teste doch mal, wenn der Uno nur mit 7-9 Volt betrieben wird.
Evtl. wird der Onboard-Regler doch zu heiß.

Mich wundert allerdings, dass es mit 220 Ohm an den Leds besser geht.

Zeige mal ein Bild des Aufbaues und einen Schaltplan.

Hi, das ist total unterschiedlich mal jedes 2-3mal mal nach 5-6.
Ich mache die Füllversuche alle mit Messbecher trocken. Durch die Pumpen ist noch kein Tropfen gelaufen (Peristaltikpumpen)
Die sind auch nicht am Uno verbunden sondern 12v direkt und werden über Relay geschaltet.

... und andere Fragen von @HotSystems ...

Das ist der Uno:https://www.roboter-bausatz.de/p/uno-r3-atmega328p-ch340g
Das ist das Relay welches die Pumpen Schaltet: https://www.roboter-bausatz.de/p/2-kanal-relais-5v-low-level

Das sind die Pumpen: https://www.amazon.de/Fafeicy-Peristaltikpumpe-Hochwertige-Dosierpumpe-Aquarienlabor/dp/B08FT4BY5K?th=1

Ich habe leider nur diesen Handschriftlichen Schaltplan:


Keine Freilaufdioden.

Ich werde mir jetzt noch diese Led´s mit inkludierten Wiederständen bestellen (5Stück) um das 100% auszuschließen. https://www.roboter-bausatz.de/p/10-stueck-5mm-f5-led-blau-verkabelt-20cm-5-12v

Das ist die Wägezelle: https://www.roboter-bausatz.de/p/hx711-gewichtssensor-mit-elektronischer-waegezelle-1kg?number=RBS15856

Ist denn der Sketch Fehlerfrei oder könnte man dort etwas anders machen?

Diese solltest du besser mal an den Pumpen anbringen.
Andere Leds brauchst du nicht bestellen.
Um den Strom zu reduzieren, kannst du die Vorwiderstände etwas größer machen. 560 oder 680 Ohm.

Da kann man sicher noch einiges optimieren, aber ist vermutlich nicht das Problem.

Wie kann ich das am besten umsetzen? Ich muss dazu sagen das ich nur "Hobbyelektriker" bin, deshalb bräuchte ich an manchen Punkten mehr Detailhilfe :slight_smile:

Die alten led´s hab ich schon rausgemacht um die neuen zu implementieren.. von daher..

Naja...wenn man keine Arbeit hat, macht man sich welche. :wink:
Und hier kannst du dich über Freilaufdioden schlau lesen.

Ja das stimmt :sweat_smile: das Projekt hat mich mittlerweile mehr Zeit in Fehlersuche als Aufbau gekostet..aber ich hoffe das es bald Problemlos läuft.

Genau, das wundert mich auch. Mehr Last, weniger Ausfällt ist schon seltsam.

Ja, wir kennen leider die ganzen Hintergründe nicht.
Ich tippe nach wie vor auf die 12 Volt, die vermutlich zu hoch sind und den evtl. schlecht dimensionierten Regler zum abschalten bringen.
Ein Test mit niedriger Spannung, wie in #5 geschrieben, könnte durchaus eine Hilfe sein.

Ich bin da bei @HotSystems. Es gibt hier einen anderen Thread:
https://forum.arduino.cc/t/problem-bei-12-volt-anschluss/1348705

in dem das Problem mit der Leistung und 12V Netzteilen beschrieben wird. An dem Arduino sind 5 LEDs + Waage angeschlossen + Controller Eigenverbrauch, das kann zu viel sein.

Es stimmt aber auch, dass die Aussage, dass eine Verkleinerung der Vorwiderstände eine Verbesserung bringen soll, seltsam ist. Ich glaube das nicht.

Wäre ein Programmfehler vorhanden, haben die Vorwiderstände keinerlei Einfluss auf das Ergebnis. Eine Änderung dieses Parameters beeinflusst nur die elektrischen Eigenschaften der Schaltung. Mehr Last würde aber eher zu mehr Ausfällen führen. Ich glaube ja dass hier der subjektive Eindruck falsch ist, weil das nicht systematisch überprüft wurde.

Hallo,
Nochmals , was ist mit einem Test ohne die Motoren. Es kann doch nicht so schwer sein nur mal einen Draht an den Relais abzuklemmen und das dann mal 20 mal zu testen. Dann müssten ja bereits mehrere Resets erfolgt sein.
Ohne Freilaufdiode kann das aber ja eh nicht sicher laufen.

Gruß Heinz.