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

123 lines
No EOL
3.6 KiB
C++

#include <Arduino.h>
#include <FreeRTOS.h>
#include <task.h>
// Pin definitions
#define TOUCH_PIN 2
#define RED_LED_PIN 8
#define GREEN_LED_PIN 9
#define BLUE_LED_PIN 13
// Touch sensor threshold (adjust based on your environment)
#define TOUCH_THRESHOLD 40
// Color sequence and timing
const uint8_t colorSequence[][3] = {
{0, 255, 255}, // Cyan
{255, 0, 255}, // Pink
{255, 255, 0}, // Yellow
};
const int NUM_COLORS = sizeof(colorSequence) / sizeof(colorSequence[0]);
// RTOS task handle and state variables
TaskHandle_t colorPulseTaskHandle = NULL;
volatile bool ledOn = false;
void setup() {
Serial.begin(115200);
// Initialize LED pins
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
analogWrite(RED_LED_PIN, 0);
analogWrite(GREEN_LED_PIN, 0);
analogWrite(BLUE_LED_PIN, 0);
// Create color pulse task (suspended initially)
xTaskCreate(
colorPulseTask, // Task function
"ColorPulse", // Task name
4096, // Stack size
NULL, // Parameters
1, // Priority
&colorPulseTaskHandle
);
vTaskSuspend(colorPulseTaskHandle);
}
void loop() {
static bool lastTouchState = false;
static unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
// Read touch sensor
int touchValue = touchRead(TOUCH_PIN);
bool currentTouchState = (touchValue < TOUCH_THRESHOLD);
// Debounce logic
if (currentTouchState != lastTouchState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (currentTouchState && !lastTouchState) {
ledOn = !ledOn;
if (ledOn) {
vTaskResume(colorPulseTaskHandle);
} else {
vTaskSuspend(colorPulseTaskHandle);
analogWrite(RED_LED_PIN, 0);
analogWrite(GREEN_LED_PIN, 0);
analogWrite(BLUE_LED_PIN, 0);
}
}
lastTouchState = currentTouchState;
}
vTaskDelay(10 / portTICK_PERIOD_MS); // Yield to other tasks
}
void colorPulseTask(void *pvParameters) {
while (1) {
unsigned long currentTime = millis();
loopCyanPinkYellowPulse(currentTime);
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
void loopCyanPinkYellowPulse(unsigned long currentTime) {
const unsigned long transitionDuration = 1000; // 1 second per transition
static int colorIndex = 0;
static uint8_t startColor[3];
static uint8_t endColor[3];
static unsigned long transitionStartTime = 0;
static bool initialized = false;
if (!initialized) {
memcpy(startColor, colorSequence[colorIndex], 3);
memcpy(endColor, colorSequence[(colorIndex + 1) % NUM_COLORS], 3);
transitionStartTime = currentTime;
initialized = true;
}
unsigned long elapsed = currentTime - transitionStartTime;
float t = (float)elapsed / (float)transitionDuration;
t = t > 1.0f ? 1.0f : t;
uint8_t r = startColor[0] + (endColor[0] - startColor[0]) * t;
uint8_t g = startColor[1] + (endColor[1] - startColor[1]) * t;
uint8_t b = startColor[2] + (endColor[2] - startColor[2]) * t;
analogWrite(RED_LED_PIN, r);
analogWrite(GREEN_LED_PIN, g);
analogWrite(BLUE_LED_PIN, b);
if (elapsed >= transitionDuration) {
colorIndex = (colorIndex + 1) % NUM_COLORS;
memcpy(startColor, endColor, 3);
memcpy(endColor, colorSequence[(colorIndex + 1) % NUM_COLORS], 3);
transitionStartTime = currentTime;
}
}