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.

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 site. JAMO 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!


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.

Barcelona, Spain


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.

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.



Platanus x hispanica
50,024 - population in Barcelona
Kaulruteria paniculata
885 - population in Barcelona


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
}