Sitting Above [Adam & Miles]

Sitting Above from adambd on Vimeo.

Screen Shot 2013-11-19 at 1.18.17 PM

Sitting Above is a dynamic sign that displays an estimate of the number of people currently flying overhead. We were interested in bringing attention to the fact that people are always above us. Commercial air travel, once a remarkable feat, has become a necessary and even “inconvenient” reality. In keeping with our low expectations for air travel, Sitting Above uses the alienating visual language of street signs.

We experimented with two modes of representation: kinetic and numerical. We had considered visualizing the biomass of people above using automatically blown bubbles – but were discouraged by the scarcity of helium gas (not to mention the questionable ethics of using helium).

moredata
When Wolfram is unable to provide flight operations data for an airline, we resort to random numbers (between 150-200).

The sign uses a Wixel to communicate wirelessly with a laptop. A Python program queries WolframAlpha for a list of planes above, then asks Wolfram for the average number of people on a given airline. The sum total of these figures is sent to Sitting Above, which shows the value on a seven-segment display.

mannsh
“It’s only powers of primes I think.” – man outside Newell Simon Hall
goodshot
“Paul! There’s some kind of device.” – Police officer

Python program

import wolframalpha
import time
import random
import serial

ser = serial.Serial('/dev/cu.usbmodemfa131', 9600)

def testQuery():
    client = wolframalpha.Client('X55U4H-PQ459QE3U4')
    res = client.query('planes overhead')
    output = next(res.results).text
    lines = output.splitlines()
    planes = []
    for line in lines:
        if(line[0] != '(' and line[0] != '|' and line[0] != ' '
           and 'flight' in line):
            endName = line.index('flight')
            planeString = str(line[:endName]) + 'flight operations data'
            if(planeString not in planes): 
                planes += [planeString]
    print 'Number of planes: %s' % len(planes)
    totalPeople = 0
    for plane in planes:
        #print 'trying %s' % (plane)
        planeResults = client.query(plane)
        planeInfo = next(planeResults.results).text
        planeData = planeInfo.splitlines()
        perFlightLine = [l for l in planeData if('average per flight' in l)]
        if(perFlightLine != []):
            start = len('average per flight | ')
            end = perFlightLine[0].find('people')
            perFlight = perFlightLine[0][start:end]
            totalPeople += int(eval(perFlight))
            print 'Per flight for %s: %s' %  (plane,perFlight)
        else:
            randPeople = random.randint(150,200)
            #print randPeople
            totalPeople += randPeople
            print 'Rand people: %s' % randPeople 
    digit = 1
    print totalPeople
    for i in xrange(4):
        ser.write(str((totalPeople/digit) % 10))  
        digit *= 10

while True:
    testQuery()
    updateTime = random.randint(30,120)
    time.sleep(updateTime)

Arduino sketch

#include 
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
int number = 0;
int digit = 1;  

Adafruit_7segment matrix = Adafruit_7segment();

void setup() {
  matrix.begin(0x70);
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()) {
    if(digit == 1) number = 0;
    number += (int(Serial.read()) - int('0'))*digit;
    digit *= 10;
    if(digit == 10000) digit = 1;
    Serial.println(number);
  }
  matrix.writeDigitNum(4, number % 10);
  matrix.writeDigitNum(3, (number/10) % 10);
  matrix.writeDigitNum(1, (number/100) % 10);
  matrix.writeDigitNum(0, (number/1000) % 10);
  matrix.writeDisplay();

}

Author: miles

Follow me on Twitter: https://twitter.com/mlsptn My YouTube channel: https://www.youtube.com/user/MilesPeyton Find me on OpenProcessing: http://www.openprocessing.org/user/12793