Skip to content

Instantly share code, notes, and snippets.

@OSDDQD
Created May 7, 2021 13:39
Show Gist options
  • Save OSDDQD/713322a1a09c37409755b953a69e3e30 to your computer and use it in GitHub Desktop.
Save OSDDQD/713322a1a09c37409755b953a69e3e30 to your computer and use it in GitHub Desktop.
#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