Created
May 7, 2021 13:39
-
-
Save OSDDQD/713322a1a09c37409755b953a69e3e30 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define FASTLED_ALLOW_INTERRUPTS 0 | |
#include <ESP8266WiFi.h> | |
#include <WiFiUdp.h> | |
// #include <ESP8266httpUpdate.h> | |
#include "FastLED.h" | |
#include "FlexTimer.h" | |
#include "FastFX.h" | |
// #include "FFXCoreEffects.h" | |
#define PIR_PIN 14 | |
#define LED_PIN 6 | |
#define COB_PIN 2 | |
#define NUM_LEDS 500 | |
#define LEVELS 6 | |
#define BASE_BRIGHTNESS 10 | |
#define BASE_INTERVAL 5 | |
#define IP 40 // адрес станции, уникальный для каждого | |
#define NEXT_IP 41 // ip другой инсталляции для отправки сигнала | |
#define PREV_IP 45 // ip другой инсталляции для отправки сигнала | |
#define WIFI_SSID "LEDSTATION" | |
#define WIFI_PASS "123456789" | |
#define UDP_PORT 4210 | |
// UDP | |
WiFiUDP UDP; | |
char packet[255]; | |
char reply[] = "Packet received!"; | |
IPAddress next_IP(192, 168, 0, NEXT_IP); | |
IPAddress prev_IP(192, 168, 0, PREV_IP); | |
// Set your Static IP address | |
IPAddress local_IP(192, 168, 0, IP); | |
// Set your Gateway IP address | |
IPAddress gateway(192, 168, 0, 1); | |
IPAddress subnet(255, 255, 255, 0); | |
int level = 1; | |
int brightness = 0; | |
boolean cooldown = false; | |
unsigned long previousTime = 0; | |
unsigned long interval = 5000; | |
String segName; | |
String segments[] = {"R1", "R1B", "R2", "R2B", "R3", "R3B", "R4", "R4B", "R5", "R5B", "R6", "R6B"}; // сюда дописать имена сегментов | |
int segmentsCount = sizeof(segments) / sizeof(segments[0]); | |
// This is an array of leds. One item for each led in your strip. | |
CRGB leds[NUM_LEDS]; | |
FFXController fxctrlr = FFXController(); | |
StepTimer TimerC(5000); | |
class FirstLightFX : public FFXBase { | |
public: | |
FirstLightFX(uint16_t initSize) : FFXBase( initSize,/* interval */ 15UL, | |
/* min interval */ 15UL, | |
/* max interval */ 30UL ) { | |
getFXColor().setColorMode( FFXColor::FFXColorMode::singleCRGB); | |
getFXColor().setCRGB( CRGB::Black); | |
} | |
virtual void initLeds( CRGB *bufLeds ) override { | |
fill_solid( bufLeds, numLeds, CRGB::Black); | |
} | |
virtual void onCycleEnd( CRGB *currFrame ) override { | |
setStartAnimation(false); | |
} | |
virtual void writeNextFrame( CRGB *bufLeds ) override { | |
fadeToBlackBy( bufLeds, numLeds, 40); | |
// bufLeds[getMovementPhase() - 1] = currColor.getCRGB(); | |
if (getStartAnimation()) { | |
bufLeds[getMovementPhase() - 1] = currColor.getCRGB(); | |
} | |
} | |
}; | |
void setup() { | |
// sanity check delay - allows reprogramming if accidently blowing power w/leds | |
delay(2000); | |
// initialize serial communication at 115200 | |
Serial.begin(115200); | |
initNetwork(); | |
initLeds(); | |
} | |
void loop() { | |
EVERY_N_SECONDS(3) { | |
interval = random(5, 60) * 1000; | |
Serial.print("INTERVAL: "); | |
Serial.println(interval); | |
} | |
unsigned long currentTime = millis(); | |
if (currentTime - previousTime >= interval) { | |
if (!cooldown) { | |
setLighting(); | |
} | |
previousTime = currentTime; | |
} | |
// If packet received... | |
int packetSize = UDP.parsePacket(); | |
if (packetSize) { | |
Serial.print("SIGNAL RECEIVED!"); | |
Serial.println(packetSize); | |
int len = UDP.read(packet, 255); | |
if (len > 0) { | |
setLighting(); | |
TimerC.start(); | |
cooldown = true; | |
} | |
} | |
if (TimerC.isUp()) { | |
cooldown = false; | |
} | |
fxctrlr.update(); | |
} | |
void initLeds() { | |
FastLED.addLeds<WS2811, LED_PIN, RBG>(leds, NUM_LEDS); | |
FastLED.clear(); | |
fxctrlr.initialize( new FFXFastLEDPixelController( leds, NUM_LEDS )); | |
fxctrlr.getPrimarySegment()->setFX( new FirstLightFX( NUM_LEDS )); | |
fxctrlr.getPrimarySegment()->setBrightness( BASE_BRIGHTNESS ); | |
fxctrlr.getPrimarySegment()->getFX()->setInterval( BASE_INTERVAL ); | |
fxctrlr.getPrimarySegment()->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD ); | |
fxctrlr.getPrimarySegment()->getFX()->getFXColor().setColorMode( FFXColor::FFXColorMode::singleCRGB ); | |
fxctrlr.getPrimarySegment()->getFX()->getFXColor().setCRGB( CRGB::Black ); | |
// Setup segments... | |
FFXSegment *seg; | |
seg = fxctrlr.addSegment( "R1", 0, 30 ); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R1B", 31, 61); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); // для дебага, после подсчётов изменить на White | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_BACKWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R2", 62, 102); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R2B", 103, 143); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); // для дебага, после подсчётов изменить на White | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_BACKWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R3", 144, 196); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R3B", 197, 249); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); // для дебага, после подсчётов изменить на White | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_BACKWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R4", 250, 299); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R4B", 300, 349); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); // для дебага, после подсчётов изменить на White | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_BACKWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R5", 350, 382); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R5B", 383, 415); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); // для дебага, после подсчётов изменить на White | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_BACKWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R6", 416, 446); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB( CRGB::Aqua); | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_FORWARD); | |
seg->setOpacity(255); | |
seg = fxctrlr.addSegment("R6B", 447, 477); | |
seg->setFX( new FirstLightFX( seg->getLength() )); | |
seg->getFX()->getFXColor().setCRGB(CRGB::Aqua); // для дебага, после подсчётов изменить на White | |
seg->getFX()->setMovement( FFXBase::MovementType::MVT_BACKWARD); | |
seg->setOpacity(255); | |
//сюда добавлять сегменты | |
} | |
void initNetwork() | |
{ | |
if (!WiFi.config(local_IP, gateway, subnet)) { | |
Serial.println("STA Failed to configure"); | |
} | |
// Begin WiFi | |
WiFi.begin(WIFI_SSID, WIFI_PASS); | |
// Connecting to WiFi... | |
Serial.print("Connecting to "); | |
Serial.print(WIFI_SSID); | |
// Loop continuously while WiFi is not connected | |
while (WiFi.status() != WL_CONNECTED) | |
{ | |
delay(100); | |
Serial.print("."); | |
} | |
// Connected to WiFi | |
Serial.println(); | |
Serial.print("Connected! IP address: "); | |
Serial.println(WiFi.localIP()); | |
// Begin listening to UDP port | |
UDP.begin(UDP_PORT); | |
Serial.print("Listening on UDP port "); | |
Serial.println(UDP_PORT); | |
} | |
void setLighting() | |
{ | |
if (level >= LEVELS) { | |
level = 0; | |
} | |
if (level < LEVELS) { | |
level++; | |
brightness = (255 / LEVELS) * level; | |
if (level == LEVELS) { | |
brightness = 255; | |
} | |
} | |
Serial.print("BRIGHTNESS: "); | |
Serial.println(brightness); | |
Serial.print("LEVEL: "); | |
Serial.println(level); | |
// fxctrlr.getPrimarySegment()->getFX()->setInterval( BASE_INTERVAL * level ); | |
fxctrlr.getPrimarySegment()->setBrightness(brightness); | |
FFXSegment *seg; | |
Serial.print("SEGMENTS: "); | |
Serial.println(segmentsCount); | |
for (int i = 0; i < segmentsCount; i++) { | |
segName = segments[i]; | |
Serial.print("SEGMENT NAME: "); | |
Serial.println(segName); | |
seg = fxctrlr.findSegment(segName); | |
if (seg) { | |
Serial.print("SEGMENT TRUE: "); | |
Serial.println(segName); | |
// (FirstLightFX)(seg->getFX())->setStartAnimation(true); | |
// seg->getFX()->setStartAnimation(true); | |
seg->getFX()->setStartAnimation(true); | |
seg->getFX()->resetCurrPhase(); | |
} | |
} | |
sendPacket(); | |
} | |
void sendPacket() { | |
UDP.beginPacket(next_IP, UDP_PORT); | |
UDP.write(reply); | |
UDP.endPacket(); | |
UDP.beginPacket(prev_IP, UDP_PORT); | |
UDP.write(reply); | |
UDP.endPacket(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment