Datasurfer Surface Plot Tool

Corner View of surface plot

Datsurfer

Datasurfer is a four-dimensional surface plot developed in Processing, for Introduction to Computational Media.  Datasurfer takes a two-dimensional spreadsheet (CSV) and translates values into a 3D surface, which can be manipulated by moving the viewpoint, or by shrinking or growing a two-dimensional window (in the case of the NYISO Grid Data, hours of the day/days of the year) of which blocks are plotted.  Moving the viewpoint changes the apparent representation of the data, allowing for a wider set of conclusions to be made–in this case, it is easy to see that there is substantial variation in the load both over the course of the year, and over the course of the day.

Components

The processing sketch is based on a two-dimensional parsing algorithm from Jonathan Cousins and Nick Sears, and adapted with help from Zannah Marsh.  The interface buttons and sliders come from the spectacular plugin set ControlP5, and the 3-D manipulation is provided by PeasyCam (much easier than writing my own manipulation with the Processing Camera commands).  Of course, neither ControlP5 nor PeasyCam are perfect, but they do work quite well.  A special thanks is due to Andreas Schlegel, author of ControlP5, for modifying the library to allow for changing the slider edge width – right when I needed it at the Ebay Design Expo.

At the ITP show, this is being displayed on a giant touchscreen, which is really a lot of fun, but unfortunately is a little hard to manipulate due to being only single-touch.  Multitouch (which everyone loves on tablets, phones, and now laptops) is going to really extend the computing experience, much more than it has already.

Expansion

As a programmable interface, there is nearly infinite ability for customization of the tool to different datasets–half the work of information visualization is setting up the tool in such a way as to yield valid conclusions and minimize artifacts.  One of the goals of this project is to build a real-time interface for data from a feed, such as a Tweet-A-Watt.

Special Thanks

Thanks to Jonathan Cousins and Nick Sears for a great fall introduction to information visualization and the seed of this project (and the start of the code), Zannah Marsh for the opportunity (need) to develop this for ICM, the Processing community for developing great plugins (ControlP5, PeasyCam), and of course ITP (specifically George Agudow and Red Burns).

Nonobject: designporn-satire

In my literature review, I came across Nonobject.  It seemed like a good book, by the title it appeared to be like Abstracting Craft, or a discussion of de-materialization of products.  It’s not.  It’s a book of designporn-satire.  The stuff inside is actually valuable from the point of poking a little fun at design, but there are a few really good product ideas lurking inside.

It’s got a foreword by Bill Moggridge, who is a great functional designer and human interface expert, and he reflects on the magic of Naoto Fukasawa’s design, self-described as “tension,” and contrasted with Dieter Rams’ philosophy of “less, but better” (which I think is good design’s essence).

And then it goes into designporn satire.  It’s 90% satire, and 5% good ideas.  The remaining 5% is something indeterminate—good ideas gone wrong, or bad ideas gone good, like Double Time (111) [bad design gone good] or Inner Time (156-157) [good design gone bad].

As for really good ideas worth pulling out, Climatology (70-72) really does depict the future of interfaces.  Interfaces now are for the most part discrete, and digital (in the sense of being this or that, 16C instead of slightly on the cool side).  In their vision of “User interface tomorrow”, it’s ubiquitous, integrated into the environment, and a bit more open to interpretation—good sailing weather instead of 12mi/hr winds.

Most of the design is fanciful—flatware more insane than the comically unusable (yet completely serious) Curveware; Kisha Unbrella (68-69), an inverted umbrella which collects and discharges rainwater through the handle, and bicycles which can’t be ridden.  But there are some cool things here: the enLighten Switch (100-101), which is rather like Ingrid Zwefel’s Stress Press; the Optimum flashlight (122-123), where the form follows the innards (the batteries define the shape of the flashlight); and the Rawphisticated Cell phone, which pays homage to Naoto Fukasawa’s potato inspired cell phone and iconic Infobar cell phone.

If you have the 20 minutes to spare, leaf through this for some inspiration.

Arduino Flowmeter

