Sitting Above [Adam & Miles]
Sitting Above from adambd on Vimeo.
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).
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.
“It’s only powers of primes I think.” – man outside Newell Simon Hall “Paul! There’s some kind of device.” – Police officerPython 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();
}