AIvoices/firmware-cpp/test/touch_sleep.cpp
2025-04-08 14:05:27 +01:00

149 lines
5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <Arduino.h>
#include <esp_sleep.h>
#include <driver/touch_sensor.h>
// Use touch pad channel 2 (T2)
#define TOUCH_PAD_CHANNEL TOUCH_PAD_NUM2
// Set the threshold value adjust this value for your hardware
#define TOUCH_THRESHOLD 60000
// Duration (in milliseconds) required for a long press
#define LONG_PRESS_MS 1000
// Task handles (optional, for task management)
TaskHandle_t fibTaskHandle = NULL;
TaskHandle_t touchTaskHandle = NULL;
// Define RGB LED pins
#define READ_PIN_T 8
#define GREEN_PIN_T 9
#define BLUE_PIN_T 13
//------------------------------------------------------------------------------
// RGB LED Task: Cycle through colors every 1 second
//------------------------------------------------------------------------------
void ledTaskT(void* parameter) {
// Set pins as outputs
pinMode(READ_PIN_T, OUTPUT);
pinMode(GREEN_PIN_T, OUTPUT);
pinMode(BLUE_PIN_T, OUTPUT);
while (true) {
// Red
digitalWrite(READ_PIN_T, HIGH);
digitalWrite(GREEN_PIN_T, LOW);
digitalWrite(BLUE_PIN_T, LOW);
delay(1000);
// Green
digitalWrite(READ_PIN_T, LOW);
digitalWrite(GREEN_PIN_T, HIGH);
digitalWrite(BLUE_PIN_T, LOW);
delay(1000);
// Blue
digitalWrite(READ_PIN_T, LOW);
digitalWrite(GREEN_PIN_T, LOW);
digitalWrite(BLUE_PIN_T, HIGH);
delay(1000);
}
}
//------------------------------------------------------------------------------
// enterSleep: Wait for a stable release, enable touch wake, and enter deep sleep
//------------------------------------------------------------------------------
void enterSleep() {
Serial.println("Preparing to sleep...");
// Wait until the touch pad reading shows "release"
// (Assuming that a reading above TOUCH_THRESHOLD means a touch.)
while (touchRead(TOUCH_PAD_CHANNEL) > TOUCH_THRESHOLD) {
delay(50);
}
// Extra delay to allow any residual contact or noise to settle
delay(500);
// Enable touchpad wakeup using the Arduino API.
// This configures the ESP32 so that a new touch on channel 2 will wake it.
touchSleepWakeUpEnable(TOUCH_PAD_CHANNEL, TOUCH_THRESHOLD);
Serial.println("Entering deep sleep now.");
esp_deep_sleep_start();
// Execution stops here until a wakeup occurs.
}
//------------------------------------------------------------------------------
// Touch Task: Monitor the touch pad to detect a long press and trigger sleep
//------------------------------------------------------------------------------
void touchTask(void* parameter) {
touch_pad_init();
touch_pad_config(TOUCH_PAD_NUM2);
bool touched = false;
unsigned long pressStartTime = 0;
while (true) {
// Read the touch sensor
uint32_t touchValue = touchRead(TOUCH_PAD_CHANNEL);
Serial.printf("Touch Pad Value: %u\n", touchValue);
// On the ESP32-S3, a reading above TOUCH_THRESHOLD indicates a touch.
bool isTouched = (touchValue > TOUCH_THRESHOLD);
// Detect transition from "not touched" to "touched"
if (isTouched && !touched) {
touched = true;
pressStartTime = millis();
Serial.println("Touch detected press started.");
}
// Detect transition from "touched" to "released"
if (!isTouched && touched) {
touched = false;
unsigned long pressDuration = millis() - pressStartTime;
if (pressDuration >= LONG_PRESS_MS) {
Serial.print("Long press detected (");
Serial.print(pressDuration);
Serial.println(" ms) going to sleep.");
// Call enterSleep() which will wait for a stable release, enable wake, and sleep.
enterSleep();
// (The device will reset on wake, so code execution won't continue here.)
} else {
Serial.print("Short press detected (");
Serial.print(pressDuration);
Serial.println(" ms) ignoring.");
}
}
delay(50); // Small delay to avoid spamming readings
}
// (This point is never reached.)
vTaskDelete(NULL);
}
//------------------------------------------------------------------------------
// setup: Initialize Serial, print wakeup cause, and create tasks
//------------------------------------------------------------------------------
void setup() {
Serial.begin(115200);
delay(500);
// Check the wakeup cause and print a message
esp_sleep_wakeup_cause_t wakeupCause = esp_sleep_get_wakeup_cause();
if (wakeupCause == ESP_SLEEP_WAKEUP_TOUCHPAD) {
Serial.println("Woke up from touchpad deep sleep.");
} else {
Serial.println("Normal startup.");
}
// Create the Fibonacci task (prints every 1 second)
xTaskCreate(ledTaskT, "FibonacciTask", 2048, NULL, 1, &fibTaskHandle);
// Create the Touch task (monitors the touch pad)
xTaskCreate(touchTask, "TouchTask", 2048, NULL, 1, &touchTaskHandle);
}
//------------------------------------------------------------------------------
// loop: Not used as tasks handle all work
//------------------------------------------------------------------------------
void loop() {
// Nothing to do here.
}