Compare commits

..

No commits in common. "master" and "fsm" have entirely different histories.
master ... fsm

15 changed files with 392 additions and 1747 deletions

BIN
.vscode/browse.vc.db vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,163 +0,0 @@
{
"WARNING": "This file was generated by the PlatformIO extension. Changes to this file will be lost when it is regenerated.",
"configurations": [
{
"name": "Mac",
"includePath": [
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip/include",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/cores/esp8266",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/variants/d1_mini",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Adafruit NeoPixel_ID28",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ticker",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/DNSServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266mDNS",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/homie-esp8266/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ArduinoOTA",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/esp-wemos-schild",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Adafruit NeoPixel_ID28",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/homie-esp8266/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ticker",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/DNSServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266mDNS",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/homie-esp8266/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ArduinoOTA",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/DNSServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/EEPROM",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266AVRISP/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPUpdateServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266SSDP",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFiMesh/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266httpUpdate/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266mDNS",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ethernet/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/GDBStub/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/SD/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/SPI",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Servo/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/SoftwareSerial",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/TFT_Touch_Shield_V2",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ticker",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Wire",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/esp8266/src",
"/Users/dukat/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include",
"/Users/dukat/.platformio/packages/toolchain-xtensa/lib/gcc/xtensa-lx106-elf/4.8.2/include",
"/Users/dukat/.platformio/packages/toolchain-xtensa/lib/gcc/xtensa-lx106-elf/4.8.2/include-fixed"
],
"defines": [
"ARDUINO=20300",
"LWIP_OPEN_SRC",
"F_CPU=80000000L",
"__ets__",
"ICACHE_FLASH",
"PLATFORMIO=30300",
"ESP8266",
"ARDUINO_ARCH_ESP8266",
"ESP8266_WEMOS_D1MINI"
],
"browse": {
"path": [
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/tools/sdk/include",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/tools/sdk/lwip/include",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/cores/esp8266",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/variants/d1_mini",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Adafruit NeoPixel_ID28",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ticker",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/DNSServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266mDNS",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/homie-esp8266/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ArduinoOTA",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/esp-wemos-schild",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Adafruit NeoPixel_ID28",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/homie-esp8266/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ArduinoJson_ID64",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/ESPAsyncTCP_ID305/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/AsyncMqttClient_ID346/src",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/Bounce2_ID1106",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ticker",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/DNSServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266mDNS",
"/Users/dukat/Documents/Arduino/Homie/esp-wemos-schild/.piolibdeps/homie-esp8266/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ArduinoOTA",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/DNSServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/EEPROM",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266AVRISP/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPClient/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266HTTPUpdateServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266SSDP",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WebServer/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFi/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266WiFiMesh/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266httpUpdate/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/ESP8266mDNS",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ethernet/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/GDBStub/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Hash/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/SD/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/SPI",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Servo/src",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/SoftwareSerial",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/TFT_Touch_Shield_V2",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Ticker",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/Wire",
"/Users/dukat/.platformio/packages/framework-arduinoespressif8266/libraries/esp8266/src",
"/Users/dukat/.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/include",
"/Users/dukat/.platformio/packages/toolchain-xtensa/lib/gcc/xtensa-lx106-elf/4.8.2/include",
"/Users/dukat/.platformio/packages/toolchain-xtensa/lib/gcc/xtensa-lx106-elf/4.8.2/include-fixed"
],
"limitSymbolsToIncludedHeaders": false,
"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
}
}
]
}

View File

