home > Tea Ceremony > Code - final version
Tea Ceremony
 
Final Code - Processing


Click here to download the final version of Tea Ceremony Code.
>> tea_final_code.zip (6.5 Mb, with Sound files)
>> tea_final_code2.zip (6 kb, without Sound files)


Main Code
import processing.serial.*;

Serial port;                         // The serial port
int[] serialInArray = new int[4];    // Where we'll put what we receive
int serialCount = 0;                 // A count of how many bytes we receive
int drizzleTea, showerTea, fogTea, snowTea;		     // Starting position of the ball
boolean firstContact = false;        // Whether we've heard from the microcontroller

float averDrizzle = 0;               // average values
float averShower =0;
float averSnow = 0;
float averFog = 0;

int averDrizzleCount = 0;            // average counts
int averShowerCount =0;
int averSnowCount = 0;
int averFogCount = 0;

int aniCount1 =0;
int aniCount2 =0;
int aniCount3 =0;
int aniCount4 =0;

boolean DrizzleStart = false;        // animation trigger
boolean SnowStart = false;
boolean ShowerStart = false;
boolean FogStart = false;

boolean drizzleTurn = false;         // ready (got average values)
boolean showerTurn = false;
boolean snowTurn = false;
boolean fogTurn = false;

boolean drizzleReaver = false;       // when I pull tea recalculate averages
boolean showerReaver = false;
boolean snowReaver = false;
boolean fogReaver = false;

int ResetCount0 = 0;
int ResetCount1 = 0;
int ResetCount2 = 0;
int ResetCount3 = 0;
int ResetCount4 = 0;
int StartPoint = 100;
int AverCount = 20;
int DifferValue = 7;
int lastAni = 0;

import krister.Ess.*;
AudioChannel myChannel0;
AudioChannel myChannel1;
AudioChannel myChannel2;
AudioChannel myChannel3;
AudioChannel myChannel4;

PImage paper;

Drizzle drizzles; // decare drizzle object

Snow[] snows;
int totalSnows =0;

Shower[] showers;
int totalShowers =0;

Fog[] fogs;
int totalFogs =0;
void setup() {
  println(Serial.list());
  port = new Serial(this, Serial.list()[0], 9600);
  port.write(65);    // Send a capital A to start the microcontroller sending

  Ess.start(this);  // start up Ess
  myChannel0=new AudioChannel("tea_backsound01.wav"); // load sound file into a new AudioChannel
  myChannel1=new AudioChannel("drizzle01.wav"); // load sound file into a new AudioChannel
  myChannel2=new AudioChannel("shower01.wav"); // load sound file into a new AudioChannel
  myChannel3=new AudioChannel("snow01.wav"); // load sound file into a new AudioChannel
  myChannel4=new AudioChannel("fog01.wav"); // load sound file into a new AudioChannel
  paper = loadImage("paper_pattern02.jpg");

  size(800,400);  // Stage size
  background(255);
  image(paper, 0, 0);
  image(paper, 200, 0);
  image(paper, 400, 0);
  image(paper, 600, 0);
  image(paper, 0, 200);
  image(paper, 200, 200);
  image(paper, 400, 200);
  image(paper, 600, 200);
  noStroke();      // No border on the next thing drawn
  smooth();
  frameRate(30);
  drizzles = new Drizzle();
  snows = new Snow[300];
  showers = new Shower[200];
  fogs = new Fog[34];
  myChannel0.play(Ess.FOREVER);
}

