ESP32 + 9DoF Deep Sleep

OP #7858248
Lesenswert?

Hallo, und zwar haben ich folgendes Problem, ich will mit dem ESP32 und dem 9DoF Sensor eine Fenstererkennung machen zuerst wollte ich den esp mit dem 9DoF in den deep sleep bringen. Das habe ich auch geschafft siehe code, aber ich will das er bei leichteren bewegung aus dem Deep sleep geht. Ich habe dazu die Register gemacht und habe gedacht das ich die Bewegungsschwelle oder irgendwas ändern kann, aber wenn ich die bewegungsschwelle zb von 80 auf 40 oder so mache dann schreibt er diesen fehler

1
No movement detected, entering deep sleep...
2
ets Jul 29 2019 12:21:46
3

4
rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
5
configsip: 0, SPIWP:0xee
6
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
7
mode:DIO, clock div:2
8
load:0x3fff0030,len:1184
9
load:0x40078000,len:13232
10
load:0x40080400,len:3028
11
entry 0x400805e4
12
Woke up

und er wacht direkt wieder auf. Ich hoffe mir kann da jemand weiterhelfen mfg Leon

1
#include <Arduino.h>
2
#include <Wire.h>
3
#include <Adafruit_Sensor.h>
4
#include <Adafruit_LSM303_U.h>
5
#include <Adafruit_9DOF.h>
6
#include <esp_sleep.h>
7
#include <WiFi.h>
8
#include <LSM303.h>
9

10
/* Sensor-Initialisierung */
11
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301);
12
Adafruit_LSM303_Mag_Unified mag = Adafruit_LSM303_Mag_Unified(30302);
13
LSM303 lsm; // 9DOF-Objekt
14

15
// Bewegungserkennungs-Parameter
16
float movementThreshold = 0.05; // Schwellenwert für Bewegungserkennung
17
sensors_event_t lastAccelEvent;
18
sensors_event_t lastMagEvent;
19
unsigned long noMovementDuration = 0;
20
const unsigned long noMovementThreshold = 2000; // 2 Sekunden ohne Bewegung
21

22
// Pin-Zuweisungen
23
const int sda = 21;
24
const int scl = 22;
25
const int intPin = 15; // Interrupt-Pin für LSM303
26

27
// Funktion zur Bewegungserkennung
28
bool detectMovement(sensors_event_t *currentEvent) {
29
    float deltaY = abs(currentEvent->acceleration.y - lastAccelEvent.acceleration.y);
30
    float deltaZ = abs(currentEvent->acceleration.z - lastAccelEvent.acceleration.z);
31
    return (deltaY > movementThreshold || deltaZ > movementThreshold);
32
}
33

34
void setup() {
35
    Serial.begin(115200);
36
    Serial.println("Woke up");
37

38
    // I2C-Initialisierung
39
    Wire.begin(sda, scl);
40
    delay(500);
41

42
    // LSM303 Initialisierung
43
    if (!lsm.init()) {
44
        Serial.println("Failed to initialize LSM303. Check your wiring!");
45
        while (1);
46
    }
47

48
    // Sensor initialisieren
49
    if (!accel.begin()) {
50
        Serial.println(F("Ooops, no LSM303 accel detected ... Check your wiring!"));
51
        while (1);
52
    }
53
    if (!mag.begin()) {
54
        Serial.println("Ooops, no LSM303 mag detected ... Check your wiring!");
55
        while (1);
56
    }
57

58
    // Konfiguration des LSM303 Accelerometers
59
    lsm.writeAccReg(LSM303::CTRL_REG1_A, 0x27); // Normal Mode, 50Hz, alle Achsen aktiv
60
    lsm.writeAccReg(LSM303::CTRL_REG2_A, 0x00); // Kein High-Pass Filter
61
    lsm.writeAccReg(LSM303::CTRL_REG3_A, 0b01000100); // Interrupt auf INT1 enabled
62
    lsm.writeAccReg(LSM303::CTRL_REG4_A, 0x00); // +-2g Empfindlichkeit
63
    lsm.writeAccReg(LSM303::INT1_CFG_A, 0b00101010); // ZHIE und ZLIE aktiv
64
    lsm.writeAccReg(LSM303::INT1_THS_A, 80); // Bewegungsschwelle, ~16mg pro LSB
65
    lsm.writeAccReg(LSM303::INT1_DURATION_A, 0x00); // Dauer für Interrupt, 0ms
66

67
    // ESP32 Konfiguration für Deep Sleep
68
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_15, 1); // Wakeup bei INT1
69
    WiFi.mode(WIFI_OFF); // Deaktiviert WiFi
70
    btStop(); // Deaktiviert Bluetooth
71
    setCpuFrequencyMhz(80); // CPU-Frequenz reduzieren
72

73
    // Speichere initiale Sensorwerte
74
    accel.getEvent(&lastAccelEvent);
75
    mag.getEvent(&lastMagEvent);
76
}
77

78
void loop() {
79
    // Neue Sensorwerte lesen
80
    sensors_event_t magEvent;
81
    mag.getEvent(&magEvent);
82
    sensors_event_t accelEvent;
83
    accel.getEvent(&accelEvent);
84

85
    // Bewegungserkennung
86
    if (detectMovement(&accelEvent)) {
87
        // Bewegung erkannt: Daten ausgeben
88
        Serial.println(F("Movement detected! Sensor data:"));
89
        Serial.print(F("ACCEL X: ")); Serial.print(accelEvent.acceleration.x);
90
        Serial.print(F(" Y: ")); Serial.print(accelEvent.acceleration.y);
91
        Serial.print(F(" Z: ")); Serial.println(accelEvent.acceleration.z);
92
        Serial.print(F("MAG X: ")); Serial.print(magEvent.magnetic.x);
93
        Serial.print(F(" Y: ")); Serial.print(magEvent.magnetic.y);
94
        Serial.print(F(" Z: ")); Serial.println(magEvent.magnetic.z);
95
        Serial.println();
96

97
        // Letzte Werte aktualisieren
98
        lastAccelEvent = accelEvent;
99
        lastMagEvent = magEvent;
100

101
        // Bewegung erkannt, ESP bleibt wach
102
        noMovementDuration = 0;
103
        delay(1000); // Verzögerung für Ausgabe
104
    } else {
105
        // Keine Bewegung erkannt
106
        noMovementDuration += 1000;
107
        delay(1000);
108

109
        // Übergang in Deep Sleep
110
        if (noMovementDuration >= noMovementThreshold) {
111
            Serial.println(F("No movement detected, entering deep sleep..."));
112
            esp_deep_sleep_start();
113
        }
114
    }
115
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren