Frage zu ADXL345

Hallo an alle
Ich habe nur eine kurze Frage zu dem Code .
Ich habe eine Ortungspiepser gebaut.
Der läuft auch zuverlässig.
Das einzige was mich nur Stört ist das er sofort losgeht , wenn das Fahrzeug
für nur eine Sekunde steht. Daher habe ich versucht eine Verzögerung einzubauen. Was ich aber nicht hinbekomme.
Kann mir mal jemand einen Tip geben wie ich es besser nachen kann.
Danke Stefan

#include <Wire.h>
int ADXL345 = 0x53; // The ADXL345 sensor I2C address
float X_out; //Y_out, Z_out;  // Outputs
int Led_Blau = 9;
int Buzzer = 8;
int i = 5;
int PZ = 100;
bool Pause = LOW;
int Zeitein = 5000;
int Zeitaus = 10000;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  pinMode(Led_Blau, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  Wire.beginTransmission(ADXL345);
  Wire.write(0x2D);
  Wire.write(8); //
  Wire.endTransmission();
  delay(10);
  digitalWrite (Led_Blau, HIGH);
  digitalWrite (Buzzer, HIGH);
  delay(1000);
  digitalWrite (Led_Blau, LOW);
  digitalWrite (Buzzer, LOW);
  delay(2000);
  while (i > 0) {
    i--;
    digitalWrite(Led_Blau, HIGH);
    delay(PZ);
    digitalWrite(Led_Blau, LOW);
    delay(PZ);
    //Serial.println(i);
  }
}

void loop() {
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32);
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345,   6, true);
  X_out = ( Wire.read() | Wire.read() << 2);
  X_out = X_out;
  if ((millis()%Zeitein < Zeitaus  ) && Pause == Led_Blau, LOW);
  if (X_out   < 10 )  digitalWrite (Led_Blau, HIGH);
  if (X_out   > 10 )  digitalWrite (Led_Blau, LOW);
  
  Serial.print("Xa= ");
  Serial.print(X_out);
  Serial.println();

}`

Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.
Außerdem formatiere den Code bitte ordentlich. Strg+T in der IDE hilft Dir dabei.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Das kannst du einfacher schreiben, indem du es ganz weglässt.

Wenn das deine Verzögerung sein soll, wäre es gut, wenn du genauer beschreibst, was du eigentlich vorhast.

Hallo michael_x
Ich möchte nur das der Ortungspiepser nicht gleich los geht wenn das Fahrzeug steht. Es würde langen wenn der Ortungspiepser nach einer Minute anspringt.Nur für den fall das das Fahrzeug mal auser sichtweite kommt.

Danke Stefan

Wenn Xout unter 10 fällt, setzt du eine Zustandsvariable auf True und merkst dir den zurückgegebenen Wert von millis() in einer Variable.
Wenn millis() einen um X größeren Wert zurück liefert als der von dir gemerkte, dann führe dein Blinken (piepsen) aus.

Ich denke diese Codezeile macht nicht das was du dir vorstellst.

arbeite es in einer Finite State Machine ab.

im Status 0 prüfst du auf Eintritt deines Events, merkst dir in previousMillis die Zeit und schaltest weiter in Status 1
im Status 1 prüfst du mit millis()-previousMillis ob die Zeit erreicht ist und schaltest gegebenenfalls deinen Beeper ein und schaltest in Status 2.
weiters prüfst du ob das Kritierum noch immer erfüllt ist und schaltest gegebenfalls zurück in den Status 0
im Status 2 prüfst du ob das Kriterium noch immer erfüllt ist und schaltest gegebenenfalls zurück in den Status 0/schaltest den beeper ab.

Hallo an alle
Erstmal danke für die Antworten.
Das habe ich noch nie gehört , werde mich jetzt mal ein bischen einlesen , und dann wieder melden .

Hallo an alle
Ich habe mich jetzt mal mit der Finite State Machine beschäftigt.
Das Prinzip habe ich verstanden , und habe den Code geändert.
Aber der Code geht nicht richtig. Am Serial Monitor wird die achse auch angezeigt. Aber das mit den Leds klappt nicht.
Kann mir da mal jemand einen Tip geben was ich falsch mache.

Danke Stefan

#include <Wire.h>
int ADXL345 = 0x53; // The ADXL345 sensor I2C address
float X_out; //Y_out, Z_out;  // Outputs
int Led_Blau = 9;
int Buzzer = 8;
int i = 10;
int PZ = 100;
enum LedStates {AUS, EIN, LED };
LedStates ledState = AUS;
unsigned long letzteZeit = 0;  //  Zeitpunkt letzte LED-Änderung
const    long intervall  = 5000;    // Blinkintervall in ms (Konstante)

void setup() {
  Serial.begin(9600);
  Wire.begin();
  pinMode(Led_Blau, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  Wire.beginTransmission(ADXL345);
  Wire.write(0x2D);
  Wire.write(8); //
  Wire.endTransmission();
  delay(10);
  digitalWrite (Led_Blau, HIGH);
  digitalWrite (Buzzer, HIGH);
  delay(1000);
  digitalWrite (Led_Blau, LOW);
  digitalWrite (Buzzer, LOW);
  delay(2000);
  while (i > 0) {
    i--;
    digitalWrite(Led_Blau, HIGH);
    delay(PZ);
    digitalWrite(Led_Blau, LOW);
    delay(PZ);
    Serial.println(i);
  }
}

void loop() {
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32);
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true);
  X_out = ( Wire.read() | Wire.read() << 2);

  if (millis() - letzteZeit >= intervall)

    letzteZeit = millis();
  switch (ledState)
  {
    case AUS:
      ledState = LED;
      digitalWrite(Led_Blau, LOW);
      digitalWrite(Buzzer, LOW);
      break;

    case EIN:
      ledState = LED;
      digitalWrite(Led_Blau, HIGH);
      digitalWrite(Buzzer, HIGH);
      break;
  }
  Serial.print("Xa= ");
  Serial.print(X_out);
  Serial.println();
}

`

Gibt es diese Aussage auch mit Inhalt? Was geht, was wird erwartet, ws passiert?

Gruß Tommy

Hallo Tommy
Wenn der Sensor nicht bewegt wird sollen die Leds b.w.z. der Busser nach 5 Sekungen anspringen. Am Serial Monitor wird der Wert der Achse auch angezeigt wenn die lage verändert wird.

Danke Stefan

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.