Processing
Úvodní stránka › Fórum › Software › Vývojová prostředí › Ostatní › Processing
- Toto téma obsahuje celkem 0 odpovědí. Do diskuze (1 diskutující) se naposledy zapojil uživatel Mr. Yourself a poslední změna proběhla před 9 roky a 10 měsíci.
-
AutorPříspěvky
-
24.2.2015 v 1:15 #2652Mr. YourselfÚčastník
Zdravím všechny nadšence. Rád bych se zde dozvěděl více informací ohledně jednoho programu do prostředí Processing. Program je vložen na konci příspěvku. Jedná se o program, který zasílá Arduinu informace ohledně obrazu na monitoru počítače, Arduino pak ovládá digitální RGB LEDky za obrazovkou. (Ambilight) V průběhu programu jsou v poznámkách vždy stručné informace o konktrétní sekci kódu, přestože s angličtinou nemám problém, neznám Processing dostatečně, aby mi informace pomohly. Nechci se zde rozepisovat, pokud se najde někdo, kdo bude ochotný na program mrknout a zodpovědět několik otázek, rád je zde napíši.
Děkuji,
**************************************************************************************************
import java.awt.*;
import java.awt.image.*;
import processing.serial.*;static final int led_num_x = 10;
static final int led_num_y = 6;
static final int leds[][] = new int[][] {
{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}, {6,0}, {7,0}, {8,0}, {9,0}, // Top side with edges
{9,1}, {9,2}, {9,3}, {9,4}, // Right side
{9,5}, {8,5}, {7,5}, {6,5}, {5,5}, {4,5}, {3,5}, {2,5}, {1,5}, {0,5}, //Bottom side with edges
{0,4}, {0,3}, {0,2}, {0,1}, // Left side
};static final short fade = 70;
static final int minBrightness = 120;
// Preview windows
int window_width;
int window_height;
int preview_pixel_width;
int preview_pixel_height;int[][] pixelOffset = new int[leds.length][256];
// RGB values for each LED
short[][] ledColor = new short[leds.length][3],
prevColor = new short[leds.length][3];byte[][] gamma = new byte[256][3];
byte[] serialData = new byte[ leds.length * 3 + 2];
int data_index = 0;//creates object from java library that lets us take screenshots
Robot bot;// bounds area for screen capture
Rectangle dispBounds;// Monitor Screen information
GraphicsEnvironment ge;
GraphicsConfiguration[] gc;
GraphicsDevice[] gd;Serial port;
void setup(){
int[] x = new int[16];
int[] y = new int[16];// ge – Graphics Environment
ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
// gd – Graphics Device
gd = ge.getScreenDevices();
DisplayMode mode = gd[0].getDisplayMode();
dispBounds = new Rectangle(0, 0, mode.getWidth(), mode.getHeight());// Preview windows
window_width = mode.getWidth()/5;
window_height = mode.getHeight()/5;
preview_pixel_width = window_width/led_num_x;
preview_pixel_height = window_height/led_num_y;// Preview window size
size(window_width, window_height);//standard Robot class error check
try {
bot = new Robot(gd[1]); //0 = monitor, 1 = televize
}
catch (AWTException e) {
println(„Robot class not supported by your system!“);
exit();
}float range, step, start;
for(int i=0; i<leds.length; i++) { // For each LED…
// Precompute columns, rows of each sampled point for this LED
// — for columns —–
range = (float)dispBounds.width / led_num_x;
// we only want 256 samples, and 16*16 = 256
step = range / 16.0;
start = range * (float)leds[i][0] + step * 0.5;for(int col=0; col<16; col++) {
x[col] = (int)(start + step * (float)col);
}// —– for rows —–
range = (float)dispBounds.height / led_num_y;
step = range / 16.0;
start = range * (float)leds[i][1] + step * 0.5;for(int row=0; row<16; row++) {
y[row] = (int)(start + step * (float)row);
}// —- Store sample locations —–
// Get offset to each pixel within full screen capture
for(int row=0; row<16; row++) {
for(int col=0; col<16; col++) {
pixelOffset[i][row * 16 + col] = y[row] * dispBounds.width + x[col];
}
}}
// Open serial port. this assumes the Arduino is the
// first/only serial device on the system. If that’s not the case,
// change „Serial.list()[0]“ to the name of the port to be used:
// you can comment it out if you only want to test it without the Arduinoport = new Serial(this, Serial.list()[1], 115200);
// A special header expected by the Arduino, to identify the beginning of a new bunch data.
serialData[0] = ‚o‘;
serialData[1] = ‚z‘;}
void draw(){
//get screenshot into object „screenshot“ of class BufferedImage
BufferedImage screenshot = bot.createScreenCapture(dispBounds);// Pass all the ARGB values of every pixel into an array
int[] screenData = ((DataBufferInt)screenshot.getRaster().getDataBuffer()).getData();data_index = 2; // 0, 1 are predefined header
for(int i=0; i<leds.length; i++) { // For each LED…
int r = 0;
int g = 0;
int b = 0;for(int o=0; o<256; o++)
{ //ARGB variable with 32 int bytes where
int pixel = screenData[ pixelOffset[i][o] ];
r += pixel & 0x00ff0000;
g += pixel & 0x0000ff00;
b += pixel & 0x000000ff;
}
// Blend new pixel value with the value from the prior frameledColor[i][0] = (short)(((( r >> 24) & 0xff) * (255 – fade) + prevColor[i][0] * fade) >> 8);
ledColor[i][1] = (short)(((( g >> 16) & 0xff) * (255 – fade) + prevColor[i][1] * fade) >> 8);
ledColor[i][2] = (short)(((( b >> 8) & 0xff) * (255 – fade) + prevColor[i][2] * fade) >> 8);serialData[data_index++] = (byte)ledColor[i][0];
serialData[data_index++] = (byte)ledColor[i][1];
serialData[data_index++] = (byte)ledColor[i][2];float preview_pixel_left = (float)dispBounds.width /5 / led_num_x * leds[i][0] ;
float preview_pixel_top = (float)dispBounds.height /5 / led_num_y * leds[i][1] ;color rgb = color(ledColor[i][0], ledColor[i][1], ledColor[i][2]);
fill(rgb);
rect(preview_pixel_left, preview_pixel_top, preview_pixel_width, preview_pixel_height);}
if(port != null) {
// wait for Arduino to send data
for(;;){if(port.available() > 0){
int inByte = port.read();
if (inByte == ‚y‘)
break;
}}
port.write(serialData); // Issue data to Arduino}
// Benchmark, how are we doing?
println(frameRate);
arraycopy(ledColor, 0, prevColor, 0, ledColor.length);}
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.