Misurazione g-force

Buongiorno a tutti, sono un nuovo iscritto.
Le mie conoscenze su Arduino sono alquanto basilari essendo uno studente informatico. Mi diletto amatorialmente con arduino giusto per divertimento personale. Quindi ringrazio in anticipo chi mi potrà aiutare adesso e in seguito.
Avrei bisogno di aiuto riguardo un codice che sto sviluppando; esso, riguarda la misurazione della forza g in accelerazione e in frenata di un qualsiasi veicolo. La difficoltà sta nel fatto che, usando un accelerometro adxl335, ho tre assi che lavorano in base all'inclinazione. Come potrei fare? Di seguito, vi pubblico il codice (non funzionante e la foto dei componenti usati sulla breadboard! Grazie mille.



long previousmillis = 0;
long interval = 900; // = 3/4 seconds
boolean triggered = false;
long startTime;

// Identifying variable pins

const unsigned int X_AXIS_PIN = A0;
const unsigned int Y_AXIS_PIN = A1;
const unsigned int Z_AXIS_PIN = A2;
const unsigned int NUM_AXES = 3;
const unsigned int PINS[NUM_AXES] = {
  X_AXIS_PIN, Y_AXIS_PIN, Z_AXIS_PIN
};
const unsigned int BUFFER_SIZE = 200;
const unsigned int BAUD_RATE = 9600;

//defining LED pin #'s

int led1G = 2;
int led1R = 3;
int led2G = 4;
int led2R = 5;
int led3G = 6;
int led3R = 7;
int led4G = 8;
int led4R = 9;
int led5G = 10;
int led5R = 11;
int X_AXIS = A0;


int buffer[NUM_AXES][BUFFER_SIZE]; // label id="code.motion.axis_buffer"
int buffer_pos[NUM_AXES] = { 0 }; // label id="code.motion.axis_buffer_pos"

void setup()
{

  Serial.begin(BAUD_RATE);

  pinMode(led1G, OUTPUT);      //Defining LED pins as outputs output
  pinMode(led1R, OUTPUT);
  pinMode(led2G, OUTPUT);
  pinMode(led2R, OUTPUT);
  pinMode(led3G, OUTPUT);
  pinMode(led3R, OUTPUT);
  pinMode(led4G, OUTPUT);
  pinMode(led4R, OUTPUT);
  pinMode(led5G, OUTPUT);
  pinMode(led5R, OUTPUT);

  digitalWrite(led1G, LOW);      //setting LEDS to OFF for start
  digitalWrite(led1R, LOW);
  digitalWrite(led2G, LOW);
  digitalWrite(led2R, LOW);
  digitalWrite(led3G, LOW);
  digitalWrite(led3R, LOW);
  digitalWrite(led4G, LOW);
  digitalWrite(led4R, LOW);
  digitalWrite(led5G, LOW);
  digitalWrite(led5R, LOW);
}

// Buffer for smoothing readings

int get_axis(const int axis) {
  delay(100);
  buffer[axis][buffer_pos[axis]] = analogRead(PINS[axis]);
  buffer_pos[axis] = (buffer_pos[axis] + 1) % BUFFER_SIZE;

  long sum = 0;
  for (int i = 0; i < BUFFER_SIZE; i++)
    sum += buffer[axis][i];
  return round(sum / BUFFER_SIZE);

  // External AREF for better resolution

  analogReference(EXTERNAL);
}

int get_x() {
  return get_axis(0);
}
int get_y() {
  return get_axis(1);
}
int get_z() {
  return get_axis(2);
}



