13#if defined(__AVR__) || defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_RP2350) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_TEENSYLC)
78#define numberOfRipples 30
93#define heartbeatLockout \
95#define heartbeatDelta 300
98#define lowTemperature 33.0
99#define highTemperature 37.0
109#define gyroThreshold \
115#define randomPulsesEnabled true
116#define cubePulsesEnabled true
120#define autoPulseTimeout \
123#define randomPulseTime 2000
130#define autoPulseChangeTime 30000
133#define simulatedHeartbeatBaseTime \
135#define simulatedHeartbeatVariance \
137#define simulatedEdaBaseTime 1000
138#define simulatedEdaVariance 10000
153UIDescription 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!");
168 Serial.begin(115200);
170 Serial.println(
"*** LET'S GOOOOO ***");
172 Serial.println(
"JSON SCREENMAP");
178 printf(
"Parsed %d segment maps\n",
int(segmentMaps.
size()));
179 for (
auto kv : segmentMaps) {
180 Serial.print(kv.first.c_str());
182 Serial.println(kv.second.getLength());
189 ok = segmentMaps.
get(
"red_segment", &red) && ok;
190 ok = segmentMaps.
get(
"back_segment", &black) && ok;
191 ok = segmentMaps.
get(
"green_segment", &green) && ok;
192 ok = segmentMaps.
get(
"blue_segment", &blue) && ok;
194 Serial.println(
"Failed to get all segment maps");
215 unsigned long benchmark = millis();
221 for (
int strip = 0; strip < 40; strip++) {
222 for (
int led = 0; led < 14; led++) {
223 for (
int i = 0; i < 3; i++) {
233 for (
int segment = 0; segment < 40; segment++) {
234 for (
int fromBottom = 0; fromBottom < 14; fromBottom++) {
246 for (
int i = 0; i < 4; i++) {
247 for (
int j = 0; j <
lengths[i]; j++) {
265 unsigned int baseColor = random(0xFFFF);
266 byte centerNode = 15;
269 for (
int i = 0; i < 6; i++) {
276 baseColor + (0xFFFF / 6) * i, 255, 255),
290 unsigned int baseColor = random(0xFFFF);
296 for (
int dir = 0; dir < 6; dir++) {
320 unsigned int baseColor = random(0xFFFF);
323 for (
int i = 0; i < 6; i++) {
330 baseColor + (0xFFFF / 6) * i, 255, 255),
342 unsigned int baseColor = random(0xFFFF);
345 for (
int i = 0; i < 6; i++) {
351 baseColor + (0xFFFF / 6) * i, 255, 255),
352 .65, 1500, behavior);
362 for (
int i = 0; i < 6; i++) {
365 ripples[j].start(15, i, 0xEE1111,
366 float(random(100)) / 100.0 * .1 + .4, 1000, 0);
378 unsigned int baseColor = random(0xFFFF);
383 byte possiblePulse = 255;
385 possiblePulse = random(3);
390 switch (possiblePulse) {
419 bool foundStartingNode =
false;
420 while (!foundStartingNode) {
422 foundStartingNode =
true;
427 foundStartingNode =
false;
431 foundStartingNode =
false;
436 for (
int i = 0; i < 6; i++) {
447 float(random(100)) / 100.0 * .2 + .5, 3000,
468 for (
int i = 0; i < 6; i++) {
494 for (
int i = 0; i < 6; i++) {
500 baseColor + (0xFFFF / 6) * i, 255, 255),
501 .65, 1500, behavior);
519 for (
int i = 0; i < 6; i++) {
524 float(random(100)) / 100.0 * .1 + .4, 1000, 0);
537 for (
int i = 0; i < 10; i++) {
542 byte direction = 255;
544 while (direction == 255) {
545 direction = random(6);
551 targetNode, direction, 0x1111EE,
552 float(random(100)) / 100.0 * .5 + 2, 300, 2);
byte currentAutoPulseType
#define simulatedHeartbeatBaseTime
CRGB leds2[lengths[RedStrip]]
bool isNodeOnBorder(byte node)
UICheckbox allWhite("All White", false)
UISlider sliderDecay("decay",.97f,.8, 1.0,.01)
bool wasRainbowCubeClicked
unsigned long nextSimulatedHeartbeat
byte ledColors[40][14][3]
CRGB leds3[lengths[BlueStrip]]
unsigned long lastAutoPulseChange
UICheckbox simulatedBiometricsEnabled("Simulated Biometrics", true)
unsigned long lastRandomPulse
#define simulatedEdaBaseTime
UITitle title("Chromancer")
float lastKnownTemperature
UIButton triggerBorderWave("Border Wave")
#define simulatedEdaVariance
#define randomPulsesEnabled
CRGB leds1[lengths[GreenStrip]]
UIButton triggerSpiral("Spiral Wave")
unsigned long lastHeartbeat
UICheckbox starburstPulsesEnabled("Starburst Pulses", true)
UIButton simulatedHeartbeat("Simulated Heartbeat")
UIButton triggerStarburst("Trigger Starburst")
#define simulatedHeartbeatVariance
bool wasBorderWaveClicked
UIButton triggerRainbowCube("Rainbow Cube")
#define autoPulseChangeTime
unsigned long nextSimulatedEda
byte numberOfAutoPulseTypes
Ripple ripples[numberOfRipples]
#define cubePulsesEnabled
CRGB leds0[lengths[BlackStrip]]
CFastLED FastLED
Global LED strip management instance.
central include file for FastLED, defines the CFastLED class/object
UIDescription description("This Fire demo wraps around the cylinder. It uses Perlin noise to create a fire effect.")
constexpr size_t size() const
bool get(const Key &key, Value *value) const
static bool ParseJson(const char *jsonStrScreenMap, FixedMap< Str, ScreenMap, 16 > *segmentMaps, Str *err=nullptr)
uint32_t Adafruit_DotStar_ColorHSV(uint16_t hue, uint8_t sat, uint8_t val)
int nodeConnections[25][6]
int ledAssignments[40][3]
Implements a simple red square effect for 2D LED grids.
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>
Representation of an RGB pixel (Red, Green, Blue)