void draw() {
  fill(0);

  ///////////////////////

  if(drizzleTea < 10 || showerTea < 10 || fogTea < 10 || snowTea < 10){
    allReset();
  }

  /*Drizzle*/
  if(drizzleTea > StartPoint){

    if(averDrizzleCount < AverCount){
      if(drizzleTurn ==false){
        averDrizzle=(averDrizzle+drizzleTea)/2;
        averDrizzleCount++;
      }
    }
    else{
      drizzleTurn = true;
    }
    if(drizzleTurn == true && (drizzleTea-averDrizzle)> DifferValue){           // when I pull tea
      if(drizzleReaver == false){
        Initialize();
        DrizzleStart = true;
        averSnow = snowTea;
        averShower = showerTea;
        averFog = fogTea;
        drizzleReaver = true;
      }
      
      if(aniCount1 < 1000){
        Animation();
        aniCount1++;
        ResetCount0 =0;
      }else{
        if(ResetCount0 < 22){
          tint(255,255,255, ResetCount0);
          Reset();
          ResetCount0++;
          delay(100);
        }else{
          aniCount1 =0;
        }
      }  
      lastAni=1;
    }
  }
  else if(drizzleTea <= StartPoint){
    if(drizzleReaver == true){
      drizzleTurn = false;
      averDrizzleCount = 0;
      drizzleReaver = false;
    }
    if(ResetCount0 < 20 && lastAni==1){
      tint(255,255,255, ResetCount0);
      Reset();
      ResetCount0++;
    }
  }
  /*Shower*/
  if(showerTea > StartPoint){
    if(averShowerCount < AverCount){
      if(showerTurn == false){
        averShower = (averShower+showerTea)/2;
        averShowerCount++;
      }
    }
    else{
      showerTurn = true;
    }
    if (showerTurn ==true && (showerTea-averShower)> DifferValue){
      if(showerReaver == false){
        Initialize();
        ShowerStart = true;
        averSnow = snowTea;
        averDrizzle = drizzleTea;
        averFog = fogTea;
        showerReaver = true;
      }
     
     if(aniCount2 < 600){
      Animation();
      aniCount2++;
      ResetCount0 = 0;
     } else{
        if(ResetCount0 < 22){
          tint(255,255,255, ResetCount0);
          Reset();
          ResetCount0++;
          delay(100);
        }else{
          aniCount2 =0;
        }
      }
lastAni = 2;
    }
  }
  else if(showerTea <= StartPoint) {
    showerTurn = false;
    averShowerCount =0;
    showerReaver = false;
    if(ResetCount0 < 20 && lastAni ==2){
      tint(255,255,255, ResetCount0);
      Reset();
      ResetCount0++;

    }
  }


  /*Snow*/
  if(snowTea >StartPoint){
    if(averSnowCount < AverCount){
      if(snowTurn == false){
        averSnow = (averSnow +snowTea)/2;
        averSnowCount++;
      }
    }
    else{
      snowTurn = true;
    }
    if (snowTurn ==true && (snowTea-averSnow)> DifferValue){
      if(snowReaver ==false){
        Initialize();
        SnowStart = true;
        averDrizzle = drizzleTea;
        averShower = showerTea;
        averFog = fogTea;
        snowReaver = true;
      }
      
      Animation();

      lastAni =3;
      ResetCount0 =0;

    }
  }
  else if(snowTea <= StartPoint){
    snowTurn = false;
    averSnowCount = 0;
    snowReaver = false;
    if(ResetCount0 < 20 && lastAni==3){
      tint(255,255,255, ResetCount0);
      Reset();
      ResetCount0++;
    }
  }


  /*Fog*/
  if(fogTea >StartPoint){
    if(averFogCount < AverCount){
      if(fogTurn == false){
        averFog = (averFog +fogTea)/2;
        averFogCount++;
      }
    }
    else {
      fogTurn = true;
    }

    if (fogTurn == true && (fogTea-averFog) > DifferValue){

      if(fogReaver == false){
        Initialize();
        FogStart = true;
        averDrizzle =  drizzleTea;
        averShower = showerTea;
        averSnow = snowTea;
        fogReaver = true;

      }
      
      if(aniCount4 < 100){
      Animation();
      aniCount4++;
      println(aniCount4);
      ResetCount0 =0;
      }else{
        if(ResetCount0 < 22){
          tint(255,255,255, ResetCount0);
          Reset();
          ResetCount0++;
          delay(100);
        }else{
          aniCount4 =0;
        }
      }
      lastAni = 1;
    }
  }
  else if(fogTea <= StartPoint){
    fogTurn = false;
    averFogCount = 0;

    fogReaver = false;

    /*Shower*/
    if(showerTea > StartPoint){
      if(averShowerCount < AverCount ){
        if(showerTurn == false){
          averShower = (averShower+showerTea)/2;
          averShowerCount++;
        }
      }
      else{
        showerTurn = true;
      }
      if (showerTurn ==true && (showerTea-averShower)> DifferValue){

        if(showerReaver == false){
          Initialize();
          ShowerStart = true;
          averSnow = snowTea;
          averDrizzle = drizzleTea;
          averFog = fogTea;
          showerReaver = true;
        }

        Animation();

        lastAni = 2;
        ResetCount0 = 0;

      }
    }
    else if(showerTea <= StartPoint) {
      showerTurn = false;
      averShowerCount =0;
      showerReaver = false;

      if(ResetCount0 < 20 && lastAni ==4){
        tint(255,255,255, ResetCount0);
        Reset();
        ResetCount0++;

      }
    }

    ///////////////////////

    if (firstContact == false) {
      delay(300);
      port.write(65);
    }
  }
}


void Initialize(){
  DrizzleStart = false;
  SnowStart = false;
  ShowerStart = false;
  FogStart = false;
}

