WEATHERBE – by Demi Kandylis, Ryan Rizzo and Heather Phenix
INSPIRATION
Our inspiration for the Weatherbe project was informed by nature, and the desire to render the weather into an artistic and comparative visualization of data from a specific set of cities across the globe. But why? For one, we found the important connection between weather and mood in humans to be intriguing, and the notion of how the relationship with one’s self can be deeply affected by weather patterns that are very much beyond our control. We thought about how weather is an increasingly common topic of conversation – often the basis of small talk – and more often the basis of important discussions surrounding disaster and the never-ending influx of opinions on global warming. It’s often the marker of how favourable a city is to live in, how we relate to each others’ state of being, whether together or apart, and how we decide on anything from which modes of transport to use, to how many layers to wear on a daily basis. Weather, in some ways, can be considered as central to how we live our lives as time.
References:
http://www.freewebs.com/partyhardinn/Relationship%20of%20Mood%20&%20Weather.pdf
When thinking about what kind of data visualizations could do justice to such a force, we realized that sometimes the most simple, uniform things can be the most effective. Our data sets needed to be representative of motion in an interesting way. We delved into creating mesmerizing simplicity of changing and interconnected shapes, and were inspired by Matthew and Susan Gorbet’s Chronos and Kairos project, “a robotic suspended sculpture located at Gate 19 of the San Jose International Airport. An abstract timepiece. The choreographed movement of 65 suspended aluminum elements depict varying representations of time.”
Overall, we set out to play with temperature, wind speed, humidity and wind direction. We needed to create sketches that could build – increase and decrease – over time when fed weather API’s from cities of our choice…which brought us to our next question…which cities?
We thought in terms of our audience – the most relatively interesting cities would naturally be those of our classmates…displaying the mild, November humidity of Tehran, juxtaposed with the icy, snowy winds of Saskatoon, the dry desert heat of Beersheba, and the moderately cold Toronto would surely hit the mark.
Additional inspirations below:
Data vis- modern approaches
http://www.smashingmagazine.com/2007/08/02/data-visualization-modern-approaches/
Data vis processing code from Ben Fry (author of visualizing data)
http://benfry.com/writing/archives/3
Khan Academy
http://www.khanacademy.org/science/cosmology-and-astronomy
IBM think Exhibit Data Wall
http://www.behance.net/gallery/IBM-Think-Exhibit-Data-Wall/4619911?utm_source=Triggermail&utm_medium=email&utm_term=ALL&utm_campaign=MIH%20-%20November%2012
Amon Tobin’s show
http://www.youtube.com/watch?v=WWai4UZ0OqI
OPEN PROCESSING FAVES (H)
Curtain (like Harjot’s Kinect project)
http://www.openprocessing.org/sketch/20140
Tree
http://www.openprocessing.org/sketch/10318
Blobs
http://www.openprocessing.org/sketch/17043
Dough
http://www.openprocessing.org/sketch/65193
PROCESS
In creating the Weatherbee project, with the assigned wireless criteria in mind, we set out first to work together on creating something simple, that could be represented wirelessly through various forms of digital and physical light. The digital came first. Ryan and I discussed with Demi that our main goal for the project was to contribute to the coding, since this was not our strength and it was his. We discussed the use of projected light on mirrors, and looked at various examples of code that we found interesting to play with:
http://www.openprocessing.org/sketch/78479
http://www.openprocessing.org/sketch/25108
http://www.openprocessing.org/sketch/16965
http://www.openprocessing.org/sketch/5386
http://www.openprocessing.org/sketch/65193
Things got particularly frustrating when it came to the code. Ryan and I could create simple shapes that moved, but for whatever the reasons were, we never got to the point of implementing our work into the final product. Little did we know, Demi had been toiling away on a visualization that seemed to check the boxes for all of us in terms of its aesthetics. Here is the code he used:
CODE
class Particle {
PVector location;
PVector velocity;
PVector acceleration;
float lifespan;
float wind;
PVector dir;
float temp;
float hum;
color col;
Particle(PVector l, float curLifespan) {
acceleration = new PVector(0,0.07);
velocity = new PVector(random(-1,1),random(-
location = l.get();
lifespan = curLifespan;
}void run(WeatherObject wo) {wind = map(wo.wind,0,100,0,.5);
dir = wo.dir;
temp = wo.temp;
hum = wo.hum;
col = wo.col;update();
display();
}void update() {location.add(dir);
velocity.add(new PVector(wind*dir.x,wind*dir.y));
location.add(velocity);
lifespan -= 2.0;
}void display() {
fill(col,lifespan);
ellipse(location.x,location.y,2,2);
}boolean isDead() {
if (lifespan < 0.0) {
return true;
} else {
return false;
}
}
}class ParticleSystem {
ArrayList<Particle> particles;
float curLifespan = 400;
ParticleSystem() {
particles = new ArrayList<Particle>();
}
void addParticle() {
particles.add(new Particle(new PVector(width/2,50),curLifespan));
}
void run(int w, PVector d, int t, int h) {
Iterator<Particle> it = particles.iterator();
while (it.hasNext()) {
Particle p = it.next();
//p.run(w,d,t,h);
p.run(wo);
if (p.isDead()) {
it.remove();
}
}
}
}
class WeatherObject
{
String city;
float wind;
PVector dir;
float temp;
float hum;
color col;
void WeatherObject()
{
}
}
class XbeeMultiLightControl implements Runnable
{
int N = 0;
int NE = 1;
int E = 2;
int SE = 3;
int S = 4;
int SW = 5;
int W = 6;
int NW = 7;
int rVal = 100;
int gVal = 0;
int bVal = 0;
int fadeSpeed = 50;
int pulse = 10;
int[] payload;
boolean isRunning;
XBeeAddress64[] addr;
XBee xbee;
void XbeeMultiLightControl() {
}
void init()
{
println(“////////////////////////////////////”);
addr = new XBeeAddress64[4];
addr[0] = new XBeeAddress64(“00 13 a2 00 40 98 99 85”);
addr[1] = new XBeeAddress64(“00 13 a2 00 40 98 99 8c”);
addr[2] = new XBeeAddress64(“00 13 a2 00 40 98 99 83”);
addr[3] = new XBeeAddress64(“00 13 a2 00 40 92 d7 c7”);
xbee = new XBee();
try {
xbee.open(Serial.list()[0], 9600);
} catch (Exception e) {
System.out.println(“XBee failed to initialize”);
e.printStackTrace();
System.exit(1);
}
}
void pulsate(int dir, int rv, int gv, int bv,int speed, int pulse)
{
fadeSpeed = speed;
payload = new int[] {rv, gv, bv, speed, pulse};
}
void run()
{
if (!isRunning)
{
//isRunning = true;
sendValue(addr[0], payload);
delay(fadeSpeed);
sendValue(addr[1], payload);
delay(fadeSpeed);
sendValue(addr[2], payload);
delay(fadeSpeed);
sendValue(addr[3], payload);
println(” thread is done!”);
xbeeThread.interrupt();
//isRunning = false;
}
}
void sendValue(XBeeAddress64 addr64, int[] payload)
{
ZNetTxRequest tx = new ZNetTxRequest(addr64, payload);
try{
ZNetTxStatusResponse status = (ZNetTxStatusResponse) xbee.sendSynchronous(tx, 500);
if (status.isSuccess()) {
}else{
}
} catch (XBeeException e) {
System.out.println(“NOOOO”+”\n”);

}