Go Down

Topic: Arduino schnellere Ausgaben (Read 124 times) previous topic - next topic

Matt_W

Aug 16, 2018, 01:27 pm Last Edit: Aug 16, 2018, 01:29 pm by Matt_W
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.

Code: [Select]


#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;
    }

temucin

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

Matt_W

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.

Whandall

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: https://github.com/whandall/NBHX711

Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

postmaster-ino

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

Go Up