@ -12,9 +12,15 @@ Homie Schild Firmware
|`device_id`/strip/clear|Clears the pixels strip|yes|any value is possible| |`device_id`/strip/clear|Clears the pixels strip|yes|any value is possible|
|`device_id`/strip/length|Set the strip length|yes|Possible values: 0 - length| |`device_id`/strip/length|Set the strip length|yes|Possible values: 0 - length|
### Motion sensor
|Topic |Descriptions |settable |Values |
|---------|--------------|:---------:|---------|
|`device_id`/sensor/motion|Activated on motion|no|true or false|
## Color ## Color
To convert RGB value use the following bash code: To convert RGB value use the following bash code:
```shell ```bash
function rgbToColor { function rgbToColor {
echo $(( $(($1<<16)) + $(($2<<8)) + $(($3)) )); echo $(( $(($1<<16)) + $(($2<<8)) + $(($3)) ));
} }
@ -24,17 +30,16 @@ function colorToRGB {
echo "Green: $(($1>>8&0xff))" echo "Green: $(($1>>8&0xff))"
echo "Blue: $(($1&0xff))" echo "Blue: $(($1&0xff))"
} }
``` ```
#### Example #### Example
RGB Value to color uint32_t RGB Value to color uint32_t
```shell ```bash
bash$ rgbToColor 155 230 32 bash$ rgbToColor 155 230 32
10216992 10216992
bash$ bash$
``` ```
uint32_t to RGB values uint32_t to RGB values
```shell ```bash
bash$ colorToRGB 10216992 bash$ colorToRGB 10216992
Red: 155 Red: 155
Green: 230 Green: 230
@ -43,39 +48,20 @@ uint32_t to RGB values
``` ```
## Effects ## Effects
* **scanner** * scanner
Shows the moving larson scanner eye known form *Battlestar Galactica* and *Knight Rider*. The used effect color can be specified by *color_0* Shows the moving larson scanner eye known form *Battlestar Galactica* and *Knight Rider*. The used effect color can be specified by *color_0*
* **randomscanner** * randomscanner
This is the same scanner then the scanner above but uses an alternating color pattern This is the same scanner then the scanner above but uses an alternating color pattern
* **rainbowcycle** * rainbowcycle
Shows a cycling rainbown on the LED strip Shows a cycling rainbown on the LED strip
* **theaterchase** * theaterchase
Shows an color chasing LED strip. Shows an color chasing LED strip.
You can specify the color by set *color_0* and *color_1* You can specify the color by set *color_0* and *color_1*
* **bvb** * fade
Shows an color chasing LED strip.
It is predefined with yellow and black (off)
* **fade**
Fades from effect color_0 to effect_color_1 Fades from effect color_0 to effect_color_1
* **randomfade** * randomfade
Fades thru an alternating color pattern Fades thru an alternating color pattern
* **random** * none
Set the color of each pixel randomly, once
* **smooth**
Smooth transitions, created for pixelprojektor
* **plasma**
Plasma animation, created for pixelprojektor
* **fire**
Yellow-Orange-red flicker fire effect
* **fireworks**
(Beta) Works best on very long stripes, this one is a bit short (30 LEDs)
* **drop**
Water drop effect
* **scannerrandom**
Like randomscanner, but randomly changes directions
* **ring**
Water drop effect with expanding "ring"
* **none**
Stop all effects Stop all effects
## Effect colors ## Effect colors
@ -91,11 +77,11 @@ The effect color has to be set after the effect.
##### color_0 ##### color_0
This color will be used for the following effects: This color will be used for the following effects:
* *scanner* * scanner
* *theaterchase* * theaterchase
* *fade* * fade
##### color_1 ##### color_1
This color will be used for the following effects: This color will be used for the following effects:
* *theaterchase* * theaterchase
* *fade* * fade

File diff suppressed because it is too large Load Diff

View File