Thanks to Eric Rosenthal, Teague Labs, and Koolance, I have a handy fluid flow meter, that is cheap, flexible, and hopefully reliable.

Starting with Teague’s DIY Arduino Watermeter, I’ve made some modifications to the code to compensate for the fact that I’m not using a Yellowjacket Arduino with WiFi, and the need to preserve precious digital I/O lines for actual I/O, and not use them as ground lines.

And more importantly, I have found and solved a significant problem in their implementation: if the wheel in the Koolance meter comes to rest with the magnet close to the Hall Effect sensor, the sensor will be stuck ‘on’—and read as though it is continuously spinning.  This requires a double-latching arrangement, to detect the spinning wheel by picking up first a HIGH signal (magnet) then a LOW signal (no magnet).

Latching Code (Arduino):

//latching arrangement for pin A
//must receive signal then no signal to indicate spin
int signalA = digitalRead(FLOW_PIN_A);
//detects tachometer signal, flow pin goes high every time the magnet spins past the sensor NOTE: must be integer
if(signalA==1){
latchA1=true;
//set first latch
}
if(signalA==0){
latchA2=true;
//set second latch
}
if(latchA1==true and latchA2==true){  //if both latches are enabled, increment counters
countA++;
totalCount++;
//reset latches
latchA1 = false;
latchA2=false;
}

Full Code (Arduino):

This is set up for two meters, and can be expanded to more, or easily adapted to only read one flowmeter.

inline void digitalInputWithPullup(byte pin, boolean b) {  //enables pullups
  pinMode(pin, INPUT);
  digitalWrite(pin, b?HIGH:LOW);
}

#define FLOW_PIN_A 2
#define FLOW_PIN_B 3
//#define FLOW_PIN_X_GND Y //if you want to use a digital IO pin as a ground, enable this line, and modify X and Y

unsigned long totalCount = 0;
unsigned long previousCount = 0; //used for interlocking the counter 

unsigned long windowCountA=0;

//storage variable for the timer
unsigned long previousMillis=0;
int interval=1000; //in milliseconds

//counters for each flowmeter
unsigned long countA = 0;
//latches so the counter doesn't get stuck counting if the magnet stays next to the sensor
boolean latchA1 = false;
boolean latchA2 = false;

unsigned long countB = 0;
boolean latchB1 = false;
boolean latchB2 = false;

void setup()
{
  Serial.begin(19200);
  digitalInputWithPullup(FLOW_PIN_A, true);
  digitalInputWithPullup(FLOW_PIN_B, true);
//  pinMode(FLOW_PIN_X_GND, OUTPUT);  //for using digital I/O pins as ground lines
//  digitalWrite(FLOW_PIN_X_GND, LOW); 
}

void loop(){

//latching arrangement pin A: must receive signal then no signal to indicate spin
  int signalA = digitalRead(FLOW_PIN_A); //detects tachometer signal, flow pin goes high every time the magnet spins past the sensor. NOTE: must be int.
  if(signalA==1){
    latchA1=true;
  }
  if(signalA==0){
    latchA2=true;
  }
  if(latchA1==true and latchA2==true){
    windowCountA++; //increment window counter (counts/unit time)
    countA++; //cumulative count for flowmeter A
    totalCount++; //total count on all meters
    //reset latches
    latchA1=false;
    latchA2=false;
  }

//latching arrangement pin B
  int signalB = digitalRead(FLOW_PIN_B);
  if(signalB==1){
    latchB1=true;
  }
  if(signalB==0){
    latchB2=true;
  }
  if(latchB1==true and latchB2==true){
    countB++;
    totalCount++;
    latchB1=false;
    latchB2=false;
  }

/*
//debugging code to see if signals are present (will display a 1 if there is signal)
Serial.print(signalA);
Serial.print("|");
Serial.println(signalB);
*/

//cumulative totals output
  if (totalCount > previousCount){
    Serial.print(countA);
    Serial.print(" | ");
    Serial.print(countB);
    Serial.print(" || ");
    Serial.println(totalCount);
    previousCount = totalCount; //stores L<-R, updating previousCount so it recycles
  }

/*  
//window counters
  unsigned long currentMillis = millis(); //set storage variable currentMillis to current time
  if (currentMillis - previousMillis > interval) { //if within the rolling window [interval]
    previousMillis = currentMillis;     //save last time the clock updated in previousMillis
    Serial.print(currentMillis); //timestamp
    Serial.print(" | ");
    Serial.println(windowCountA); //count of 'clicks' within the window
    windowCountA=0; //reset window counter, cumulative counters unaffected.
  }
*/

}//end loop

