88#define numberOfRipples 30
103#define heartbeatLockout \
105#define heartbeatDelta 300
108#define lowTemperature 33.0
109#define highTemperature 37.0
119#define gyroThreshold \
125#define randomPulsesEnabled true
126#define cubePulsesEnabled true
130#define autoPulseTimeout \
133#define randomPulseTime 2000
140#define autoPulseChangeTime 30000
143#define simulatedHeartbeatBaseTime \
145#define simulatedHeartbeatVariance \
147#define simulatedEdaBaseTime 1000
148#define simulatedEdaVariance 10000
163fl::UIDescription description(
"Take 6 seconds to boot up. Chromancer is a wall-mounted hexagonal LED display that originally reacted to biometric data from an EmotiBit sensor. It visualizes your heartbeat, skin temperature, and movement in real-time. Chromancer also has a few built-in effects that can be triggered with the push of a button. Enjoy!");
185 Serial.println(
"*** LET'S GOOOOO ***");
187 Serial.println(
"JSON SCREENMAP");
194 for (
auto kv : segmentMaps) {
195 Serial.print(kv.first.c_str());
197 Serial.println(kv.second.getLength());
205 auto red_it = segmentMaps.
find(
"red_segment");
206 ok = (red_it != segmentMaps.
end()) && ok;
207 if (red_it != segmentMaps.
end()) red = red_it->second;
209 auto black_it = segmentMaps.
find(
"back_segment");
210 ok = (black_it != segmentMaps.
end()) && ok;
211 if (black_it != segmentMaps.
end()) black = black_it->second;
213 auto green_it = segmentMaps.
find(
"green_segment");
214 ok = (green_it != segmentMaps.
end()) && ok;
215 if (green_it != segmentMaps.
end()) green = green_it->second;
217 auto blue_it = segmentMaps.
find(
"blue_segment");
218 ok = (blue_it != segmentMaps.
end()) && ok;
219 if (blue_it != segmentMaps.
end()) blue = blue_it->second;
221 Serial.println(
"Failed to get all segment maps");
241 unsigned long benchmark = millis();
245 for (
int strip = 0; strip < 40; strip++) {
246 for (
int led = 0; led < 14; led++) {
247 for (
int i = 0; i < 3; i++) {
257 for (
int segment = 0; segment < 40; segment++) {
258 for (
int fromBottom = 0; fromBottom < 14; fromBottom++) {
270 for (
int i = 0; i < 4; i++) {
271 for (
int j = 0; j <
lengths[i]; j++) {
289 unsigned int baseColor = random(0xFFFF);
290 byte centerNode = 15;
293 for (
int i = 0; i < 6; i++) {
300 baseColor + (0xFFFF / 6) * i, 255, 255),
314 unsigned int baseColor = random(0xFFFF);
320 for (
int dir = 0; dir < 6; dir++) {
344 unsigned int baseColor = random(0xFFFF);
347 for (
int i = 0; i < 6; i++) {
354 baseColor + (0xFFFF / 6) * i, 255, 255),
366 unsigned int baseColor = random(0xFFFF);
369 for (
int i = 0; i < 6; i++) {
375 baseColor + (0xFFFF / 6) * i, 255, 255),
376 .65, 1500, behavior);
386 for (
int i = 0; i < 6; i++) {
389 ripples[j].start(15, i, 0xEE1111,
390 float(random(100)) / 100.0 * .1 + .4, 1000, 0);
402 unsigned int baseColor = random(0xFFFF);
407 byte possiblePulse = 255;
409 possiblePulse = random(3);
414 switch (possiblePulse) {
443 bool foundStartingNode =
false;
444 while (!foundStartingNode) {
446 foundStartingNode =
true;
451 foundStartingNode =
false;
455 foundStartingNode =
false;
460 for (
int i = 0; i < 6; i++) {
471 float(random(100)) / 100.0 * .2 + .5, 3000,
492 for (
int i = 0; i < 6; i++) {
518 for (
int i = 0; i < 6; i++) {
524 baseColor + (0xFFFF / 6) * i, 255, 255),
525 .65, 1500, behavior);
543 for (
int i = 0; i < 6; i++) {
548 float(random(100)) / 100.0 * .1 + .4, 1000, 0);
561 for (
int i = 0; i < 10; i++) {
566 byte direction = 255;
568 while (direction == 255) {
569 direction = random(6);
575 targetNode, direction, 0x1111EE,
576 float(random(100)) / 100.0 * .5 + 2, 300, 2);
fl::UIDescription description("Demo of the Animatrix effects. @author of fx is StefanPetrick")
byte currentAutoPulseType
#define simulatedHeartbeatBaseTime
fl::UIGroup automationControls("Automation", starburstPulsesEnabled, simulatedBiometricsEnabled)
CRGB leds2[lengths[RedStrip]]
bool isNodeOnBorder(byte node)
bool wasRainbowCubeClicked
unsigned long nextSimulatedHeartbeat
fl::UIButton simulatedHeartbeat("Simulated Heartbeat")
fl::UITitle title("Chromancer")
byte ledColors[40][14][3]
fl::UIGroup displayControls("Display", sliderDecay, allWhite)
CRGB leds3[lengths[BlueStrip]]
unsigned long lastAutoPulseChange
unsigned long lastRandomPulse
#define simulatedEdaBaseTime
fl::UIGroup effectTriggers("Effect Triggers", simulatedHeartbeat, triggerStarburst, triggerRainbowCube, triggerBorderWave, triggerSpiral)
float lastKnownTemperature
fl::UIButton triggerBorderWave("Border Wave")
fl::UICheckbox starburstPulsesEnabled("Starburst Pulses", true)
#define simulatedEdaVariance
fl::UICheckbox allWhite("All White", false)
#define randomPulsesEnabled
CRGB leds1[lengths[GreenStrip]]
unsigned long lastHeartbeat
fl::UIButton triggerSpiral("Spiral Wave")
fl::UICheckbox simulatedBiometricsEnabled("Simulated Biometrics", true)
#define simulatedHeartbeatVariance
bool wasBorderWaveClicked
fl::UISlider sliderDecay("decay",.97f,.8, 1.0,.01)
#define autoPulseChangeTime
unsigned long nextSimulatedEda
byte numberOfAutoPulseTypes
fl::UIButton triggerStarburst("Trigger Starburst")
Ripple ripples[numberOfRipples]
#define cubePulsesEnabled
fl::UIButton triggerRainbowCube("Rainbow Cube")
CRGB leds0[lengths[BlackStrip]]
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
static bool ParseJson(const char *jsonStrScreenMap, fl::flat_map< string, ScreenMap > *segmentMaps, string *err=nullptr) FL_NOEXCEPT
size_type size() const FL_NOEXCEPT
iterator end() FL_NOEXCEPT
iterator find(const Key &key) FL_NOEXCEPT
uint32_t Adafruit_DotStar_ColorHSV(uint16_t hue, uint8_t sat, uint8_t val)
FastLED's Elegant JSON Library: fl::json
Centralized logging categories for FastLED hardware interfaces and subsystems.
int nodeConnections[25][6]
int ledAssignments[40][3]
void printf(const char *format, const Args &... args) FL_NOEXCEPT
Printf-like formatting function that prints directly to the platform output.
enable_if<!is_integral< T >::value, T >::type round(T value) FL_NOEXCEPT
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
const char JSON_SCREEN_MAP[]
@ White
<div style='background:#FFFFFF;width:4em;height:4em;'></div>
Aggregator header for the fl/ui/ family of per-element UI types.