@ -1,178 +1,59 @@
#ifndef NEOPATTERNS_H
#define NEOPATTERNS_H
#include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
#include <math.h>
#include <vector>
#include <algorithm> // std::remove
#include "Rocket.h"
#include "Particle.h"
// class Rocket;
// class Particle;
// Ideas
// Drop (Middle high, than to both sides diming out)
#define MAX_DROPS 10
#define MAX_RINGS 1
// Two or more chasers
// Chaser changing direction randomly
// Pattern types supported: // Pattern types supported:
enum pattern { NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, RANDOM_FADE, SMOOTH, RANDOM_FADE_SINGLE, PLASMA, FILL, RANDOM, FIRE, FIREWORKS, DROP, RINGS, SCANNER_RANDOM, BVB }; enum pattern { NONE, RAINBOW_CYCLE, THEATER_CHASE, COLOR_WIPE, SCANNER, FADE, RANDOM_FADE };
// Patern directions supported: // Patern directions supported:
enum direction { FORWARD, REVERSE }; enum direction { FORWARD, REVERSE };
class NeoPatterns : public Adafruit_NeoPixel class NeoPatterns : public Adafruit_NeoPixel
{ {
public: public:
NeoPatterns(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)(), void (*callbackDebug)(String)); NeoPatterns(uint16_t pixels, uint8_t pin, uint8_t type, void (*callback)());
void Update();
void Update(); void Reverse();
void None();
void RainbowCycle(uint8_t interval, direction dir = FORWARD);
void RainbowCycleUpdate();
void TheaterChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD);
void TheaterChaseUpdate();
void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD);
void ColorWipeUpdate();
void Scanner(uint32_t color1, uint8_t interval = 40,bool colorful = false);
void ScannerUpdate();
void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD);
void FadeUpdate();
void RandomFade(uint8_t interval = 100);
void RandomFadeUpdate();
void Reverse(); void SetColor1(uint32_t color);
void None(uint8_t interval = 40); void SetColor2(uint32_t color);
void RainbowCycle(uint8_t interval, direction dir = FORWARD); //Utilities
void RainbowCycleUpdate(); void ColorSet(uint32_t color);
void TheaterChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD); uint8_t Red(uint32_t color);
void TheaterChaseUpdate(); uint8_t Green(uint32_t color);
void BVBChase(uint32_t color1, uint32_t color2, uint8_t interval, direction dir = FORWARD); uint8_t Blue(uint32_t color);
void BVBChaseUpdate(); uint32_t Wheel(byte WheelPos);
void ColorWipe(uint32_t color, uint8_t interval, direction dir = FORWARD);
void ColorWipeUpdate();
void Scanner(uint32_t color1 = 16711680, uint8_t interval = 40, bool colorful = false, bool spiral = false);
void ScannerUpdate();
void ScannerRandom(uint32_t color1 = 16711680, uint8_t interval = 40, bool colorful = false, bool spiral = false);
void ScannerRandomUpdate();
void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD);
void FadeUpdate();
void RandomFade(uint8_t interval = 100);
void RandomFadeUpdate();
void RandomFadeSingle(uint8_t interval = 100, uint8_t speed = 5);
void RandomFadeSingleUpdate();
void Fire(uint8_t interval = 100);
void FireUpdate();
void Fireworks();
void FireworksUpdate();
void explosion(int pos, float rocketspeed);
void Drop(uint8_t interval = 100);
void DropUpdate();
void Rings(uint8_t interval = 100);
void RingsUpdate();
void RandomBuffer();
void Random();
void Smooth(uint8_t wheelSpeed = 16, uint8_t smoothing = 80, uint8_t strength = 50, uint8_t interval = 40);
void SmoothUpdate();
void Plasma(float phase = 0, float phaseIncrement = 0.03, float colorStretch = 0.3, uint8_t interval = 60); // 0.08 and 0.11
void PlasmaUpdate();
void SetColor1(uint32_t color); private:
void SetColor2(uint32_t color);
//Utilities
void ColorSet(uint32_t color);
void ColorSetParameters(String parameters);
uint8_t Red(uint32_t color);
uint8_t Green(uint32_t color);
uint8_t Blue(uint32_t color);
uint32_t Wheel(byte WheelPos);
uint32_t Wheel(byte WheelPos, float brightness);
uint8_t numToSpiralPos(int num);
uint8_t xyToPos(int x, int y);
uint8_t numToPos(int num);
uint8_t getAverage(uint8_t array[], uint8_t i, int x, int y);
uint32_t parseColor(String value);
void setInterval(uint8_t interval);
#define EXPLOSION_SIZE_MIN 5 // Member Variables:
#define EXPLOSION_SIZE_MAX 10 pattern ActivePattern; // which pattern is running
// 60 LED Strip: 50, 100, 0.985 is a good choice (with Interval = 25) direction Direction; // direction to run the pattern
// Start 0, with maximum speed (100), the rocket should explode at the LATEST at position 50 (of 60). (Which is 10 pixels before maximum)
// #define EXPLOSION_SPEED 0.25f
// #define ROCKET_SPEED_MIN 50
// ROCKET_SPEED_MAX should not be >100, as this would skip LEDs.
// #define ROCKET_SPEED_MAX 100
// #define ROCKET_SLOWDOWN 0.985f
#define ROCKET_LAUNCH_TIMEOUT_MIN 1000
#define ROCKET_LAUNCH_TIMEOUT_MAX 3000
uint32_t maxRocketID = 0; unsigned long Interval; // milliseconds between updates
uint32_t maxParticleID = 0; unsigned long lastUpdate; // last update of position
uint32_t currentRocketMillis = 0;
uint32_t rocketTimeout;
float explosion_speed = 0.25f;
uint8_t rocket_speed_min = 50;
uint8_t rocket_speed_max = 100;
double rocket_slowdown = 0.985f;
private: uint32_t Color1, Color2; // What colors are in use
std::vector <Rocket> rocket_arr; uint16_t TotalSteps; // total number of steps in the pattern
std::vector <Particle> particle_arr; uint16_t Index; // current step within the pattern
// Member Variables: byte wPos;
pattern ActivePattern; // which pattern is running bool colorful;
pattern SavedPattern;
direction Direction; // direction to run the pattern
direction SavedDirection;
unsigned long Interval; // milliseconds between updates uint32_t DimColor(uint32_t color);
unsigned long SavedInterval; void Increment();
unsigned long lastUpdate; // last update of position void (*OnComplete)(); // Callback on completion of pattern
uint32_t Color1, Color2; // What colors are in use
uint32_t SavedColor1;
uint16_t TotalSteps; // total number of steps in the pattern
uint16_t SavedTotalSteps;
uint16_t Index; // current step within the pattern
uint16_t SavedIndex;
uint8_t Every; // Turn every "Every" pixel in Color1/Color2
byte wPos;
bool colorful;
bool spiral;
uint8_t wPosSlow;
uint8_t WheelSpeed;
uint8_t Smoothing;
uint8_t Strength;
uint8_t movingPoint_x;
uint8_t movingPoint_y;
uint8_t *pixelR;
uint8_t *pixelG;
uint8_t *pixelB;
uint8_t *pixelR_buffer;
uint8_t *pixelG_buffer;
uint8_t *pixelB_buffer;
// Drops
uint8_t *drop;
uint8_t *dropBrightness;
// Rings
uint8_t *ring;
uint8_t *ringBrightness;
uint8_t *ringDistance;
uint8_t FontChar;
float PlasmaPhase;
float SavedPlasmaPhase;
float PlasmaPhaseIncrement;
float SavedPlasmaPhaseIncrement;
float PlasmaColorStretch;
float SavedPlasmaColorStretch;
uint32_t DimColor(uint32_t color);
void Increment();
void (*OnComplete)(); // Callback on completion of pattern
void (*OnDebugOutput)(String); // Callback on completion of pattern
// Convenient 2D point structure
struct Point {
float x;
float y;
};
}; };
#endif

