How Much Water Do You Use?

On Wednesday and Thursday the installation received a good deal of user interaction at the ITP Winter Show. The project worked in a practical sense, both the software and the hardware. It was also successful in provoking awareness. Most people were surprised at their consumption, sometimes to the point of skepticism. I assured them that while the flow rates are mapped on the high end of rates for older hardware, it was an accurate portrayal.

Some people questioned the value of the exercise in changing habits. I argued that awareness influences people's decisions over time. I don't expect people to take shorter showers after using the project, but perhaps the next toilet they buy will be low-flow.

The project has gotten some visibility online. Swyyne humorously points out the contradiction between the project's message and my bottled water, since it has negative environmental impacts.

Swynne also cites my mention of the possibility of home implementation. The project as it stands is more suited for a public display/kiosk setting, but home hardware is an extension of the idea that is feasible. An area for future exploration.

Thanks to my Nobu Nakaguchi, my partner on the project, and Robert Carlsen for his assistance.

[QUICKTIME 480 480]

A project that measures a person's interaction with a simulated daily home water use scenario to recommend ways to reduce water waste.


US Geological Survey Daily use estimates

Low Impact Living

Code Sample

class Meter extends Display {

//float level;
float drained;
float drainedLerp;
float maxDrained;
float initDrained;
float h;
float w;
float xloc;
float yloc;
float amount;
float time;
float lastDrained;

Meter() {
//default level
//level = 100;
//initDrained = 20;
drained = 0;
drainedLerp = 0;
maxDrained = 130;
h = 260;
w = 150;
xloc = 60;
yloc = 100;
amount = 0;
time = 0;

void update(float _amt) {
amount = _amt;
drained += amount;
lastDrained = drained;
if(lastDrained > gallonsUsed) {
gallonsUsed = lastDrained;

void update(float rate, Timer inputTimer) {
time = inputTimer.secondsMapped;
drained = ((rate/60) * time);
lastDrained = drained;
if(lastDrained > gallonsUsed) {
gallonsUsed = lastDrained;

void drawMeter() {
shape(waterTower, xloc, yloc);
//    gallonsLeft.setText(Integer.toString(int(150 - gallonsUsed)));
//    gallonsLeft.setPosition(xloc, yloc);
//    gallonsLeft.setFont(h3, h3Size, LEFT);
//    gallonsLeft.display();

void drawLevel() {
fill(159, 201, 235);
rect(xloc, yloc, w, h);
if(drainedLerp <  100){
rect(xloc, yloc + 80, w, 5 + drainedLerp);
else {
rect(xloc, yloc + 80, w, 100);
//interpolate draining
drainedLerp = lerp(drainedLerp, gallonsUsed, 0.05);

void display() {
//draw meter

float getDrainedValue() {
return gallonsUsed;

void reset() {
drained = 0;
lastDrained = 0;
gallonsUsed = 0;