Hi,
ich möchte mit einem ADXL345 Erschütterung erkennen. Die Empfindlichkeit des ADXL soll mittels Potentiometer eingestellt werden können.
Da ich einen ESP8266 verwenden will und der Analoge Eingang schon für etwas anderes benutzt wird muss ich auf einen A/D Wandler zurückgreifen, wo ich mich für den MCP3021 entschieden habe. Die Bibliotheken die ich verwende:
MCP3021: GitHub - pilotak/MCP3X21: Arduino library for MCP3021 I2C ADC
ADXL345: GitHub - wollewald/ADXL345_WE: Arduino Library for the ADXL345 accelerometer. I2C and SPI are implemented.
Da es für den MCP3021 kein fertiges Modul gibt hab ich mich an der „Typical Test Configuration" im Datenblatt orientiert und mir selbst eins gemacht.
Wenn ich jetzt A/D Wandler und ADXL345 einzeln mit den Beispielsketches ausprobiere funktionieren beide ohne Probleme. Sobald ich aber mein „zusammengestelltes" Programm ausprobiere beträgt „result" des MCPs 65535, was ja 16 Bit entsprechen würde. Der MCP3021 hat ja aber nur eine Auflösung von 10 Bit. Der Wert ändert sich dann auch nicht mehr wenn ich am Poti drehe. In dem angehängten Bild musste ich andere Bauteile verwenden da ich in Fritzing den ADXL und den MCP nicht gefunden habe. Ging mir aber nur darum euch zu zeigen wie ich sie an den I2C Bus angeschlossen habe. Der Widerstand von VCC zu SDA und SCL ist durch das Parallel schalten nicht zu gering geworden, liegt noch bei ca. 3,3kΩ. Kann es sein das die zwei Bibliotheken sich irgendwie beißen ?
#include<Wire.h>
#include "MCP3X21.h"
#include<ADXL345_WE.h>
#define ADXL345_I2CADDR 0x53 // 0x1D if SDO = HIGH
const uint8_t address = 0x4D;
const uint16_t ref_voltage = 3300;
const int int2Pin = 2;
int resultnew = 0;
float potiwert = 0;
bool interruptON = false;
byte intSource;
volatile bool in_activity = false;
ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR);
MCP3021 mcp3021(address);
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(int2Pin, INPUT);
Serial.println("ADXL345_Sketch - Activity and Inactivity Interrupts");
Serial.println();
if (!myAcc.init()) {
Serial.println("ADXL345 not connected!");
}
myAcc.setDataRate(ADXL345_DATA_RATE_50);
Serial.print("Data rate: ");
Serial.print(myAcc.getDataRateAsString());
delay(25);
myAcc.setRange(ADXL345_RANGE_16G);
Serial.print(" / g-Range: ");
Serial.println(myAcc.getRangeAsString());
Serial.println();
attachInterrupt(digitalPinToInterrupt(int2Pin), in_activityISR, RISING);
myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 1, 2.0);
myAcc.setInterrupt(ADXL345_ACTIVITY, INT_PIN_2);
uint16_t result = mcp3021.read();
result = map(result, 0, 1023, 300, 1600);
if (result != resultnew) {
//result = map(result, 0, 32767, 300, 1600);
potiwert = (result / 100.00);
myAcc.setActivityParameters(ADXL345_AC_MODE, ADXL345_XYZ, potiwert);
delay(25);
myAcc.setInactivityParameters(ADXL345_DC_MODE, ADXL345_XY0, 1, 1);
Serial.print("Mein Sensor ist jetzt auf: ");
Serial.println(potiwert);
Serial.println("g eingestellt");
Serial.print("Der Wert des ADC beträgt: ");
Serial.println(result);
delay(25);
resultnew = result;
}
}
void loop() {
if (in_activity == true) {
//byte actTapSource = myAcc.getActTapStatus();
//Serial.println(actTapSource, BIN);
String axes = myAcc.getActTapStatusAsString();
intSource = myAcc.readAndClearInterrupts();
if (myAcc.checkInterrupt(intSource, ADXL345_ACTIVITY)) {
delay(100);
if (digitalRead(2) == true) {
interruptON = true;
}
Serial.print("interrupt Merker:");
Serial.println(interruptON);
Serial.print("Activity at: ");
Serial.println(axes);
}
Serial.print("Status I2: ");
Serial.println(digitalRead(2));
myAcc.readAndClearInterrupts();
in_activity = false;
if (myAcc.checkInterrupt(intSource, ADXL345_INACTIVITY)) {
Serial.println("Inactivity!");
}
interruptON = false;
}
}
void in_activityISR() {
in_activity = true;
}

