INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wägezelle nur zu bestimmten Zeitpunkten auslesen
01.12.2020, 18:56 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 18:59 von DerMaschbaustudent.)
Beitrag #1
Wägezelle nur zu bestimmten Zeitpunkten auslesen
Guten Abend liebes Forum.

Ich bin grade dabei eine Prüfeinrichtung für Bruchversuche zu entwerfen, welche über zwei Schrittmotoren eine Kraft aufbringt und über eine Wägezelle die erforderliche Bruchkraft aufzeichnet.

Das Verfahren der Motoren steht komplett und wurde in einer FSM programmiert.
Die Kalibierung der Wägezelle funktioniert auch in der FSM.

Jedoch weiss ich nicht, wie ich mir nur zu einem bestimmten Zeitpunkt eine Reihe an Werten von der Wägezelle ausgeben lassen kann. In meinem Fall sollen nur Werte aufgezeichnet werden, wenn der Prüfstempel in Bewegung ist. (Am wichtigsten ist die Kraftaufzeichnung während der Runterfahrphase).
Es soll also im Loop-Teil in dem zweiten Teil des Switchcases (Zustand vorwärts) eine Wertereihe ausgegeben werden, welche mit dem Herunterfahren des Prüfstempels beginnt und schlagartig an dem Umkehrpunkt des Motors aufhört.
In diesem Case sollen alle 100 ms ein Wert ausgezeichnet und ausgegeben werden.


Mit freundlichen Grüßen,


Maxi


Code:
#include <MobaTools.h>

const byte dirPin1    = 2;
const byte stepPin1   = 3;
const byte enaPin1    = 7;
const byte MS11       = 6;
const byte MS12       = 5;
const byte MS13       = 4;
const byte dirPin2    = 8;
const byte stepPin2   = 9;
const byte enaPin2    =10;
const byte MS21       =13;
const byte MS22       =12;
const byte MS32       =11;
long angle;
int i;
int taster           =30;
int tasterstatus     = 0;
                          
MoToStepper myStepper1 (3200, STEPDIR);
MoToStepper myStepper2 (3200, STEPDIR);

enum states_t : byte { WARTEN, VORWAERTS, RUECKWAERTS };
states_t zustand;

#include <HX711_ADC.h>
#include <EEPROM.h>
//HX711 constructor (dout pin, sck pin):
HX711_ADC LoadCell(39,41);
int eepromAdress = 0;
unsigned long t = 0;
void calibrate() {
  Serial.println("***");
  Serial.println("Kalibrierungsstart:");
  Serial.println("Kalibrierung bitte unbelastet starten!");
  Serial.println("Bekannte Masse auf Wägezelle auflegen.");
  Serial.println("Danach das Gewicht in Gramm in den seriellen Monitor eintragen.");
  float m = 0;
  boolean f = 0;
  while (f == 0) {
    LoadCell.update();
    if (Serial.available() > 0) {
      m = Serial.parseFloat();
      if (m != 0) {
        Serial.print("Bekannte Masse in Gramm: ");
        Serial.println(m);
        f = 1;
      }
      else {
        Serial.println("Ungültiger Wert");
      }
    }
  }
  float c = LoadCell.getData() / m;
  LoadCell.setCalFactor(c);
  Serial.print("Kalibrierungswert: ");
  Serial.print(c);
  f = 0;
  Serial.print("Wert in EEPROM" );
  Serial.print(eepromAdress);
  Serial.print(" zwischenspeichern?");
  Serial.println(" y/n");
  while (f == 0) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
        #if defined(ESP8266)
        EEPROM.begin(512);
        #endif
        EEPROM.put(eepromAdress, c);
        #if defined(ESP8266)
        EEPROM.commit();
        #endif
        EEPROM.get(eepromAdress, c);
        Serial.print("Wert ");
        Serial.print(c);
        Serial.print("In EEPROM ");
        Serial.println(eepromAdress);
        Serial.print("gespeichert.");
        f = 1;
      }
      else if (inByte == 'n') {
        Serial.println("Wert nicht in EEPROM gespeichert");
        f = 1;
      }
    }
  }
  Serial.println("Kalibrierung beendet");
  Serial.println("Für manuelle Abänderung 'c' eingeben.");
  Serial.println("***");
}
void changeSavedCalFactor() {
  float c = LoadCell.getCalFactor();
  boolean f = 0;
  Serial.println("***");
  Serial.print("Aktueller Wert: ");
  Serial.println(c);
  Serial.println("Neues Gewicht eingeben in der Form [gggg.00]");
  while (f == 0) {
    if (Serial.available() > 0) {
      c = Serial.parseFloat();
      if (c != 0) {
        Serial.print("Neuer Kalibrierungswert: ");
        Serial.println(c);
        LoadCell.setCalFactor(c);
        f = 1;
      }
      else {
        Serial.println("Ungültiger Wert, beenden");
        return;
      }
    }
  }
  f = 0;
  Serial.print("Wert in EEPROM ");
  Serial.print(eepromAdress);
  Serial.print(" speichern?");
  Serial.println("y/n");
  while (f == 0) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
        #if defined(ESP8266)
        EEPROM.begin(512);
        #endif
        EEPROM.put(eepromAdress, c);
        #if defined(ESP8266)
        EEPROM.commit();
        #endif
        EEPROM.get(eepromAdress, c);
        Serial.print("Wert ");
        Serial.print(c);
        Serial.print(" gespeichert in EEPROM: ");
        Serial.println(eepromAdress);
        f = 1;
      }
      else if (inByte == 'n') {
        Serial.println("Wert nicht in EEPROM gespeichert");
        f = 1;
      }
    }
  }
  Serial.println("Kalibrierungsgewicht ändern");
  Serial.println("***");
}

