Werte speichern oder zurücksetzen (Wägezelle + Hx711 ADC Modul)

Hallo,
ich bin gerade über einem Techniker Projekt für die Schule und habe ein kleines Problem, ich hoffe ihr könnt mir weiter helfen da ich Arduino Neuling bin (habe aber durch die Schule 1 Jahr C Erfahrung).
Und zwar, entwickle ich einen Cocktailautomaten der die Dosierung der einzelnen “Flüssigkeiten” über eine Wägezelle gewährleistet. Außerdem soll vor beginn über die Wägezelle geprüft werden ob ein Glas vorhanden ist.
Zu meinem Problem: Über ein HX711 ADC Modul bekomme ich schon genaue Gramm Werte über den Seriellen Monitor ausgegeben. Nur da nicht jedes Glas gleich schwer ist würde ich gern nach der Glas Erkennung den Gramm Wert zurück auf 0 setzen oder den Gramm Wert des Glases speichern um dann die einzelnen Flüssigkeiten nacheinander dosieren zu können.
Ich hoffe ihr könnt mir weiter helfen!!!

Hier meinen bisherigen Test-Sketch:

bis in die erste if Anweisung (sprich nachdem das Glas erkannt wurde) komme ich schon nur ab da bräuchte ich wieder den Wert 0 oder eben den gespeicherten Wert des Glases der sich aber nicht ändern dürfte!

#include <Hx711.h>
Hx711 scale(A2, A3);

void setup()
{
 Serial.begin(9600);
}

void loop() 
{

 int glas = 23;
 pinMode(glas, OUTPUT);
 int wodka = 31;
 pinMode(wodka, OUTPUT);
 int rum = 39;
 pinMode(rum, OUTPUT);
 int saft = 45;
 pinMode(saft, OUTPUT);
 int gewicht;
 static int gewichtneu;

 gewicht = 0;
 gewicht = (1.675* scale.getGram());
 gewichtneu=gewicht;
 
 Serial.print(gewicht);
 Serial.print(" g   ");
 if(gewicht > 20)                 // Glas wurde erkannt
 {
   digitalWrite(wodka, HIGH);
                                  // hier müsste der Wert für gewicht auf 0 gesetzt werden oder der wert für 
   
   if(gewicht > ??????? )     // gewicht unveränderbar gespeichert werden um ihn in der nächsten if   
   {                                   // Anweisung mit dem aktuellem gewicht zu verlgleichen
    digitalWrite(wodka, LOW);
    digitalWrite(rum, HIGH);
   }
     ..
     ..
     ..
     ..
     ..
 }
 else 
 {
   digitalWrite(glas, LOW);
   digitalWrite(wodka, LOW);
   digitalWrite(rum, LOW);
   digitalWrite(saft, LOW);
 }
}

Please read the instructions, then go back and modify your post to mark up the code using the "More --> Modify" option at the bottom right of the post.

if(gewicht > 20)   //Glas erkannt
  {
  tara = gewicht;
  while(gewicht-tara <= gewicht_wodka)
    {
    digitalWrite(wodka, HIGH);   //wodka ins Glas geben
    gewicht messen;
    }
  digitalWrite(wodka, LOW);  // Ventil/Pumpe Wodka aus.
  }

Zum Prinzip.
Das ist ein blockierender Code wahrscheinlich mußt Du ihn mit millis() umschreiben damit DU in der Zeit wo ein Getränk augegeben wird etwas anderes mschen kannst zB Displayausgabe.

Grüße Uwe
[EDIT]Auf grund des richtigen Einwands von michael_x habe ich “gewicht messen;” in den oberen Beispielsketch eingefügt

Danke michael_x für die Korrektur.
Uwe [/EDIT]

Muss ich mir wieder die Klugscheisser-Mütze aufsetzen: Gegen blockierenden Code (da hat Uwe natürlich recht) hilft umschreiben. Hat aber nicht viel mit millis() zu tun.

Das Problem hier ist, dass in der unsinnigen while-Schleife das Gewicht nie neu gemessen wird.

So ähnlich habe ich es auch schon versucht das gewicht in einer anderen Variable zu speichern nur jedes mal wenn sich das gewicht ändert wird die Variable auch umgeschrieben. D.h. gewicht hat immer den gleichen Wert wie tara. Somit kann ich tara von gewicht nicht abziehen ( while(gewicht-tara <= gewicht_wodka) weil das Ergebnis für gewicht-tara immer 0 wäre.

Manche nennen es "Endlicher Automat": Musst dir halt merken, ob du das leere Glas schon gemessen hast und jetzt am Einfüllen bist.

Ich würde mich auch fragen, ob die erste Messung > 0 schon das Gewicht des leeren Glases ist ? Kame auf einen Test an: Welche schwankenden Werte kriegst du, während du das Glas auf die Waage stellst?

Die erste Messung ist schon das Gewicht des leeren Glases. Der Wert schwankt eigentlich nicht da ich die Variable gewicht als int deklariert habe also ist der Wert sobald das Glas steht stabil.

Die erste Messung ist schon das Gewicht des leeren Glases.

Ist der reset - Knopf ein wichtiges Bedien-Element bei dir? oder was ist die “erste Messung” ?

1 Jahr C Erfahrung

loop() ist nicht main()

pinMode hat in der Regel in loop() nichts zu suchen.
Wofür ist generell pinMode(glas,OUTPUT); gut ?

loop sollte optimalerweise nur einen Moment beschreiben und immer wieder aufgerufen werden.
Das passiert dann mehrere Male je millisekunde.
Über static oder globale Variable merkst du dir alles, was nicht aus dem aktuellen Gewicht abgeleitet werden kann ( evtl auch, ob ein Cocktail fertig ist und ob das Gewicht für einen neuen Start erstmal wieder auf < 20 gehen muss (?) Auch, ob gerade die Gelegenheit für die Tara-Messung ist.

while-Schleifen sind in der Regel unnötig oder falsch, stören nur das nicht-blockierende-loop() - Konzept.

Ansonsten: Vorsicht beim Entnehmen des fertigen Cocktails, dass da nicht sofort wieder nachgeschenkt wird. :wink: