Arduino schnellere Ausgaben

Hallo Leute,

ich habe einen Arduino Uno der zyklisch eine Zahl mit einem Timestamp auf die Serielle Schnittstelle legen soll.
Der Timestamp kommt vom DS3231 über den Interrupt 1024, immer wenn der auslöst zählt er eine Variable hoch.

Jetzt bekomme ich aber immer erst alle ca. 30ms eine Ausgabe, woran liegt das? Schafft der Arduino nicht schneller? Ich dachte das wären 16Bit mit 4 Mikrosekunden pro Takt.

Im Anhang ist der Code in Kurzform.

#include <HX711.h>
#include <DS3231.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <avr/sleep.h>
#include <avr/power.h>
//SoftwareSerial bdtSerial(3, 2); // RX, TX
#define DOUT  6
#define CLK  5
#define DS3231_ADDRESSE 0x68
DS3231 Clock;
bool h12;
bool PM;
const byte interruptPin = 2;

HX711 scale(DOUT, CLK);

long Offset = -68563;  // Hier ist der Wert aus der Kalibrierung einzutragen
float Skalierung = -5075;  // Hier ist der Wert aus der Kalibrierung einzutragen

long Gewicht = 999999;
long previousTime = 0;
long interval = 100;
//uint8_t lueckenfueller = 0;
uint8_t zaehler_empfangen = 10;
uint8_t zaehler_zeit = 0;
//uint8_t index = 0;
uint32_t zeit = 0; 
char rx_byte = 0; //für Test



void setup() {
    Serial.begin(9600);
  
  /* Pin 2 als Interrupt-Pin, Pullup einschalten */
  pinMode(2, INPUT);
  digitalWrite(2, HIGH); 
  
  // Start the I2C interface
  Wire.begin();
  
  //setze den Interrupt
  sqw1024HzDS3231(); 
  attachInterrupt(digitalPinToInterrupt(interruptPin), ISR_millisekunden, RISING);

  scale.set_offset(Offset);
  scale.set_scale(Skalierung);
  bool flag = false;

}

void loop() {


   Gewicht = scale.get_units(3)*-1; //Mittelwert aus 2 Messungen

    Serial.print(Gewicht);
    Serial.print(".");
    Serial.println(zeit);
   /* while (currentTime - previousTime < interval){
      currentTime = millis();
      }*/

}

void ISR_millisekunden(){


  
  //Korrigiert sich alle 42 selbst. Mit unsigned int kann 4 Tage gezählt werden
  zeit += 1;
  zaehler_zeit += 1;
  if (zaehler_zeit == 42) {
    zaehler_zeit = 0;
    zeit -= 1;
    }

Forum.ino (1.55 KB)

Hallo,

na ja .. rechnen wir mal. Du hast eine Verbindung mit 9600 gestartet. 9600 / durch 9 macht = 1066 byte/s
Das sind 1 Zeichen pro 1/1000, Damit könnte teoretisch in 30 /1000 30 Byte versendet werden. Real sind es etwa 18. Nun zähle mal nach wiefiel byte du versendest. Dann mess mal die Zeit die ein einfacher sende befehl benötigt beim senden von 0 Byte. Dann wirst du sehen was möglich ist.

Gruss Turgut

Hi temucin,

ich hatte die Baud schon mal erhöht auf 115200, hat aber leider keine Verbesserung gebracht. Deswegen habe ich gedacht, dass es nicht daran liegt. Oder kannst du dir das erklären?

Im Foto siehst du zwei zahlen die erste Zahl vor dem Punkt ist das Gewicht (10) und danach stehen die Millisekunden.

Dein HX711 steht auf wieviel Konversionen pro Sekunde?

Die Library die du benutzt blockiert, wartet also auf die Konversionen (drei?).

Hier steht eine Library, die das anders macht: GitHub - whandall/NBHX711: A non-blocking Avia HX711 library for Arduino

Hi

In der Zeit werden dann zwar wohl mehr Ausgaben generiert, aber von echten Messwerten sehe ich dann Da nicht viel - oder sollte ich Was übersehen?

MfG

@Whandall der steht auf 80Sps, meinst du das?
Warum blockiert meine Library, wenn es doch möglich ist den HX711 auf 80SPS zu stellen? oder verstehe ich da was nicht?
Hier mein Gedanke wie es funktioniert:
Der HX711 tastet mit 80SPS das verstärkte Analoge Signal ab und schickt es mir dann an den Arduino. Anschließend wird der Wert im Arduino eingelesen und dann weiter auf meine Seriellen Schnittstelle gelegt. Verbessert mich wenn ich einen Denkfehler habe.

@postmaster-ino, Gewicht = scale.get_units(3)*-1; meinst du das?

Edit: Ich habe die Library HX711 einmal auskommentiert - und siehe da, es läuft viel schneller. Ich verstehe den Sinn aber nicht. Warum kann man das Board auf 80SPS stellen wenn man es dann nur mit ca. 30Hz auslesen kann.

Du machst drei Messungen (die bei 80SPS 12,5 ms dauern) pro Ausgabe und wunderst dich über
"Jetzt bekomme ich aber immer erst alle ca. 30ms eine Ausgabe"?

Deine Bibliothek blockiert, weil sie eine Konversion abwartet ehe sie ein Ergebnis zurückliefert.