Forum: Projekte & Code ESP32 + 9DoF Deep Sleep


von Leon (leon12098)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.