528 lines
12 KiB
Arduino
528 lines
12 KiB
Arduino
|
|
|||
|
#include <SPI.h>
|
|||
|
#include "nRF24L01.h"
|
|||
|
#include "RF24.h"
|
|||
|
#include "printf.h"
|
|||
|
#include "Adafruit_NeoPixel.h"
|
|||
|
|
|||
|
#define RADIOSEND false
|
|||
|
|
|||
|
#define CE_PIN 12
|
|||
|
#define CSN_PIN 2
|
|||
|
|
|||
|
#define DEBUG 0
|
|||
|
#define TEST 0
|
|||
|
|
|||
|
#define SYMETRIC 0
|
|||
|
#define SMOOTH 0
|
|||
|
#define ALFA 0.3
|
|||
|
|
|||
|
#define RED 11
|
|||
|
#define GREEN 10
|
|||
|
#define BLUE 9
|
|||
|
#define WHITE 6
|
|||
|
|
|||
|
#define SDO1 4
|
|||
|
#define SDO2 8
|
|||
|
#define SDO3 3
|
|||
|
|
|||
|
#define NUMPIXELS1 240 // fuego
|
|||
|
#define NUMPIXELS2 240
|
|||
|
#define NUMPIXELS3 240
|
|||
|
|
|||
|
int NUM_LEDS = 240;
|
|||
|
int TotalSteps = NUM_LEDS;
|
|||
|
int Index = TotalSteps-1;
|
|||
|
|
|||
|
int intensity = 100;
|
|||
|
int delaylight = 250;
|
|||
|
|
|||
|
int amplilight = 240;
|
|||
|
float ampliSmooth = 0;
|
|||
|
float ampliSmoothLast = 0;
|
|||
|
int sinus = 0;
|
|||
|
|
|||
|
float angle_rad = 0;
|
|||
|
float sin_result = 0;
|
|||
|
float angulo = 0;
|
|||
|
int dibujar;
|
|||
|
float incAngle;
|
|||
|
|
|||
|
unsigned long currentMillis = 0; // will store last time LED was updated
|
|||
|
unsigned long previousMillis = 0; // will store last time LED was updated
|
|||
|
|
|||
|
const long intervalOn = 20;
|
|||
|
const long intervalOff = 100;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//int idpin[8] = { 5, 13, A4, A3, A2, A1, A0, A5};
|
|||
|
int idpin[6] = { A5, A0, A1, A2, A3, A4};
|
|||
|
int chpin[2] = { 13, 5 }; // no se va a usar en esta App
|
|||
|
|
|||
|
Adafruit_NeoPixel pixels1 = Adafruit_NeoPixel(NUMPIXELS1, SDO1, NEO_GRB + NEO_KHZ800);
|
|||
|
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(NUMPIXELS2, SDO2, NEO_GRB + NEO_KHZ800);
|
|||
|
Adafruit_NeoPixel pixels3 = Adafruit_NeoPixel(NUMPIXELS3, SDO3, NEO_GRB + NEO_KHZ800);
|
|||
|
|
|||
|
|
|||
|
byte neopix_gamma[] = {
|
|||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
|
|||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
|
|||
|
2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5,
|
|||
|
5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10,
|
|||
|
10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
|
|||
|
17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
|
|||
|
25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
|
|||
|
37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
|
|||
|
51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
|
|||
|
69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
|
|||
|
90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
|
|||
|
115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
|
|||
|
144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
|
|||
|
177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
|
|||
|
215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
|
|||
|
const uint64_t pipe = 0xE8E8F0F0E1LL; // Define the transmit pipe
|
|||
|
uint8_t CMD[ 8 ]; // CMD + Ch + 2
|
|||
|
//int ch = 0x4C ; // ESTRELLA
|
|||
|
int ch = 0x76 ; // JOGUINES
|
|||
|
//int ch = 0x20 ; // GASPAR
|
|||
|
|
|||
|
|
|||
|
// Globales PIXEL
|
|||
|
unsigned long delayed = 0; // control de tiempo de funciones de pixel
|
|||
|
int countFrame = 0;
|
|||
|
unsigned long launchTime = 0;
|
|||
|
short stroboPixelFlag = 0;
|
|||
|
short pixelFlag = 0;
|
|||
|
short pixelOn = 0;
|
|||
|
short stroboPixelOn = 0;
|
|||
|
float incRed, incGreen, incBlue, incWhite;
|
|||
|
|
|||
|
// Globales NEON
|
|||
|
unsigned long delayedNeon = 0; // control de tiempo de funciones de neon
|
|||
|
unsigned long launchTimeNeon = 0;
|
|||
|
int countFrameNeon = 0;
|
|||
|
short stroboFlagNeon = 0;
|
|||
|
short neonFlag = 0;
|
|||
|
short stroboNeonOn = 0;
|
|||
|
|
|||
|
short chflag = 0;
|
|||
|
uint8_t param1 = 5;
|
|||
|
uint8_t param2 = 100;
|
|||
|
uint8_t selectedEffect = 0;
|
|||
|
uint16_t i = 0;
|
|||
|
|
|||
|
int c = 0;
|
|||
|
int numSer = 0;
|
|||
|
char numStr[4];
|
|||
|
|
|||
|
byte globalNeonRed;
|
|||
|
byte globalNeonGreen;
|
|||
|
byte globalNeonBlue;
|
|||
|
byte globalNeonWhite;
|
|||
|
|
|||
|
uint32_t p1, p2, p3, p4, p5, p6 ; // bytes para los comandos OSC (colores)
|
|||
|
|
|||
|
|
|||
|
void resetBoard()
|
|||
|
{
|
|||
|
//Serial.println("reset");
|
|||
|
NVIC_SystemReset(); // esta funcion en teoria si funciona en SAMD
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
byte id()
|
|||
|
{
|
|||
|
int id = 0;
|
|||
|
for (byte i = 0; i < 6; i++ ) bitWrite(id, i, digitalRead(idpin[i]));
|
|||
|
return id;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int channel()
|
|||
|
{
|
|||
|
int value = code();
|
|||
|
switch (value)
|
|||
|
{
|
|||
|
case 0:
|
|||
|
value = 0x10; //
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
value = 0x4C; //
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
value = 0x64; //
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
value = 0x7F; //
|
|||
|
break;
|
|||
|
default:
|
|||
|
value = 0; //
|
|||
|
break;
|
|||
|
}
|
|||
|
return value;
|
|||
|
}
|
|||
|
|
|||
|
int code()
|
|||
|
{
|
|||
|
int value = 0;
|
|||
|
for (byte i = 0; i < 2; i++) bitWrite(value, i, digitalRead(chpin[i]));
|
|||
|
return value;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
///////////////////////// SETUP ////////////////////////////////
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
void setup() {
|
|||
|
|
|||
|
|
|||
|
for (int i = 0; i < 6; i++)
|
|||
|
{
|
|||
|
pinMode(idpin[i], INPUT);
|
|||
|
}
|
|||
|
|
|||
|
for (int i = 0; i < 2; i++)
|
|||
|
{
|
|||
|
pinMode(chpin[i], INPUT);
|
|||
|
}
|
|||
|
|
|||
|
pixels1.begin();
|
|||
|
pixels2.begin();
|
|||
|
pixels3.begin();
|
|||
|
pixels1.show(); // Initialize all pixels to 'off'
|
|||
|
pixels2.show(); // Initialize all pixels to 'off'
|
|||
|
pixels3.show(); // Initialize all pixels to 'off'
|
|||
|
|
|||
|
Serial.begin(512000);
|
|||
|
//while (!Serial) {
|
|||
|
// ; // wait for serial port to connect. Needed for Leonardo only
|
|||
|
//}
|
|||
|
|
|||
|
Serial.println("Serial READY");
|
|||
|
delay(1000);
|
|||
|
|
|||
|
//printf_begin();
|
|||
|
radio.begin();
|
|||
|
radio.setDataRate( RF24_250KBPS );
|
|||
|
radio.setPALevel( RF24_PA_MAX );
|
|||
|
radio.setAutoAck(0);
|
|||
|
radio.setPayloadSize(8);
|
|||
|
radio.setChannel(ch);
|
|||
|
//#if RADIOSEND
|
|||
|
// radio.openWritingPipe(pipe);
|
|||
|
//#else
|
|||
|
radio.openReadingPipe(1, pipe);
|
|||
|
radio.startListening();
|
|||
|
//#endif
|
|||
|
radio.printDetails();
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
///////////////////////// LOOP ////////////////////////////////
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
void loop()
|
|||
|
{
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
///////////////////////// RADIO ENCUESTA ////////////////////////
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if(DEBUG)
|
|||
|
{
|
|||
|
Serial.print("id: ");
|
|||
|
Serial.println(id());
|
|||
|
Serial.print("code: ");
|
|||
|
Serial.println(code());
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////
|
|||
|
//////////////////////// RADIO ///////////////////////////
|
|||
|
////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
if ( radio.available() )
|
|||
|
{
|
|||
|
Serial.println("Radio packet");
|
|||
|
while (radio.available())
|
|||
|
{
|
|||
|
//done = radio.read( CMD, sizeof(CMD) );
|
|||
|
radio.read( CMD, sizeof(CMD) );
|
|||
|
|
|||
|
//if (DEBUG)
|
|||
|
// {
|
|||
|
Serial.println("Got command");
|
|||
|
for (int i = 0 ; i < 8 ; i++)
|
|||
|
{
|
|||
|
Serial.print(CMD[i]);
|
|||
|
Serial.print(",");
|
|||
|
}
|
|||
|
Serial.println();
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
if ( CMD[0] == 0 )
|
|||
|
{
|
|||
|
intensity = CMD[1];
|
|||
|
|
|||
|
}
|
|||
|
else if ( CMD[0] == 1 )
|
|||
|
{
|
|||
|
incAngle = CMD[1];
|
|||
|
//incAngle = incAngle/255. ;
|
|||
|
}
|
|||
|
else if ( CMD[0] == 2 )
|
|||
|
{
|
|||
|
selectedEffect = 2; // CMD 2 - FADE IN OUT NEON
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
////////////////////////////////////////////////////////////
|
|||
|
//////////////////////// DRAW ///////////////////////////
|
|||
|
////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if(!code())
|
|||
|
{
|
|||
|
switch(id())
|
|||
|
{
|
|||
|
case 0:
|
|||
|
delaylight = 0; // CONTINUOS
|
|||
|
//delay(100);
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
delaylight = 250;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
delaylight = 125;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
delaylight = 75;
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
delaylight = 25;
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// CICLO ON PWM CUANDO DELAY ES MAYOR QUE CERO
|
|||
|
// SIMETRICO Y ASIMETRICO
|
|||
|
|
|||
|
if(!SYMETRIC)
|
|||
|
{
|
|||
|
amplilight = NUM_LEDS/4 + random(NUM_LEDS);
|
|||
|
//amplilight = NUM_LEDS/2 + random(NUM_LEDS/2);
|
|||
|
//Serial.println(amplilight);
|
|||
|
|
|||
|
if(SMOOTH)
|
|||
|
{
|
|||
|
//filtered_output[i] = α*raw_input[i] + (1-α)*filtered_output[i-1]
|
|||
|
ampliSmooth = ALFA*amplilight + (1-ALFA)*ampliSmoothLast;
|
|||
|
ampliSmoothLast = ampliSmooth;
|
|||
|
//Serial.println(ampliSmooth);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
for(int i=0; i< ampliSmooth ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
pixels3.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
}
|
|||
|
|
|||
|
for(int i=ampliSmooth; i< NUM_LEDS ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
pixels3.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
}
|
|||
|
|
|||
|
showStrip();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
amplilight = NUM_LEDS/2 + random(NUM_LEDS/2);
|
|||
|
|
|||
|
if(SMOOTH)
|
|||
|
{
|
|||
|
//filtered_output[i] = α*raw_input[i] + (1-α)*filtered_output[i-1]
|
|||
|
ampliSmooth = ALFA*amplilight + (1-ALFA)*ampliSmoothLast;
|
|||
|
ampliSmoothLast = ampliSmooth;
|
|||
|
//Serial.println(ampliSmooth);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
for(int i=0; i< NUM_LEDS ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
pixels3.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
}
|
|||
|
|
|||
|
for(int i = NUM_LEDS-ampliSmooth; i< ampliSmooth ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
pixels3.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
showStrip();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// CICLO OFF PWM CUANDO DELAY ES MAYOR QUE CERO
|
|||
|
|
|||
|
if(delaylight)
|
|||
|
{
|
|||
|
delay(delaylight/4);
|
|||
|
|
|||
|
for(int i=0; i<NUM_LEDS; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
pixels3.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
}
|
|||
|
|
|||
|
showStrip();
|
|||
|
delay(delaylight - (delaylight/4) );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
else if(code() == 1) // full LED
|
|||
|
{
|
|||
|
for(int i=0; i<NUM_LEDS; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
pixels3.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
}
|
|||
|
showStrip();
|
|||
|
delay(100);
|
|||
|
}
|
|||
|
else if(code() == 2) // sinus functions
|
|||
|
{
|
|||
|
|
|||
|
angulo = angulo + 0.5;
|
|||
|
if(angulo >= 360)
|
|||
|
angulo = 0;
|
|||
|
|
|||
|
angle_rad = angulo * M_PI / 180.;
|
|||
|
sin_result = (sin(angle_rad) + sin(2*angle_rad))/5.; // FUNCTION
|
|||
|
|
|||
|
amplilight = sin_result*(NUM_LEDS/2) + NUM_LEDS/2 ;
|
|||
|
|
|||
|
if(DEBUG)
|
|||
|
{
|
|||
|
Serial.print("sin(");
|
|||
|
Serial.print(angulo);
|
|||
|
Serial.print("°) = ");
|
|||
|
Serial.print(sin_result);
|
|||
|
Serial.print(" ");
|
|||
|
Serial.println(amplilight);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
for(int i=0; i< NUM_LEDS ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
pixels3.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
}
|
|||
|
|
|||
|
for(int i = 0; i< amplilight ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
pixels3.setPixelColor( i, intensity, intensity, intensity, 0 );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
currentMillis = millis();
|
|||
|
|
|||
|
if (currentMillis - previousMillis >= intervalOff) {
|
|||
|
|
|||
|
previousMillis = currentMillis;
|
|||
|
|
|||
|
dibujar = 0;
|
|||
|
|
|||
|
}
|
|||
|
else if(currentMillis - previousMillis <= intervalOn )
|
|||
|
{
|
|||
|
dibujar = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
dibujar = 0;
|
|||
|
|
|||
|
|
|||
|
if(dibujar)
|
|||
|
showStrip();
|
|||
|
else
|
|||
|
{
|
|||
|
for(int i=0; i< NUM_LEDS ; i++)
|
|||
|
{
|
|||
|
pixels2.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
pixels3.setPixelColor( i, 0, 0, 0, 0 );
|
|||
|
}
|
|||
|
|
|||
|
showStrip();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//delay(20);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void splitStrip()
|
|||
|
{
|
|||
|
// CONVERSION DE UNA ANIMACION DE 5M A DOS TRAMOS
|
|||
|
|
|||
|
for ( int i = 0; i < 150 ; i++) // numPixels/2
|
|||
|
{
|
|||
|
|
|||
|
pixels2.setPixelColor( i, pixels1.getPixelColor(i) );
|
|||
|
pixels3.setPixelColor( i, pixels1.getPixelColor(i + 150) );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void showStrip()
|
|||
|
{
|
|||
|
|
|||
|
//pixels1.show(); // tira entera de 5m
|
|||
|
pixels2.show(); // parte 1 de 2.5m
|
|||
|
pixels3.show(); // parte 2 de 2.5m
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void setPixel(int Pixel, byte red, byte green, byte blue, byte white)
|
|||
|
{
|
|||
|
|
|||
|
pixels1.setPixelColor(Pixel, pixels1.Color(red, green, blue, white));
|
|||
|
|
|||
|
}
|