Lab_interaccio/2021/DRON-screen/DRON_screen/DRON_screen.ino

493 lines
12 KiB
Arduino
Raw Normal View History

2025-02-25 21:29:42 +01:00
#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 1
#define ALFA 1.
#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 = 25;
int delaylight = 1000;
int amplilight = 240;
float ampliSmooth = 0;
float ampliSmoothLast = 0;
int sinus = 0;
//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 = 20; // 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 = 20;
uint8_t param2 = 140;
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 < 4; i++)
{
pinMode(idpin[i], INPUT);
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
//}
//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() )
{
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 )
{
selectedEffect = 0; // CMD 0 = off
}
else if ( CMD[0] == 1 )
{
selectedEffect = 1; // CMD 1 - FADE OUT
}
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
{
for (int angle = 0; angle <= 180; angle += 1)
{
float angle_rad = angle * M_PI / 180;
float sin_result = sin(angle_rad);
amplilight = sin_result*NUM_LEDS+1;
if(DEBUG)
{
Serial.print("sin(");
Serial.print(angle);
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 );
}
*/
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/2; i< NUM_LEDS/2 + amplilight/3 ; i++)
{
pixels2.setPixelColor( i, intensity, intensity, intensity, 0 );
pixels3.setPixelColor( i, intensity, intensity, intensity, 0 );
}
for(int i = NUM_LEDS/2-amplilight/3; i< NUM_LEDS/2 ; i++)
{
pixels2.setPixelColor( i, intensity, intensity, intensity, 0 );
pixels3.setPixelColor( i, intensity, intensity, intensity, 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));
}
uint32_t DimColor(uint32_t color)
{
// Shift R, G and B components one bit to the right
//uint32_t dimColor = Color(Red(color) >> 1, Green(color) >> 1, Blue(color) >> 1);
//return dimColor;
}