LIS3DH Interrupt - Arduino

DAASSI

Lt. Commander
Registriert
Apr. 2009
Beiträge
2.023
Hi, ich frage einfach hier mal:

Hat jemand den LIS3DH Sensor mit Interrupts in Arduino zum Laufen bekommen?
Ich habe bisher nur Erfahrungen mit dem MPU6050 gesammelt und dort konnte man einfach einen Grenzwert zur Beschleunigung setzen, ab dem ein Interrupt ausgeführt wird. Zum LIS3DH finde ich nur diese Clickbeispiele, aber das hilft mir nicht.

Ich nutze den Sensor um damit einen ESP32 aus dem Deepsleep aufzuwecken.

Laut Datenblatt sollte es möglich sein, aber auch wenn ich in das Register schreibe, passiert einfach nichts. Es wird einfach kein Interrupt ausgelöst:

1727854803944.png
 
Ja genau, der MPU6050 ist ja schon länger als EOL markiert und die Produktion wurde wohl inzwischen auch eingestellt - deshalb ist er inzwischen auch echt teuer (7€)
https://jlcpcb.com/partdetail/TdkInvensense-MPU6050/C24112

Außerdem braucht er relativ viel Strom im Active Mode, der LIS3DH ist im µA Bereich, während der 6050 bei einigen mA liegt
 
  • Gefällt mir
Reaktionen: madmax2010
Die sind bei low level hardware kram leider recht nutzlos.
Ich habe es mit der icm-20948 lange versucht (die noch keinen nachfolger hat, aber von tdk auch schon als Pre-EoL markiert wurde :/

Die hat in der Sparkfunlibrary jedoch inzwischen ein "wake on ovement"
 
OK, im Intro steht das: Laut Datenblatt sollte es möglich sein, aber auch wenn ich in das Register schreibe, passiert einfach nichts. Es wird einfach kein Interrupt ausgelöst.

Chat sagt unter Anderem: Neben dem Setzen dieser beiden Register ist es wichtig, den Interrupt an sich zu aktivieren.

Ich weiß halt nicht was schon alles versucht wurde, kenne mich damit auch absolut null aus und werde mich hier nicht weiter reinhängen.
 
Ich suche später mal den Code raus :) ChatGPT ist keine wirkliche Hilfe, das bastelt nur aus Beispielcodes was zusammen (was nicht funktioniert).

Versucht habe ich das antürlich, aber entweder wird wirklich kein Interrupt ausgelöst oder der Interrupt wird nicht erkannt
 
Zuletzt bearbeitet:
Anbei mal der Code - Ich musste sehr viel rauslöschen, deshalb kann es sein, dass manche Codeteile überflüssig sind. Im loop wird natürlich viel aufgerufen, aber nicht explizit die Interrupts abgefragt, aber das ist auch nicht Sinn von Interrupts

#include "Wire.h"
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <esp_wifi.h>
#include <esp_system.h>
#include <Adafruit_LIS3DH.h>
#include <Adafruit_Sensor.h>

//LIS3DH
Adafruit_LIS3DH lis = Adafruit_LIS3DH();
// Adjust this number for the sensitivity of the 'click' force
// this strongly depend on the range! for 16G, try 5-10
// for 8G, try 10-20. for 4G try 20-40. for 2G try 40-80
#define CLICKTHRESHHOLD 40



byte interruptPin=3;
byte interruptPin1=4;
byte interruptPin2=5;

volatile bool lis3dh = false;

int i=0;


#define I2C_SDA 6
#define I2C_SCL 7

void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("");
Serial.println("Start");
Serial.println("CPU Frequenz: " + getCpuFrequencyMhz());
//delay(100);
//print_GPIO_wake_up();
Wire.begin(I2C_SDA, I2C_SCL);
pinMode(interruptPin,INPUT);
pinMode(interruptPin1,INPUT);
pinMode(interruptPin2,INPUT);
startLIS3DH();
sensor_interrupts();
//LEDblink(150,3);

// put your setup code here, to run once:

}
void startLIS3DH()
{
if (! lis.begin(0x18)) { // change this to 0x19 for alternative i2c address
Serial.println("Couldn't find LIS3DH");
}
Serial.println("LIS3DH found!");
Serial.println(lis.getDeviceID());
lis3dh = true;
lis.setDataRate(LIS3DH_DATARATE_50_HZ);
lis.setRange(LIS3DH_RANGE_8_G); // 2, 4, 8 or 16 G!
//lis.writeRegister8(LIS3DH_CLICKCFG, 0x15);
//lis.writeRegister8(LIS3DH_CLICKTHS, 10);
lis.setClick(1,10,10,20,250);
Serial.print("Range = "); Serial.print(2 << lis.getRange());
Serial.println("G");
Serial.print("Klickwerte: "); Serial.println(lis.getClick());

// 0 = turn off click detection & interrupt
// 1 = single click only interrupt output
// 2 = double cick only interrupt output, detect single click
// Adjust threshhold, higher numbers are less sensitive
//lis.setClick(1, CLICKTHRESHHOLD);
delay(100);
}
void lis3dhread()
{
lis.read(); // get X Y and Z data at once
// Then print out the raw data
Serial.print("X: "); Serial.print(lis.x);
Serial.print(" \tY: "); Serial.print(lis.y);
Serial.print(" \tZ: "); Serial.print(lis.z);

/* Or....get a new sensor event, normalized */
sensors_event_t event;
lis.getEvent(&event);

/* Display the results (acceleration is measured in m/s^2) */
Serial.print("\t\tX: "); Serial.print(event.acceleration.x);
Serial.print(" \tY: "); Serial.print(event.acceleration.y);
Serial.print(" \tZ: "); Serial.print(event.acceleration.z);
Serial.println(" m/s^2 ");
}

void IRAM_ATTR lisInterruptHandler() {
// Diese Funktion wird aufgerufen, wenn ein Interrupt-Signal vom LIS3DH kommt.

Serial.println("LIS3DTH Interrupt signal received");
LEDblink(100,10);
Serial.println(lis.readAndClearInterrupt());

// Lies alle Register um das Interrupt Signal zurückzusetzen,
// sonst wird es kontinuierlich feuern.
lis.read();
}

void sensor_interrupts()
{
if(lis3dh==true)
{
Serial.println("Interrupts für LIS3DH werden gesetzt");
attachInterrupt(digitalPinToInterrupt(interruptPin), lisInterruptHandler, CHANGE);
attachInterrupt(digitalPinToInterrupt(interruptPin2), lisInterruptHandler, CHANGE);
//esp_sleep_enable_ext0_wakeup(gpio_num_t(interruptPin), 1);
}
//attachInterrupt(digitalPinToInterrupt(interruptPin1), lisInterruptHandler, RISING);
}

void i2c_scan()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
}
void loop()
{

}
 
void IRAM_ATTR lisInterruptHandler() {
// Diese Funktion wird aufgerufen, wenn ein Interrupt-Signal vom LIS3DH kommt.

Serial.println("LIS3DTH Interrupt signal received");
LEDblink(100,10);
Serial.println(lis.readAndClearInterrupt());

// Lies alle Register um das Interrupt Signal zurückzusetzen,
// sonst wird es kontinuierlich feuern.
lis.read();
}

Schmeiß den Serial Krams raus. Setze nur eine Flag und mach mach den Rest in der Loop
 
Zurück
Oben