top of page

Equitable Urbanism integrates sensory elements into the urban landscape of Barcelona, Spain. By tackling the issue of thermal comfort and safety, diverse and active communities are supported through inclusive and considerate public space. 

zoom_01.jpg

The implementation of botanic gardens serves to provide sensory stimulation, fixtures for play, and shade creating cooler temperatures, social engagement, and reduced heat risk.

JAMO is a sensor platform created for use with Arduino Uno that collects temperature, light, and humidity data.

The user turns JAMO on and simply walks through a siteJAMO then collects environmental data and writes it onto an on-board SD card as comma separated values.

The data is paired with an athletic 'track my run' phone app to provide GPS coordinates.

 

Using Microsoft Excel, both data sets are input into Rhinoceros and Grasshopper

The output is a data driven visualization of existing environmental conditions.

Sunlight (left) and Temperature (right) of same street.

Correlation!

eagle eye jamo.jpg

Twenty four streets of data! Thirty minutes!

DESIGNING WITH DATA!

Spain experienced three heat-waves in the summer of 2003 that led to a higher than projected mortality rate. The mortality rate in Barcelona alone rose 17.05% above average.

With 21.6% of Barcelona's population 65 years of age and older, the aging at risk population continues to grow. It is projected that in 2029 a quarter of the population will be over 65, and by 2064, 38,7% of the population will be over 65.

Area of Study thinner.jpg

Barcelona, Spain

Section.jpg

Botanic Street Gardens utilizes a reactive cooling system of in-ground fountains to cool spaces via evaporation. Passive cooling strategies are also employed via tree shade and foliage cover.

FOUR PAGE DIAGRAMS-04.jpg

The primary goal is to engage communities with spaces that provide sensory stimulation and appropriate autonomy. By creating cool accessible spaces, those at risk of heat related illness such as seniors and children have a place to gather during all times of the year.

FOUR PAGE DIAGRAMS-03B.jpg
2.jpg
1b.jpg

Platanus x hispanica

50,024 - population in Barcelona

Kaulruteria paniculata

885 - population in Barcelona

4c.jpg
3.jpg

Lonicera nitida

Albizia x grandiflora

Developing and prototyping JAMO!

The code!

//JAMO_8.0.default by Kevin Tan
//Any second delay with button
//Temperature(C), Humidity(%), Heat Index(HI, C), Light(lux), time (seconds),

//LCD Display(optional), Button, one free slot for another sensor (currently mq135 gas)
//make sure you have the right libraries installed or else it wont work!


int howLong = (5);    //how many seconds between each measurement. YOU DEFINE.


//Libraries
#include <SD.h>
#include <SPI.h>
#include <DHT.h>
#include <Wire.h> 
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
//

#define DHTPIN A0
#define DHTTYPE DHT22


//ALWAYS USE THIS WITH LCD I2C and Addres 0x3F
#define I2C_ADDR 0x3F
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
//

int TIME=((howLong)*1000); 

//button stuff
const int buttonPin = A1;     // the number of the pushbutton pin
int buttonState = 0;         // variable for reading the pushbutton status
//

long seconds=00;
long minutes=00;
long hours=00;

int CS_pin = 10;

int sensorPin = A2;    // the input pin for the potentiometer/Photoresistor/LightSensor
int sensorValue = 0;  // variable to store the value coming from the light sensor


DHT dht(DHTPIN, DHTTYPE);
File sd_file;

void setup()  {
  Serial.begin(9600);
  pinMode(CS_pin, OUTPUT);
  dht.begin();
  // SD Card Initialization
  if (SD.begin())  {
    Serial.println("SD card is initialized. Ready to go");
  } 
  else  {
    Serial.println("Failed");
    return;
  }

  sd_file = SD.open("data.txt", FILE_WRITE);

  if (sd_file)  {
    Serial.print("Time");
    Serial.print(",");
    Serial.print("Humidity");
    Serial.print(",");
    Serial.print("Temperature_C");
    Serial.print(",");
  //  Serial.print("Temperature_F");
  //  Serial.print(",");
    Serial.print("Heat_index_C");
    Serial.print(",");
    Serial.print("PhotoResistor");
        Serial.print(",");
        Serial.println("MQ 135");    

    sd_file.print("Time");
    sd_file.print(",");
    sd_file.print("Humidity");
    sd_file.print(",");
    sd_file.print("Temperature_C");
    sd_file.print(",");
 //   sd_file.print("Temperature_F");
 //   sd_file.print(",");
    sd_file.print("Heat_index_C");
    sd_file.print(",");
    sd_file.print("PhotoResistor");
    sd_file.print(",");
        sd_file.println("MQ 135");
  }
  sd_file.close(); //closing the file

 

  lcd.begin(16,2);
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);

  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  

 