void setup() {
  myStepper1.attach (stepPin1, dirPin1);
  myStepper2.attach (stepPin2, dirPin2);
  pinMode (enaPin1, OUTPUT);  
  pinMode (enaPin2, OUTPUT);
  pinMode (MS11,    OUTPUT);
  pinMode (MS12,    OUTPUT);
  pinMode (MS13,    OUTPUT);
  pinMode (MS21,    OUTPUT);
  pinMode (MS22,    OUTPUT);
  pinMode (MS32,    OUTPUT);
  pinMode (taster,  INPUT_PULLUP);
  digitalWrite( enaPin1 ,LOW);
  digitalWrite( enaPin2 ,LOW);
  digitalWrite( MS11    ,HIGH);
  digitalWrite( MS12    ,HIGH);
  digitalWrite( MS13    ,HIGH);
  digitalWrite( MS21    ,HIGH);
  digitalWrite( MS22    ,HIGH);
  digitalWrite( MS32    ,HIGH);
  Serial.begin(9600);
  Serial.println();
  Serial.println("Starting...");
  LoadCell.begin();
  long stabilisingtime = 2000; // tare preciscion can be improved by adding a few seconds of stabilising time
  LoadCell.start(stabilisingtime);
  if (LoadCell.getTareTimeoutFlag()) {
    Serial.println("TIMEOUT!! Verkabelung und Anschlüsse prüfen.");
  }
  else {
    LoadCell.setCalFactor(1.0); // user set calibration value (float)
    Serial.println("Startup und Tara abgeschlossen");
  }
  while (!LoadCell.update());
  calibrate();
  
  

  Serial.println("Taster drücken zum Starten des Steuerkreises.");
}


void loop() {
  tasterstatus = digitalRead(taster);
  LoadCell.update();
  switch ( zustand ) {
    case WARTEN:        // Warten auf den Tastendruck zum Starten
      if (tasterstatus == HIGH) {
  //get smoothed value from the data set

        Serial.println("Taste gedrückt -> Vorwärts");
        myStepper1.setSpeed (10);
        myStepper2.setSpeed (10);
        myStepper1.write (-150);
        myStepper2.write (-150);
        
        zustand = VORWAERTS;
      }
      break;
    case VORWAERTS:     // Motore laufen vorwärts, Sensor auslesen
      if ( !myStepper1.moving() && !myStepper2.moving() ) {  
        if (millis() > t + 100) {
    float i = LoadCell.getData();
    Serial.print("Gemessene Kraft in Kg: ");
    Serial.println(i*0.001); //Umrechnung Gramm in Kilogramm
    Serial.print("Gemessene Belastung in Newton: ");
    Serial.println(i*0.00981); // Umrechnung Gramm in Newton
    t = millis();}
        Serial.println("Endpunkt erreicht -> zurück");
        myStepper1.setSpeed (60);
        myStepper2.setSpeed (60);
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = RUECKWAERTS;
      }
      break;
    case RUECKWAERTS:
      if ( !myStepper1.moving() && !myStepper2.moving() ) {
        // Beide Stepper haben Startpunkt wieder erreicht, Ende
        Serial.println("Fertig, wieder auf Taste warten");
        myStepper1.setSpeed (60);
        myStepper2.setSpeed (60);
        myStepper1.write (0);
        myStepper2.write (0);
        zustand = WARTEN;
      }
      break;

  }
}


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.12.2020, 19:40 (Dieser Beitrag wurde zuletzt bearbeitet: 01.12.2020 19:43 von MicroBahner.)
Beitrag #2
RE: Wägezelle nur zu bestimmten Zeitpunkten auslesen
Liest Du eigentlich nicht, was ich dir im anderen Thread geschrieben habe?
Wenn Du es nicht in der Funktion readsensor einbauen willst, dann solltest Du es genau da einbauen, wo in meinem Beispiel readsensor aufgerufen wird. Schau dir das bitte nochmal genau an, dann solltest Du erkennen, was Du falsch machst.

Das Ganze in 2 Threads zu zerreissen macht mMn auch keinen Sinn. Das gehört alles zusammen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arrayelemente von Datentyp DeviceAddress einzeln auslesen wmauss 4 213 19.07.2021 21:16
Letzter Beitrag: wmauss
  SIM800L - SMS empfangen und auslesen der Signalstärke gleichzeitig Ralf992 17 619 04.07.2021 18:06
Letzter Beitrag: Tommy56
  Auslesen von Pearl Funktempgeber volvodidi 14 800 23.05.2021 20:10
Letzter Beitrag: Tommy56
  Sketch wieder auslesen Renti 10 1.480 16.04.2021 08:27
Letzter Beitrag: MicroBahner
  arduino elegoo uno r3 auslesen und HexFile speichern desperando 11 1.635 29.10.2020 15:11
Letzter Beitrag: GuaAck
  Arduino DMX wert mit serial port auslesen Arduino DMX Master 2 1.666 10.06.2020 16:27
Letzter Beitrag: Chopp
  Motordaten von Zusatzsensoren per Arduino auslesen PingPong92 14 5.113 19.04.2020 09:28
Letzter Beitrag: Tommy56
  Temperatursensor DS18B20 direkt auslesen Igom 9 2.656 26.03.2020 19:21
Letzter Beitrag: hotsystems
  Den Wert eines PWM Pins auslesen - was mache ich falsch? Gelegenheitsbastler 8 2.748 25.11.2019 10:49
Letzter Beitrag: MicroBahner
  PWM springt bei einem bestimmten Wert auf High fingerpfeifer 18 3.791 16.10.2019 22:31
Letzter Beitrag: fingerpfeifer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste