From 8e87da0aa45385c4549541f61e4a23e651ac0e06 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 6 Jun 2021 16:45:11 +0200 Subject: [PATCH] Initial commit --- dance-hat.ino | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 dance-hat.ino diff --git a/dance-hat.ino b/dance-hat.ino new file mode 100755 index 0000000..4e65d8c --- /dev/null +++ b/dance-hat.ino @@ -0,0 +1,152 @@ +#include "FastLED.h" + +#define PIN_SENSOR A3 + +#define LED_TYPE WS2811 +#define COLOR_ORDER RGB +#define MASTER_BRIGHTNESS 25 +#define LED_PIN 11 +#define LEDS_NUM 86 +CRGB leds[LEDS_NUM]; + +static uint8_t hue; +long currentTime = 0; +long statusTime = 0; + +bool lastStatus = false; +bool sensorStatus = false; +bool status = false; + +long times[10]; +int time = 0; +int numberOfReadings = 0; + +static long onTime = 0; +static long offTime = 0; +long ledStatusTime = 0; +bool ledStatus = false; + +void setup() +{ + delay(500); //power up delay + + pinMode(LED_PIN, OUTPUT); + FastLED.addLeds(leds, LEDS_NUM); + FastLED.setBrightness(MASTER_BRIGHTNESS); + FastLED.clear(); + + pinMode(PIN_SENSOR, INPUT); + +// Serial.begin(115200); +} + +void loop() +{ + lastStatus = status; + + // Prüfe ob Taster gedrückt + if (analogRead(PIN_SENSOR) > 100) + { + sensorStatus = true; + } + else + { + sensorStatus = false; + } + + // Entprellen: Wechsel nur, wennn aktueller Status sich in 20ms nicht geändert hat + if (sensorStatus == status) + { + statusTime = millis(); + } + + // If timeout, then calculate average times + if (millis() - currentTime > 2000) + { + if (numberOfReadings >= 3) + { + onTime = 0; + offTime = 0; + for (int i = 0; i < time; i = i + 2) + { + offTime = offTime + times[i]; + } + offTime = offTime / ((time + 1) / 2); + + for (int i = 1; i < time; i = i + 2) + { + onTime = onTime + times[i]; + } + onTime = onTime / ((time + 1) / 2); + } + + // Reset array, index of array, and status + time = 0; + status = false; + currentTime = millis(); + numberOfReadings = 0; + statusTime = millis(); + + } + else + { + if (millis() - statusTime > 20) + { + status = sensorStatus; + statusTime = millis(); + } + + if (lastStatus != status) + { + // Store times in array + times[time] = millis() - currentTime; + + numberOfReadings++; + time++; + if (time > 9) + { + time = 0; + } + currentTime = millis(); + } + } + + // Calculate status of LED depending on time + if (onTime > 0 && offTime > 0) + { + if (ledStatus) + { + // LED is currently on. If LED was on long enough, switch status to off + if (millis() - ledStatusTime > onTime) + { + ledStatus = false; + ledStatusTime = millis(); + } + } + else + { + if (millis() - ledStatusTime > offTime) + { + ledStatus = true; + ledStatusTime = millis(); + } + } + } + // Blink LED stripe + if (ledStatus) + { + fill_solid(leds, LEDS_NUM, CHSV(255, 0, 200)); + } + + EVERY_N_MILLISECONDS(15) + { + if (!ledStatus) + { + fill_rainbow(leds, LEDS_NUM, hue, 5); + } + + hue=hue+2; + } + + FastLED.show(); +}