Home More Info Fridge Gallery Live Feed Resources The Team
The Panamanian golden frog (Atelopus zeteki) is critically endangered. It may be extinct in the wild--it was last seen in the highlands of Panama in 2008. The zoological community collected a group of golden frogs as populations started to decline. Now they may only be alive in the Amphibian Ark--a transnational network of zoos, universities, and private institutions.

The Golden Frog is now possibly extinct in the wild largely because of the chytrid fungus--a deadly disease. Just before chytrid hit the highlands of Panama, the zoological community collected them and launched a breeding program. The Maryland Zoo and the National Aquarium in Baltimore have produced thousands of Golden Frogs, rescuing this species from the brink of extinction.

The breeding program has been almost too successful. Right now there are too many Golden Frogs, and not enough space in zoos. Plans are being laid to reintroduce the Golden Frog into the wilds of Panama, but since the chtrid fungus is still in the environment these reintroduction programs are proceeding cautiously.

This art work, "A Utopia for the Golden Frog", is a demonstration piece to show that individual "citizen scientists" are capable of caring for this species using retrofit everyday artifacts. This climate controlled and biosecure tank can only hold a few adult frogs. Since it does not contain water the frogs will not breed. Building on the spirit of Do-It-Yourself Biology, a grassroots scientific movement, this installation is meant to illustrate the possibilities of increasing the carrying capacity of the amphibian conservation network amidst a large scale mass extinction event.

The Utopia for the Golden Frog of Panama is currently on display at Proteus Gowanus, an art gallery in Brooklyn, New York. This installation is on display next to tanks of Xenopus laevis, another species of frog that is indirectly implicated in driving the Golden Frog, and many other amphibians, extinct. Xenopus can carry the pathogenic chytrid fungus in its skin without apparent symptoms. Initially, starting in the 1930s, Xenopus was transported around the world for use as a pregnancy test. Injecting urine from pregnant humans into Xenopus makes it ovulate. Xenopus is also common in the pet trade, sold at many corner stores in America and abroad. Many other organisms, like waterfowl and humans who don't wash their boots, can also play a role in transporting the chytrid fungus. But, the Xenopus Pregnancy Test is believed to be the original route for transporting this deadly disease around the world.
These are some photographs of the construction of the Utopia. The onboard computer is an Arduino connected to an LCD screen, temperature and humidity sensor, and two relays which control the power to the cooling mechanism in the fridge and the lights inside (which generate a slight bit of heat).
Click a thumbnail to view a larger image.
Constructing the onboard computer Placing the computer Computer test Done with phase one
The temperature/humidity sensor is placed within the terrarium and wired around the door to the computer. In addition to all of the above, we've installed a serial monitor and webcam feeding live video and sensor data to a recycled computer, which in turn uploads the data to this website. You can of course view this now by clicking on "Live Feed" in the menu.
The project currently resides at Proteus Gowanus in Brooklyn, NY. Here are some pictures of the web server on top, which pipes the webcam stream and temperature/humidity data to the website you are looking at now.
Web server Mutant larvae Display window Onboard computer in gallery Gallery view Gallery view Gallery view
I try to keep my code well commented, but if you need any clarification please feel free to email me @ graysonearle@gmail.com.

The equipment you'll need:
The onboard computer is an Arduino connected to an LCD screen.
A temperature and humidity sensor, and two relays which control the power to the cooling mechanism in the fridge and the lights inside (which generate a slight bit of heat).

As for the web server atop the fridge, this is optional, but allows one to graph the temperature/humidity data over time, and have real time monitoring in case of a power failure, assuming the internet connection remains active.

You'll need a laptop and Processing (a free program), as well as a webcam, which can be purchased for under $10 on eBay (but try to recycle one, they are everywhere). For those more familiar with Processing, note that you need to install edtftpj, an FTP library, in order for this to work. I've zipped it all up for the beginners, download it here.



/* GOLDEN FROG UTOPIA ARDUINO SOURCE */


//DHT STUFF
#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);


// temp
#define MINTEMP 68;
#define MAXTEMP 73;

