ソースコード

        
            //3つの要素→QRコード動かす、アニメーション、光センサーと繋げる

import processing.serial.*;
import java.awt.*;
import javax.swing.*;

//QRコードを動かす
int x = 0;
int y = 0;
int dir_x = 1;
int dir_y = 1;
int speed = 3;


Serial port;
int lightThreshold = 80;
boolean imageVisible = false;
PImage image;

//アニメーション
Kirakira[] kira = new Kirakira[250];

void setup() {
  size(1000, 600);
  
  frameRate( 30 );
  
  colorMode(HSB, 360, 100, 100);
  background(360);
  smooth();

  strokeWeight(3);
//アニメーション
   for (int i = 0; i < kira.length; i++) {
    kira[i] = new Kirakira();
  }

  // Arduinoとのシリアル通信の設定
  port = new Serial(this, "COM4", 9600);
  port.bufferUntil('\n');

  // QRコード画像の読み込み
  image = loadImage("QR.png");
}

void draw() {
  background(360);

    //光センサー
  if (port.available() > 0) {
    String lightValueString = port.readStringUntil('\n');
    if (lightValueString != null) {
      lightValueString = trim(lightValueString);
      int lightValue = int(lightValueString);

      if (lightValue <= lightThreshold) {
        // 光センサの値が閾値以下の場合、画像を表示
        imageVisible = true;
      } else {
        // 光センサの値が閾値より大きい場合、画像を非表示
        imageVisible = false;
      }
    }
  }

  if (imageVisible) {
    // 画像が表示状態の場合、画像を表示
    //imageMode(CENTER);
    //image(image, width / 2, height / 2);
    

    //QRコードの移動
    x += dir_x * speed;
  y += dir_y * speed;

  if ( ( x < 0 ) || ( x > width - image.width ) ) {
    dir_x = - dir_x;
  }

  if ( ( y < 0 ) || ( y > height - image.height ) ) {
    dir_y = - dir_y;
  }

  image( image, x, y );


  //アニメーション
    for (int i = 0; i < kira.length; i++) {
      kira[i].display();
      kira[i].move();
    }
  }
}

class Kirakira {
  float delta = TWO_PI / 100;

  float x = random(width);
  float y = random(height);
  float hue_fill = random(180,250);
  float hue_stroke = random(180,250);


  float R;
  float R_start = random(10, 30);
  float R_height = random(1.2, 1.6);
  float R_theta = random(TWO_PI);
  float R_theta_delta = random(0.03, 0.08);

  float y_spd = random(1, 3);

  Kirakira() {
  }

  void display() {
    fill(hue_fill, 50, 100, 80);
    stroke(hue_stroke, 100, 100, 80);
    pushMatrix();
    translate(x, y);
    beginShape();
    for (float t = 0; t < TWO_PI; t += delta) {
      vertex(R* pow(cos(t), 3), R * R_height * pow(sin(t), 3));
    }
    endShape(CLOSE);
    popMatrix();

    R = R_start * abs(sin(R_theta)) ;

    R_theta += R_theta_delta;
  }

  void move() {
    y -= y_spd;

    if (y < -R * R_height) {
      y = height + R * R_height;
    }
  }
}