first light for s2l type packets
icorrect mapping from xy coordinates to zigzag neopixel leds the reciever arduino code has a bad xy calculation so displays garbage from ram into the pixelsmaster
parent
f4c71012be
commit
1c8e41e8ad
|
@ -13,10 +13,14 @@
|
|||
#define PIN 6
|
||||
|
||||
// How many NeoPixels are attached to the Arduino?
|
||||
#define NUMPIXELS 25
|
||||
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
|
||||
// at 800Mhz we can send 33333 color values / second
|
||||
// so to have 60hz refresh the max pixels is 555 so we set it to arbitryrily 512
|
||||
#define ROWS 5
|
||||
#define COLS 5
|
||||
#define NUMPIXELS ROWS*COLS
|
||||
|
||||
uint16_t brightness = 10;
|
||||
|
||||
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
|
||||
|
||||
// the mac will be filled out by serial number, stored as ascii hex in the eeprom 6 first bytes
|
||||
byte mac[] = { '2', 'S', 'L', 0, 0, 0 }; // 2(to) S-yn2-L-ights (2 because unicast + locally administered)
|
||||
|
@ -61,8 +65,22 @@ void setup() {
|
|||
}
|
||||
Serial.println();
|
||||
pixels.begin();
|
||||
pixels.show(); // Initialize all pixels to 'off'
|
||||
|
||||
for(int x=0;x<COLS;x++) {
|
||||
for(int y=0;y<ROWS;y++) {
|
||||
// pixels.setPixelColor(indirect(x,y), pixels.Color(r, g, b));
|
||||
pixels.setPixelColor(indirect(x,y), pixels.Color(255, 0, 0));
|
||||
pixels.show();
|
||||
delay(100);
|
||||
pixels.setPixelColor(indirect(x,y), pixels.Color(0, 0, 0));
|
||||
}
|
||||
}
|
||||
pixels.show();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
int packetSize = Udp.parsePacket();
|
||||
if(packetSize)
|
||||
|
@ -84,26 +102,56 @@ uint16_t readSubPixelValue(byte in){
|
|||
}
|
||||
|
||||
|
||||
#define S2LHEADERLEN 12-1
|
||||
void drawCommand() {
|
||||
Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
|
||||
for(uint16_t i = 0; i<NUMPIXELS; i++){
|
||||
byte r=(byte)packetBuffer[i*3];
|
||||
byte g=(byte)packetBuffer[i*3+1];
|
||||
byte b=(byte)packetBuffer[i*3+2];
|
||||
pixels.setPixelColor(indirect(i), pixels.Color(readSubPixelValue(r), readSubPixelValue(g), readSubPixelValue(b)));
|
||||
if(strncmp("s2l\n",packetBuffer,4)) {
|
||||
Serial.println("unknown packet recieved");
|
||||
return;
|
||||
}
|
||||
int width=(int)(packetBuffer[4]-'0');
|
||||
int height=(int)(packetBuffer[5]-'0');
|
||||
Serial.print(" width:");
|
||||
Serial.println(width);
|
||||
Serial.print("height:");
|
||||
Serial.println(height);
|
||||
// now we have RGBA values coming in, ignore the A channel
|
||||
// rows * (columns * 4 +1)
|
||||
// e.g. 20 * (200 * 4 + ) 20 rows of 200 pixels (+1 as there is a \n after each row)
|
||||
for(int y=0;y<height;y++) {
|
||||
for(int x=0;x<width;x++) {
|
||||
// determine r g b for this pixel x,y
|
||||
// for(uint16_t i = S2LHEADERLEN-1; i<NUMPIXELS; i++){
|
||||
uint16_t r=(uint16_t)packetBuffer[S2LHEADERLEN+(y * (width * 4 + 1)) + (x * 4 + 1)];
|
||||
Serial.print((char)r);
|
||||
uint16_t g=(uint16_t)packetBuffer[S2LHEADERLEN+(y * (width * 4 + 1)) + (x * 4 + 2)];
|
||||
Serial.print((char)g);
|
||||
uint16_t b=(uint16_t)packetBuffer[S2LHEADERLEN+(y * (width * 4 + 1)) + (x * 4 + 3)];
|
||||
Serial.print((char)b);
|
||||
Serial.print(' ');
|
||||
uint16_t pix=indirect(x,y);
|
||||
if (pix>=0) {
|
||||
pixels.setPixelColor(indirect(x,y), pixels.Color(r, g, b));
|
||||
}
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
pixels.show();
|
||||
}
|
||||
|
||||
#define ROWS 5
|
||||
uint16_t indirect(uint16_t in) {
|
||||
if((in/ROWS)%2) {
|
||||
uint16_t t;
|
||||
t=in/ROWS;
|
||||
t*=ROWS;
|
||||
t+=ROWS-(in%ROWS)-1;
|
||||
return t;
|
||||
} else {
|
||||
return in;
|
||||
uint16_t indirect(uint16_t col,uint16_t row) {
|
||||
if(col>COLS) { return -1;}
|
||||
if(row>ROWS) { return -1;}
|
||||
|
||||
// orientation is top to bottom, one right, then bottom to top
|
||||
// we may want to add a mirror into this if it's put into a window
|
||||
|
||||
if(col%2) { // odd column, this reverses the direction
|
||||
// invert the row
|
||||
uint16_t invrow=ROWS-row-1;
|
||||
return col*ROWS+invrow;
|
||||
} else { // check if column is even, i.e. the first = 0 = even
|
||||
return col*ROWS+row;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
#!/bin/bash
|
||||
# test program
|
||||
# modify below the ethernet adress
|
||||
# width and height are unfortunately hardcoded
|
||||
a=-1
|
||||
while true
|
||||
do
|
||||
a=$((a+1))
|
||||
frame="$(
|
||||
echo "s2l"
|
||||
printf "55518 "
|
||||
printf "1"
|
||||
echo ""
|
||||
#a=$(date +%S)
|
||||
#a=$((0+a))
|
||||
j=0
|
||||
while [ $j -lt 5 ]
|
||||
do
|
||||
i=0
|
||||
while [ $i -lt 5 ]
|
||||
do
|
||||
n=$((i*5+j))
|
||||
if [ $n -eq $a ]
|
||||
then
|
||||
printf "xyz "
|
||||
else
|
||||
printf "012 "
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
j=$((j+1))
|
||||
echo "" # next row
|
||||
done
|
||||
d=0
|
||||
# while [ $d -lt 12 ]
|
||||
# do
|
||||
# s=0
|
||||
# while [ $s -lt 8 ]
|
||||
# do
|
||||
# printf "1${s}1 "
|
||||
# s=$((s+1))
|
||||
# done
|
||||
# d=$((d+1))
|
||||
# echo "" # next display
|
||||
# done
|
||||
)"
|
||||
echo "$frame"
|
||||
echo "$frame" | nc -w 1 -u 10.2.113.161 8888
|
||||
sleep 1
|
||||
done
|
Loading…
Reference in New Issue