#include <Adafruit_NeoPixel.h>
#define PIN 0
const int circleNum = 6; //set the number of circles here
// 0 1 2 3 4 5
const int x[] = {0, 400, 200, 1, 400, 25, 25}; //the x-position of an circle
const int y[] = {0, 0, 0, 75, 200, 400, 400}; //the y-position of an circle
const int pixNum[] = {0, 16, 16, 16, 16, 32, 16}; //the number of pixel of an circle
const int longestStrip= 32;
//make shure the array-position of an circle is the same for all above
const int maxBright= 220; //set normal max brightness
int first[circleNum+1]={0, 0, 16, 32, 48, 64, 98};
int last[circleNum+1]={0, 15, 31, 47, 63, 97, 113};
int totalPixNum = 113;
int activeC;
int target;
float phi;
float pho;
float aim;
int aimPix;
int targetPix;
float VPix;
float dist;
int tarPix;
float vtPix;
Adafruit_NeoPixel pixels(totalPixNum, PIN, NEO_GRB + NEO_KHZ800);
//Adafruit_NeoPixel pixels(totalPixNum, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
Serial.print("Anzahl der Kreise: "); Serial.print(circleNum); Serial.println();
Serial.print("maxBright: "); Serial.print(maxBright); Serial.println();
for(int i=0; i<=circleNum; i++){
Serial.print("Startpixel von Kreis "); Serial.print(i); Serial.print(": "); Serial.print(first[i]); Serial.println();
}
Serial.print("Pixel gesamt: "); Serial.print(totalPixNum); Serial.println();
pixels.begin();
for(int i=0; i<=totalPixNum; i++){
pixels.setPixelColor(i, pixels.Color(255,255,255));
pixels.show();
delay(100
);
pixels.setPixelColor(i, pixels.Color(0,0,0));
pixels.show();
}
}
void loop() {
for(int p=0; p<=totalPixNum; p++){
pixels.setPixelColor(p, pixels.Color(0,0,0));
}
pixels.show();
delay(500);
for(int c=1; c<=circleNum; c++){
for(int g=1; g<=circleNum; g++){
if(g==c){
for(int p=0; p<=pixNum[g]-1; p++){
pixels.setPixelColor(p+first[g], pixels.Color(255,255,255));
}
pixels.show();
delay(300);
for(int p=0; p<=pixNum[g]; p++){
pixels.setPixelColor(p+first[g], pixels.Color(0,0,0));
}
pixels.show();
delay(300);
}
phi=getPhi(c, g);
Serial.print("phi: "); Serial.print(phi); Serial.println("°");
pho=getPhi(g, c);
Serial.print("pho: "); Serial.print(pho); Serial.println("°");
float pAf = getP(c, g, phi);
int pAi = (int)pAf;
float pTf = getP(g, c, pho);
int pTi = (int)pTf;
pixels.setPixelColor(pAi, pixels.Color(255*(1-(pAf-pAi)),255*(1-(pAf-pAi)),255*(1-(pAf-pAi))));
pixels.setPixelColor(pAi+1, pixels.Color(255*(pAf-pAi),255*(pAf-pAi),255*(pAf-pAi)));
Serial.print("pA (");Serial.print(c);Serial.print("): "); Serial.println(pAf);
pixels.setPixelColor(pTi, pixels.Color(255*(1-(pTf-pTi)),255*(1-(pTf-pTi)),255*(1-(pTf-pTi))));
pixels.setPixelColor(pTi+1, pixels.Color(255*(pTf-pTi),255*(pTf-pTi),255*(pTf-pTi)));
Serial.print("pT (");Serial.print(g);Serial.print("): "); Serial.println(pTf);
pixels.show();
for(int i=0; i<=10; i++){
Serial.print(".");
delay(250);
}
Serial.println();
pixels.setPixelColor(pAi, pixels.Color(0,0,0));
pixels.setPixelColor(pAi+1, pixels.Color(0,0,0));
pixels.setPixelColor(pTi, pixels.Color(0,0,0));
pixels.setPixelColor(pTi+1, pixels.Color(0,0,0));
pixels.show();
}
}
delay(5000);
}
float getP(int d, int e, float phi){
int p;
if( phi == 0){p=first[d]+0;}
if(x[d]<<x[e] && phi!=0){
p = first[d] + (pixNum[d]*phi/360);
}
if(x[d]>>x[e] && phi!=0){
p = (last[d]+1)-(pixNum[d]*phi/360);
}
if(x[d]==x[e] && phi!=0){
p = first[d]+(pixNum[d]/2);
}
return(p);
}
float getPhi(int act, int tar){
int vecX[] = {0, x[act], x[tar], 0};
int vecY[] = {1, y[act], y[tar], 0};
vecX[4]=(vecX[2]-vecX[1]);
vecY[4]=(vecY[2]-vecY[1]);
double scalarProduct = (0*vecX[4])+(1*vecY[4]);
double lengthProduct = sqrt(sq(vecX[4])+sq(vecY[4]));
float phi = (acos(scalarProduct/lengthProduct)*572957795)/10000000;
if(vecX[1]>vecX[2]){
//phi = phi+180;
return phi;
} else {return phi;}
}
float getD(int act, int tar) {
return(sqrt(sq(x[act]-x[tar])+sq(y[act]-y[tar])));
}
void shoot(int act, int aP, float vP, float dist){
pixels.setPixelColor(aP+first[act], pixels.Color(0,0,255));
pixels.show();
}
void hit(int tarP, float vtP){
}
void dim(int act){
for(int v=0; v<=maxBright; v=v+5){
for(int i=first[act]; i<=last[act]; i++){
pixels.setPixelColor(i, pixels.Color(v, v, v));
}
pixels.show();
}
}
void flimmer(int act){
int time = millis();
int now = millis();
int fakt;
back:
for (int z= 1; z<=6 && now<=time+1000; z= z+0.1){
for(int i = first[act]; i<=last[act]; i++){
fakt = -12*(z*cos((i*PI)/(0.1*z)));
pixels.setPixelColor(i, pixels.Color(maxBright-fakt, maxBright-fakt, maxBright));
}
delay(50);
now=millis();
}
for (int z= 6; z<=6 && now<=time+1000; z= z-0.1){
for(int i = first[act]; i<=last[act]; i++){
fakt = -12*(z*cos((i*PI)/(0.1*z)));
pixels.setPixelColor(i, pixels.Color(maxBright-fakt, maxBright-fakt, maxBright));
}
delay(50);
now=millis();
}
if(millis()<=time+1000){goto back;}
}