void loop()  {
  sd_file = SD.open("data.txt", FILE_WRITE);
  if (sd_file)  {
    senddata();
  }
  // if the file didn't open, print an error:
  else  {
    Serial.println("error opening file");
  }
  delay(1000);  
  
}

 

void senddata()  {
  for(long seconds = 00; seconds < 86400; seconds=seconds+(TIME / 1000))  { 
    float temp = dht.readTemperature(); //Reading the temp as Celsius and storing in temp
    float hum = dht.readHumidity();     //Reading the humidity and storing in hum
    float fah = dht.readTemperature(true);
    float heat_index = dht.computeHeatIndex(fah, hum);

 

//mq135 stuffs
int val;
val=analogRead(3);//Read Gas value from analog 3
//


  // read the value from the photo resistor sensor:
  sensorValue = analogRead(sensorPin);
   

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {

    sd_file.print(seconds);
    sd_file.print(",  ");  
    sd_file.print(hum);
    sd_file.print(",    ");
    sd_file.print(temp);
    sd_file.print(",      ");
    sd_file.print(((heat_index)-32)*(0.5556));
    sd_file.print(",      ");
    sd_file.print(sensorValue);
//write mq 135 ADC value to sd
    sd_file.print(",           ");
    sd_file.print(val,DEC);         //value of attatched sensor (currently mq135)
    
    sd_file.print(",        , , POINT,       ");  //comma seperates a button press into diff columns

    sd_file.print(seconds);
    sd_file.print(",  ");  
    sd_file.print(hum);
    sd_file.print(",    ");
    sd_file.print(temp);
    sd_file.print(",      ");
    sd_file.print(((heat_index)-32)*(0.5556));
    sd_file.print(",      ");
    sd_file.print(sensorValue);
//write mq 135 ADC value to sd
    sd_file.print(",           ");
    sd_file.println(val,DEC);       //value of attatched sensor (currently mq135)


    // write in serial:
    Serial.print(seconds);
    Serial.print(",");
    Serial.println("   POINT recorded");
    
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("POINT recorded");
  lcd.setCursor(0,1);
  lcd.print("s");
  lcd.print(seconds);
  
    delay(TIME);          
  } else {

 

//lcd print stuffs
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("T:");
  lcd.print(temp);
  lcd.print(" ");
//  lcd.print((char)223);
//  lcd.print("C");
//  lcd.setCursor(0,1);
  lcd.print("H:");
  lcd.print(hum);
//  lcd.print(" %");

  lcd.setCursor(0,1);
  lcd.print("s");
  lcd.print(seconds);
  lcd.print("-Pr");
  lcd.print(sensorValue);
  
  lcd.print("-g");      //gas value displayed on lcd
  lcd.print(val,DEC);


//SD card write stuffs
  //  sd_file.print(hours);
  //  sd_file.print(":");
  //  sd_file.print(minutes);
  //  sd_file.print(":");
    sd_file.print(seconds);
    sd_file.print(",  ");
    sd_file.print(hum);
    sd_file.print(",    ");
    sd_file.print(temp);
    sd_file.print(",      ");
 //   sd_file.print(fah);
 //   sd_file.print(",      ");
    sd_file.print(((heat_index)-32)*(0.5556));
    sd_file.print(",      ");
    sd_file.print(sensorValue);

//write mq 135 ADC value to sd
    sd_file.print(",           ");
    sd_file.println(val,DEC);

 

 //   Serial.print(hours);
 //   Serial.print(":");
 //   Serial.print(minutes);
 //   Serial.print(":");
    Serial.print(seconds);
    Serial.print(",  ");
    Serial.print(hum);
    Serial.print(",    ");
    Serial.print(temp);
    Serial.print(",       ");
 //   Serial.print(fah);
 //   Serial.print(",      ");
    Serial.print(((heat_index)-32)*(0.5556));
    Serial.print(",      ");
    Serial.print(sensorValue);

//mq 135 readout
  Serial.print(",           ");
  Serial.println(val,DEC);
    

    if(seconds>=58)  {
      minutes= minutes + 1;
    }

    if (minutes>59)  {
      hours = hours + 1;
      minutes = 0;
    }

    sd_file.flush(); //saving the file

    delay(TIME);      //how long between each measurement
  }
}

  
  sd_file.close();   //closing the file


  
}

bottom of page