void loop() {

  //Print ADC reading to serial monitor

  Serial.print(get_x());
  Serial.print(" ");
  Serial.print(get_y());
  Serial.print(" ");
  Serial.println(get_z());

  //get reading from X axis input on pin A0

  X_AXIS = analogRead(X_AXIS_PIN);


  // --------G force thresholds 1g to -1g-------------

  // Both -.1 and .1 G's are omitted to rid false low G readings from road imperfections.


  //LED 1 GREEN  -.9

  if (bitRead(PORTD, 3) == HIGH && X_AXIS < 408) {
    triggered = true;
    startTime = millis();
    digitalWrite(led1G, LOW);
    digitalWrite(led1R, HIGH);

  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led1G, HIGH);
      digitalWrite(led1R, HIGH);
    }
  }
  else {
    digitalWrite(led1G, HIGH);
    digitalWrite(led1R, HIGH);

  }

  // LED1 RED -1 or .2g

  if (X_AXIS > 531 || X_AXIS < 397) {
    triggered = true;
    startTime = millis();
    digitalWrite(led1R, LOW);
    digitalWrite(led1G, HIGH);

  }
  if (triggered) {

    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led1R, HIGH);
      digitalWrite(led1G, HIGH);
    }
  }
  else {
    digitalWrite(led1R, HIGH);
    digitalWrite(led1G, HIGH);
  }


  //LED 2 GREEN -.7 or .3g


  if (bitRead(PORTD, 5) == HIGH && X_AXIS > 543 || bitRead(PORTD, 5) == HIGH &&  X_AXIS < 430) {
    triggered = true;
    startTime = millis();
    digitalWrite(led2R, HIGH);
    digitalWrite(led2G, LOW);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led2R, HIGH);
      digitalWrite(led2G, HIGH);
    }
  }
  else {
    digitalWrite(led2R, HIGH);
    digitalWrite(led2G, HIGH);
  }


  // LED 2 RED  -.8 or .4g


  if (X_AXIS > 555 || X_AXIS < 419) {
    triggered = true;
    startTime = millis();
    digitalWrite(led2R, LOW);
    digitalWrite(led2G, HIGH);

  }
  if (triggered) {


    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led2R, HIGH);
      digitalWrite(led2G, HIGH);
    }
  }
  else {
    digitalWrite(led2R, HIGH);
    digitalWrite(led2G, HIGH);
  }


  //LED 3 GREEN -.5 or .5g

  if (bitRead(PORTD, 7) == HIGH && X_AXIS > 567 || bitRead(PORTD, 7) == HIGH && X_AXIS < 452) {
    triggered = true;
    startTime = millis();
    digitalWrite(led3R, HIGH);
    digitalWrite(led3G, LOW);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led3R, HIGH);
      digitalWrite(led3G, HIGH);
    }
  }
  else {
    digitalWrite(led3R, HIGH);
    digitalWrite(led3G, HIGH);
  }


  //LED 3 RED -.6 or .6g


  if (X_AXIS > 579 || X_AXIS < 441) {
    triggered = true;
    startTime = millis();
    digitalWrite(led3R, LOW);
    digitalWrite(led3G, HIGH);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led3R, HIGH);
      digitalWrite(led3G, HIGH);
    }
  }
  else {
    digitalWrite(led3R, HIGH);
    digitalWrite(led3G, HIGH);
  }

  //LED 4 GREEN -.3 or .7g

  if (bitRead(PORTB, 1) == HIGH && X_AXIS > 591 || bitRead(PORTB, 1) == HIGH && X_AXIS < 474) {
    triggered = true;
    startTime = millis();
    digitalWrite(led4R, HIGH);
    digitalWrite(led4G, LOW);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led4R, HIGH);
      digitalWrite(led4G, HIGH);
    }
  }
  else {
    digitalWrite(led4R, HIGH);
    digitalWrite(led4G, HIGH);
  }


  //LED 4 RED -.4 or .4g


  if (X_AXIS > 603 || X_AXIS < 463) {
    triggered = true;
    startTime = millis();
    digitalWrite(led4R, LOW);
    digitalWrite(led4G, HIGH);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led4R, HIGH);
      digitalWrite(led4G, HIGH);
    }
  }
  else {
    digitalWrite(led4R, HIGH);
    digitalWrite(led4G, HIGH);
  }


  //LED 5 GREEN -.1 or .9g


  if (bitRead(PORTB, 3) == HIGH && X_AXIS > 615) {
    triggered = true;
    startTime = millis();
    digitalWrite(led5R, HIGH);
    digitalWrite(led5G, LOW);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led5R, HIGH);
      digitalWrite(led5G, HIGH);
    }
  }
  else {
    digitalWrite(led5R, HIGH);
    digitalWrite(led5G, HIGH);
  }


  //LED 5 RED -.2 or 1g


  if (X_AXIS > 627 || X_AXIS < 485 ) {
    triggered = true;
    startTime = millis();
    digitalWrite(led5R, LOW);
    digitalWrite(led5G, HIGH);
  }
  if (triggered) {
    // Check how much time has passed
    if ((millis() - startTime) > interval) {
      // Time to turn off
      triggered = false;
      digitalWrite(led5R, HIGH);
      digitalWrite(led5G, HIGH);
    }
  }
  else {
    digitalWrite(led5R, HIGH);
    digitalWrite(led5G, HIGH);
  }
}


Cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie, igor

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto. :wink:

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