View File

@ -1,48 +0,0 @@
#include "Particle.h"
#include "NeoPatterns.h"
Particle::Particle() // Particle::Particle(NeoPatterns * parent)
{
_pos = 0;
// _id = parent->maxParticleID;
// parent->maxParticleID++;
} //Default constructor.
Particle::Particle(NeoPatterns * parent, float pos, float speed, uint8_t hue, float brightness, float decay )
{
_id = parent->maxParticleID;
parent->maxParticleID++;
_pos = pos;
_speed = speed;
_hue = hue;
_brightness = brightness;
_decay = decay;
_parent = parent;
}
bool Particle::operator==(const Particle &p) const {
return (p._id == _id);
}
void Particle::update()
{
_pos += _speed;
_speed *= 0.96;
_brightness *= _decay;
if (_pos > _parent->numPixels()) {
_pos = 0;
}
_parent->setPixelColor((int)_pos, _parent->Wheel(_hue, _brightness));
}
float Particle::brightness()
{
return _brightness;
}

View File

@ -1,25 +0,0 @@
#ifndef PARTICLE_H
#define PARTICLE_H
#include <Adafruit_NeoPixel.h>
class NeoPatterns; // Forward declaration
class Particle
{
public:
Particle(NeoPatterns * parent, float pos, float speed, uint8_t hue, float brightness, float decay = 0.95);
Particle();
bool operator==(const Particle &p) const;
void update();
int _id;
float brightness();
private:
float _pos;
float _speed;
float _brightness;
float _decay;
uint8_t _hue;
NeoPatterns * _parent;
};
#endif

View File

