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