Two Divergent Models of Behavior Change

… what do you mean two divergent models of behavior change?

  1. Conscious Behavior Change

The most common paradigm for behavior change is conscious behavior change: set a goal, change behavior to achieve the goal. It’s simple to contemplate, simple to actualize, and while at times difficult to pull off, it’s not that hard to make happen. For an example, my friend Jose wanted to lose weight. He made a plan, quantified his energy expenditure, and ate 400-600 kcal fewer every day, and after several months was a lean, mean, biking machine. It was a lot of work, but not that hard to understand and at any moment, you could see his scale, chart of food energy contents, and ask him what was going on.

In the energy space, things are a lot fuzzier. Marty McFly put it pretty well when he asked Doc “What the hell’s a Gigawatt?” Even people who eat sleep live and breathe in the energy space have a hard time understanding electrical energy, it’s pretty hard to understand in the same way as understanding tangible things like money, or even fuel economy of a car—it’s easy to visualize a gallon of gasoline and think about going 30 miles.

Most of the systems to encourage people to use electrical energy and fuel more efficiently fall under the conscious paradigm. Set some sort of a goal, either explicit (cut my electric bill by 20% this month) or implicit (I want to be under the neighborhood average and get a smiley face on my OPOWER designed monthly statement). Grounded Power, Rob Faludi’s company (recently acquired by Tendril), uses an explicit model of behavior change, where users make conscious decisions about their goals and work towards achieving those goals, supported by persuasive technologies.

  1. Unconscious Behavior Change

Unconscious (stealth) behavior change can come in many guises. The design of environments can substantially influence their inhabitants, a great example of which is the redesign of lunchrooms to shape the buying and eating habits of students: http://www.nytimes.com/interactive/2010/10/21/opinion/20101021_Oplunch.html

While it is a little insidious to put impulse buys in the path of shoppers, there’s plenty of good to be done with design of spaces, and with information displays.

Jon Froehlich‘s research at the University of Washington explores the use of ambient information displays to change behavior, specifically with UbiFit and UbiGreen. This approach can slowly change and ideally maintain the change in people’s behavior, and more importantly, may not require buy-in.

Thought must be expended on the ethics of unconscious behavior change—designing persuasive technology to influence people in ways that are not conducive to their welfare is pretty low, but it is not always obvious what is truly white hat versus black hat. MoPY (HP’s fish screensaver which makes you print more) is pretty obviously evil, and the sticker on the light switch to cut unnecessary electricity use is pretty plainly altruistic.

Overcoming conscious resistance to behavior change, provided that the behavior change is for the good, is a serious consideration, and argument for ‘stealth’ persuasive techniques. Conscious behavior change paradigms will not motivate people actively opposed—a staunch climate change denier like Senator James Inhofe (R-Oklahoma) is unlikely to be swayed by appeals for the environment. It may be possible for unconscious behavior change efforts to sway the actively opposed, circumventing conscious thought about the larger issue at hand. And persuasive techniques can maintain their efficacy even when it is known they are being used: Brian Wansink’s research has shown that using smaller plates reduces portion sizes even when the effect is known. The ‘foot in the door’ effect (see Freedman, J.L. & Fraser, S.C., 1966) may make it easier to subsequently change the beliefs of opponents, once their behavior has been changed: to maintain congruence between behavior and beliefs, their beliefs may have to change.

The two approaches are not mutually exclusive. Conscious behavior change can be supported by unconscious techniques, such as ambient information presentations and engineering the environment to support or promote change.