@ -1,62 +0,0 @@
#include "Rocket.h"
#include "NeoPatterns.h"
Rocket::Rocket()
{
// _id = maxRocketID;
// maxRocketID++;
_pos = 0;
_speed = 1;
_lastbright = 1;
}
Rocket::Rocket(NeoPatterns *parent, float pos, float rocketspeed, float rocket_slowdown)
{
_parent = parent;
_id = _parent->maxRocketID;
_parent->maxRocketID++;
_rocket_slowdown = rocket_slowdown;
_iteration = 0;
Serial.print("Rocket: ");
Serial.print(_id);
Serial.print(" ");
Serial.print(pos);
Serial.print(" ");
Serial.println(rocketspeed);
_pos = pos;
_speed = rocketspeed;
}
bool Rocket::operator==(const Rocket &r) const {
return (r._id == _id);
}
void Rocket::update()
{
_iteration++;
_pos += _speed;
_speed *= _rocket_slowdown; // 0.97
_parent->setPixelColor(_pos, _parent->Color(50, 32, 0));
}
// Schweif mit Sparkle
int Rocket::pos()
{
return _pos;
}
float Rocket::rocketspeed()
{
return _speed;
}
int Rocket::id()
{
return _id;
}
uint16_t Rocket::iteration()
{
return _iteration;
}

View File

@ -1,29 +0,0 @@
#ifndef ROCKET_H
#define ROCKET_H
#include <Adafruit_NeoPixel.h>
class NeoPatterns; // Forward declaration
class Rocket
{
public:
int _id;
Rocket(NeoPatterns *parent, float pos, float rocketspeed, float rocket_slowdown);
Rocket();
bool operator==(const Rocket &r) const;
void update();
int pos();
float rocketspeed();
int id();
uint16_t iteration();
private:
float _pos;
float _speed;
int _lastbright;
float _rocket_slowdown;
uint16_t _iteration;
NeoPatterns * _parent;
};
#endif

View File

@ -2,11 +2,11 @@
"name": "Homie CTDO Schild", "name": "Homie CTDO Schild",
"device_id": "schild", "device_id": "schild",
"wifi": { "wifi": {
"ssid": "CTDO-IoT", "ssid": "Nudel",
"password": "12345678" "password": "Unser WLAN ist sicher!"
}, },
"mqtt": { "mqtt": {
"host": "raum.ctdo.de", "host": "prometheus.local",
"port": 1883, "port": 1883,
"auth": false "auth": false
}, },

View File