//LCD STUFF
byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};
byte degree[8] = {
  0b01110,
  0b01010,
  0b01110,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int scrollStage = 0;

void setup() {
  // set up serial communication
  Serial.begin(9600);
  
  // set up custom characters
  lcd.createChar(2, heart);
  lcd.createChar(1, degree);
  
  // set up DHT device
  dht.begin();
  // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  // Print the title
  lcd.setCursor(0, 0);
  lcd.print("      UTOPIA");
  lcd.setCursor(0, 1);
  lcd.print("FOR THE GOLDEN FROG");
  // print the heart
  lcd.write(2);
  
  // activate pins for power tails
  pinMode(3, OUTPUT); // for lights
  pinMode(4, OUTPUT); // for fridge
 
}

void loop() {

  // read humidity and temperature
  float h = dht.readHumidity();
  float tempC = dht.readTemperature();
  // convert to Fahrenheit
  float t = tempC * 1.8 + 32;
  //set the cursor (x,y) starting at 0
  
  // print temp data
  lcd.setCursor(0, 2);
  lcd.print("Temperature:");
  lcd.print(t);
  lcd.write(1);
  lcd.print("F");
  
  // print humidity data
  lcd.setCursor(0, 3);
  lcd.print("Humidity:   ");
  lcd.print(h);
  lcd.print("%");
  
  // temperature management via powertail
  // temp is 20 - 22.8 in C or 68 to 73 in F
    // FRIDGE
  if(t >= 71) {
    digitalWrite(4, HIGH); // fridge ON
  }
  if(t < 69) {
    digitalWrite(4, LOW);  // fridge OFF
  }
    // LIGHTS
  if(t >= 74) {
    digitalWrite(3, LOW); // lights OFF
  } else {
    digitalWrite(3, HIGH);// lights ON
  }
  
  // send the data to the computer for web upload
  Serial.println(t);
}

/* GOLDEN FROG UTOPIA PROCESSING SOURCE */


// Reading Temp/Humid stuff
import processing.serial.*;

// webcam stuff
import processing.video.*;
Capture cam;

// Serial recieving stuff
int lf = 10;    // Linefeed in ASCII
String myString = "71.1 90";
Serial myPort;  // Serial port you are using
float num;


// FTP stuff
FTPClient ftp; // Declare a new FTPClient
String[] files; // Declare an array to hold directory listings

void setup ()
{
  String[] devices = Capture.list();
 println(devices);
 
  frameRate(1);
  cam = new Capture(this, 640, 480,devices[3]);
 // arduino serial stuff
 myPort = new Serial(this, Serial.list()[0], 9600);  // set first open serial as our connection
 myPort.clear();  // clear it (?)
}
void draw ()
{
	// go through the processes in order
 snapPhoto();
 checkSerial();
 makeFile();
 uploadFile();

 myPort.clear();

}

void snapPhoto() {
 if (cam.available() == true) {
   cam.read();
   // you can display the image with the below code, but it's faster to just save it
   // image(cam, 0, 0);
   cam.save("cam_1.jpg");
 }
}
void checkSerial(){
  // Receive STUFF
  while (myPort.available() > 0) {
   myString = myPort.readStringUntil(lf);
   if (myString != null) {
       print(myString);  // Prints String
       //num=float(myString);  // Converts and prints float
       //println(num);
   }
  }
 }


void makeFile() {
 // this next line is just for testing..
 //String words = myString;
 // split the words at a space, fills array
 String[] list = split(myString, " ");
 // create new string array
 String[] output = new String[1];
 // change the first element in the array just add the two strings with a <BR>
 output[0] = "<h1>Temperature:</h1> " + list[0] + "°F<BR>" + "<h1>Humidity:</h1> " + list[1] + "%";
 // println(output);
 // save
 saveStrings("temp.html", output);
}


 void uploadFile() {
       try
 {
  // set up a new ftp client
  ftp = new FTPClient();
  ftp.setRemoteHost("YOUR FTP INFO HERE"); // ie. ftp.site.com

  // set up listener
  FTPMessageCollector listener = new FTPMessageCollector();
  ftp.setMessageListener(listener);

  // connect to the ftp client
  println ("Connecting");
  ftp.connect();

  // login to the ftp client
  ftp.login("FTP ACCOUNT", "PASS");

  // set up in passive mode
  ftp.setConnectMode(FTPConnectMode.PASV);

  // set up for ASCII transfers
  ftp.setType(FTPTransferType.ASCII);

  /* get the directory contents and print it to console
  println ("Directory before put:");
  files = ftp.dir(".", true);
  for (int i = 0; i < files.length; i++)
  {
    println (i+" "+files[i]);
  } */

  // copy ASCII file to server and overwrite the existing file
  println ("Putting file");
  ftp.put("PATH/TO/temp.html",
"temp.html", false);  // source file, dest. file

ftp.setType(FTPTransferType.BINARY);
  ftp.put("PATH/TO/cam_1.jpg",
"cam_1.jpg", false);  // source file, dest. file

  // Shut down client
  ftp.quit();

  // Print out the listener messages
  String messages = listener.getLog();
  println ("Listener log:");

  // End message - if you get to here it must have worked
  println(messages);

 }
 catch (Exception e)
 {

  //Print out the type of error
  println("Error "+e);

 }

 }
Eben Kirksey earned his Ph.D. from the University of California-Santa Cruz and is currently a Mellon Fellow and Visiting Assistant Professor at the CUNY Graduate Center in New York City. His first book, Freedom in Entangled Worlds: West Papua and the Architecture of Global Power, will be published by Duke University Press in April 2012.








Grayson Earle is an MFA candidate at Hunter College working with emerging technology as it relates to art. His work has been featured in galleries around the city including 3LD in Manhattan.

graysonearle@gmail.com








Michael Khadavi is a web developer and an ecological designer who earned a B.A. in Anthropology from City University of New York-Queens College in 2008. As the Director of the Amphibian Steward Network, of Tree Walkers International, he conducted a study of the chytrid fungus in private poison dart frog collections.
website by grayson earle