void allReset(){
    myChannel1.stop();
    myChannel2.stop();
    myChannel3.stop();
    myChannel4.stop();

  image(paper, 0, 0);
  image(paper, 200, 0);
  image(paper, 400, 0);
  image(paper, 600, 0);
  image(paper, 0, 200);
  image(paper, 200, 200);
  image(paper, 400, 200);
  image(paper, 600, 200);

}
void Reset(){

  //tint(255,255,255, ResetCount1);
  image(paper, 0, 0);
  image(paper, 200, 0);
  image(paper, 400, 0);
  image(paper, 600, 0);
  image(paper, 0, 200);
  image(paper, 200, 200);
  image(paper, 400, 200);
  image(paper, 600, 200);

  delay(50);

}


void Animation(){
  // Drizzle
  if(DrizzleStart == true){
    myChannel1.play(Ess.FOREVER);
    myChannel2.stop();
    myChannel3.stop();
    myChannel4.stop();
    if(ResetCount1 < 20 ){
      tint(255,255,255, ResetCount1);

      Reset();
      ResetCount1++;
    }
    else {
      drizzles.display();
    }
  }
  else{
    ResetCount1 =0;
    myChannel1.stop();

  } 


  //Shower
  if(ShowerStart == true){
    myChannel1.stop();
    myChannel2.play(Ess.FOREVER);
    myChannel3.stop();
    myChannel4.stop();
    if(ResetCount2 < 20 ){
      tint(255,255,255, ResetCount2);
      Reset();
      ResetCount2++;
    }
    else{
      showers[totalShowers] = new Shower();
      totalShowers++;
      if(totalShowers >= showers.length){
        totalShowers = 0; //Start over
      }

      for (int i=0; i < totalShowers; i++){
        showers[i].display();
        showers[i].move();
      }
    }
  }
  else{
    myChannel2.stop();
    ResetCount2 = 0;
  }


  //Snow
  if(SnowStart ==true){
    myChannel1.stop();
    myChannel2.stop();
    myChannel3.play(Ess.FOREVER);
    myChannel4.stop();
    if(ResetCount3 < 20){
      tint(255,255,255,ResetCount3);
      Reset();
      ResetCount3++;
    }
    else{
      //background(255);
      //image(paper, 0, 0);
      ////////////////////////
      tint(255,255,255,255);
      image(paper, 0, 0);
      image(paper, 200, 0);
      image(paper, 400, 0);
      image(paper, 600, 0);
      image(paper, 0, 200);
      image(paper, 200, 200);
      image(paper, 400, 200);
      image(paper, 600, 200);
      ////////////////////////
      snows[totalSnows] = new Snow();
      totalSnows++;
      if(totalSnows >= snows.length){
        totalSnows = 0; //Start over
      }

      for (int i=0; i < totalSnows; i++){
        snows[i].display();
        snows[i].move();
      }

    }
  } 
  else{
    myChannel3.stop();
    ResetCount3 = 0;
  }

  // Fog
  if(FogStart == true){
    myChannel1.stop();
    myChannel2.stop();
    myChannel3.stop();
    myChannel4.play(Ess.FOREVER);
    if(ResetCount4 < 20 ){
      tint(255,255,255, ResetCount4);

      Reset();
      ResetCount4++;
    }
    else {
      fogs[totalFogs] = new Fog();
      totalFogs++;
      if(totalFogs >= fogs.length){
        totalFogs = 0; //Start over
      }

      for (int i=0; i < totalFogs; i++){
        fogs[i].display();
        fogs[i].move();
      }
      Reset();
    }
  }
  else{
    myChannel4.stop();
    ResetCount4 =0;
  } 



}


public void stop() {
  Ess.stop();
  super.stop();
}

void serialEvent(Serial port) {
  // if this is the first byte received, 
  // take note of that fact:
  if (firstContact == false) {
    firstContact = true; 
  }
  // Add the latest byte from the serial port to array:
  serialInArray[serialCount] = port.read();
  serialCount++;

  // If we have 3 bytes:
  if (serialCount > 3 ) {
    drizzleTea = serialInArray[0];
    showerTea = serialInArray[1];
    fogTea = serialInArray[2];
    snowTea = serialInArray[3];

    // print the values (for debugging purposes only):
    //  println(drizzleTea + "\t" + averDrizzle + "\t"+ showerTea + "\t"+ averShower+ "\t" + fogTea +"\t" + averFog+ "\t" + snowTea + "\t" + averSnow);

    // Send a capital A to request new sensor readings:
    port.write(65);
    // Reset serialCount:
    serialCount = 0;
  }
}

		
Do you want to contact us?
Ji Sun Lee, Cho Rong Hwang