@ -4,223 +4,158 @@
#include <ArduinoOTA.h> #include <ArduinoOTA.h>
#include <Adafruit_NeoPixel.h> #include <Adafruit_NeoPixel.h>
#include "NeoPatterns.h" #include "NeoPatterns.h"
#include <math.h>
#define PIN D1 #define PIN D1
#define NUMPIXELS 30 #define SENSOR D3
#define NUMPIXELS 144
#define FW_NAME "esp-schild"
#define FW_VERSION "1.0.4"
HomieNode homieNode("strip", "strip");
void StripComplete() { bool lastSensorValue = false;
void StripComplete(){
return; return;
} }
void DebugOutput(String value) { NeoPatterns pixels = NeoPatterns(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800,&StripComplete);
homieNode.setProperty("DEBUG").send(value);
}
NeoPatterns strip = NeoPatterns(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800, &StripComplete, &DebugOutput); HomieNode stripNode("strip", "strip");
HomieNode sensorNode("sensor", "sensor");
Bounce debouncer = Bounce();
bool onSetColor(const HomieRange& range, const String& value) {
bool onSetColor(const HomieRange& range, const String& value){
if (!range.isRange || range.index < 0 || range.index > 1) { if (!range.isRange || range.index < 0 || range.index > 1) {
return false; return false;
} }
switch (range.index) { switch(range.index) {
case 0: case 0:
strip.SetColor1(value.toInt()); pixels.SetColor1(value.toInt());
break; break;
case 1: case 1:
strip.SetColor2(value.toInt()); pixels.SetColor2(value.toInt());
break; break;
} }
homieNode.setProperty("color_" + String(range.index)).send(value); stripNode.setProperty("color_" + String(range.index)).send(value);
} }
bool onSetPixel(const HomieRange& range, const String& value) {
if (!range.isRange) {
strip.None();
strip.ColorSet(value.toInt()); bool onSetPixel(const HomieRange& range, const String& value){
homieNode.setProperty("pixel").send(value); if(!range.isRange) {
pixels.None();
pixels.ColorSet(value.toInt());
stripNode.setProperty("pixel").send(value);
return true; return true;
} }
if (range.index < 0 || range.index > strip.numPixels() - 1) { if (range.index < 0 || range.index > pixels.numPixels()-1) {
return false; return false;
} }
strip.None(); pixels.None();
strip.setPixelColor(range.index, value.toInt()); pixels.setPixelColor(range.index, value.toInt());
strip.show(); pixels.show();
homieNode.setProperty("pixel_" + String(range.index)).send(value); stripNode.setProperty("pixel_" + String(range.index)).send(value);
} }
bool onSetBrightness(const HomieRange& range, const String& value) { bool onSetBrightness(const HomieRange& range, const String& value){
long brightness = value.toInt(); long brightness= value.toInt();
if (brightness < 0 || brightness > 255) { if (brightness < 0 || brightness > 255) {
return false; return false;
} }
strip.setBrightness(brightness); pixels.setBrightness(brightness);
strip.show(); pixels.show();
homieNode.setProperty("brightness").send(value); stripNode.setProperty("brightness").send(value);
} }
bool onSetEffect(const HomieRange& range, const String& value){
bool onSetSpeed(const HomieRange& range, const String& value) {
long speed = value.toInt();
if (speed < 0 || speed > 255) {
return false;
}
strip.setInterval(speed);
strip.show();
homieNode.setProperty("speed").send(value);
}
bool onSetEffect(const HomieRange& range, const String& value) {
String effect = value; String effect = value;
effect.toLowerCase(); effect.toLowerCase();
if (effect == "scanner") { if(effect == "scanner") {
strip.Scanner(strip.Color(255, 0, 0)); pixels.Scanner(pixels.Color(255, 0, 0));
} }
else if (effect == "randomscanner") { else if(effect == "randomscanner") {
strip.Scanner(strip.Color(255, 0, 0), 4, true); pixels.Scanner(pixels.Color(255, 0, 0), 40, true);
} }
else if (effect == "larsonspiral") { else if(effect == "rainbowcycle") {
strip.Scanner(strip.Color(255, 0, 0), 40, true, true); pixels.RainbowCycle(50);
} }
else if (effect == "rainbowcycle") { else if(effect == "theaterchase") {
strip.RainbowCycle(50); pixels.TheaterChase(pixels.Color(255, 0, 0), pixels.Color(0,0,255), 100);
} }
else if (effect == "theaterchase" || effect == "chase") { else if(effect == "fade") {
strip.TheaterChase(strip.Color(255, 0, 0), strip.Color(0, 0, 255), 50); pixels.Fade(pixels.Color(255, 0, 0), pixels.Color(0,0,255), 200, 100);
} }
else if (effect == "bvb") { else if(effect == "randomfade") {
strip.BVBChase(strip.Color(255, 185, 0), strip.Color(0, 0, 0), 50); pixels.RandomFade();
}
else if (effect == "fade") {
strip.Fade(strip.Color(255, 0, 0), strip.Color(0, 0, 255), 200, 100);
}
else if (effect == "randomfade") {
strip.RandomFade();
}
else if (effect == "random") {
strip.Random();
}
else if (effect == "smooth") { //example: smooth|[wheelspeed]|[smoothing]|[strength] wheelspeed=1-255, smoothing=0-100, strength=1-255
strip.Smooth(16, 80, 50, 40);
}
else if (effect == "plasma") {
strip.Plasma();
}
else if (effect == "fire") {
strip.Fire();
}
else if (effect == "fireworks") {
strip.Fireworks();
}
else if (effect == "drop") {
strip.Drop();
}
else if (effect == "scannerrandom") {
strip.ScannerRandom(strip.Color(255, 0, 0), 4, true);
}
else if (effect == "ring") {
strip.Rings();
} else {
// Test whether command with parameters was sent
int sep = value.indexOf("|");
String command = value.substring(0, sep);
String parameters = value.substring(sep + 1);
if (command.equals("fill")) {
strip.ColorSetParameters(parameters);
}
else if (command.equals("randomfade")) {
int sepparam = parameters.indexOf("|");
int p1 = parameters.substring(0, sepparam).toInt();
if (p1 <= 0) {
p1 = 5;
}
strip.RandomFadeSingle(p1);
}
else if (command.equals("randomscanner")) {
int sepparam = parameters.indexOf("|");
int p1 = parameters.substring(0, sepparam).toInt();
if (p1 <= 0) {
p1 = 5;
}
homieNode.setProperty("effect").send(String(p1));
strip.Scanner(strip.Color(255, 0, 0), p1, true);
} }
else { else {
strip.None(); pixels.None();
digitalWrite(PIN, LOW); // D4 ist auch gleichzeitig der LED-Pin, daher abschalten... (TODO: TEST: FIXME)
} }
} stripNode.setProperty("effect").send(value);
homieNode.setProperty("effect").send(value);
} }
bool onSetClear(const HomieRange& range, const String& value){
bool onSetClear(const HomieRange& range, const String& value) { pixels.None();
strip.None(); pixels.clear();
strip.clear(); pixels.show();
strip.show(); stripNode.setProperty("clear").send(value);
homieNode.setProperty("clear").send(value);
} }
bool onSetLength(const HomieRange& range, const String& value) { bool onSetLength(const HomieRange& range, const String& value){
strip.None(); pixels.None();
strip.clear(); pixels.clear();
strip.show(); pixels.show();
int newLength = value.toInt(); int newLength = value.toInt();
if (newLength > 0) { if(newLength > 0) {
strip.updateLength(newLength); pixels.updateLength(newLength);
} }
homieNode.setProperty("length").send(value); stripNode.setProperty("length").send(value);
} }
void loopHandler() { void loopHandler() {
strip.Update(); pixels.Update();
bool sensorValue = debouncer.read();
if (Homie.isConfigured() && Homie.isConnected() && sensorValue != lastSensorValue) {
sensorNode.setProperty("motion").send(sensorValue ? "true" : "false");
lastSensorValue = sensorValue;
}
} }
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
Homie_setFirmware(FW_NAME, FW_VERSION); debouncer.attach(SENSOR,INPUT);
Homie_setBrand(FW_NAME); debouncer.interval(50);
Homie_setFirmware("schild", "1.0.0");
Homie.setLoopFunction(loopHandler); Homie.setLoopFunction(loopHandler);
homieNode.advertiseRange("pixel", 0, NUMPIXELS - 1).settable(onSetPixel); stripNode.advertiseRange("pixel", 0, NUMPIXELS-1).settable(onSetPixel);
homieNode.advertiseRange("color", 0, 1).settable(onSetColor); stripNode.advertiseRange("color", 0, 1).settable(onSetColor);
homieNode.advertise("brightness").settable(onSetBrightness); stripNode.advertise("brightness").settable(onSetBrightness);
homieNode.advertise("speed").settable(onSetSpeed); stripNode.advertise("effect").settable(onSetEffect);
homieNode.advertise("effect").settable(onSetEffect); stripNode.advertise("clear").settable(onSetClear);
homieNode.advertise("clear").settable(onSetClear); stripNode.advertise("length").settable(onSetLength);
homieNode.advertise("length").settable(onSetLength);
strip.begin(); sensorNode.advertise("motion");
strip.clear();
strip.setBrightness(30); pixels.begin();
strip.show(); pixels.clear();
pixels.setBrightness(64);
pixels.show();
Homie.setup(); Homie.setup();
ArduinoOTA.setHostname(Homie.getConfiguration().deviceId); ArduinoOTA.setHostname(Homie.getConfiguration().deviceId);
ArduinoOTA.begin(); ArduinoOTA.setPassword((const char *)"ctdo2342");
ArduinoOTA.onStart([]() {
strip.clear();
});
ArduinoOTA.onEnd([]() {
strip.clear();
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
strip.setPixelColor(progress / (total / NUMPIXELS), strip.Color(100, 0, 0));
strip.show();
});
ArduinoOTA.begin(); ArduinoOTA.begin();
} }
void loop() { void loop() {
Homie.loop(); Homie.loop();
debouncer.update();
ArduinoOTA.handle(); ArduinoOTA.handle();
} }

View File

@ -1,3 +0,0 @@
#!/bin/bash
mosquitto_pub -h raum.ctdo.de -t 'homie/schild/strip/speed/set' -m '5'

View File

@ -16,8 +16,8 @@ framework=arduino
;upload_port = /dev/tty.wchusbserial410 ;upload_port = /dev/tty.wchusbserial410
;upload_speed = 921600 ;upload_speed = 921600
upload_port = 5ccf7f1db369.local ;upload_port = 5ccf7f1db369.local
#upload_port = schild.local upload_port = schild.local
upload_flags = --auth=ctdo2342 upload_flags = --auth=ctdo2342