Final project
A DESIGN FOR PEOPLE, BY PEOPLE¶
STARTING POINT¶
Among human needs, communication and social interaction are very important. Urban spaces are places for citizens and their participation in public life. The urban furniture and elements acts as devices that are installed in urban space and have public use. It can be considered as a constructive approach to sustainable urban development, with the goal of improving the quality of urban space and human needs. A proper design of urban furniture is important as an effective factor in improving the quality of urban environment.
CONCEPT¶
A Design for people, by people is a living, thinking surface treatment that adaptively responds to user demand and human interaction. It acts as an interlockable modular furniture with sensory recognition. These modules facilitate modular street furniture for social interaction, recreational zones, street markets and exhibitions for cultural expression or commuter traffic during peak periods. As it can work as individual furniture piece (bench/planter) or in groups forming small outside spaces (park/Baraha).
The design establishes Connectivity between the human behavior and the object. Where when people interact with the structure (sit) it lights up from the human energy. And because Color provokes and inspires, and more often than not, leads to emotional reactions. You can control the color of the light based on the energy you want to stimuli. Hence, leading to impacting our mood in different ways. The design targets both social and environmental sustainability initiatives. Where the structure is not only integrated with planters. But also, measures the level of water in them and reflect it by pulsing where it creates the responsibility of the humans to interact with the plants and water them.
MAKING The Final Project:¶
to make the final project, we are asked to:
2D and 3D design
additive and subtractive fabrication processes
microcontroller programming and use of input & output devices
system integration and packaging
Materials¶
Qty | Description |
---|---|
6 | MDF 11mm thick |
2 | Transparent 3mm acrylic |
1 | Transparent 6mm acrylic |
1 | white 3mm acrylic |
1 | PLA Filament |
1 | wires |
2 | microcontroller |
1 | relay |
1 | moisture sensor |
1 | limit switch |
1 | plant |
1 | Addressable LED’S |
1 | Normal pink LED’S |
3 | push buttons |
4 | Springs |
SO, LETSS MAKE ITTT
2D AND 3D DESIGN¶
for this part, I’m designing an urban bench by the CNC machine that will allow people to sit around, play, work etc. So to design the modular furniture. I started first by making it in fusion as a 3d model to make sure all can be connected.
After doing it in fusion, I took the design to AutoCAD to fix and adjust the errors and send it to be cut.
note: You can go back to week 2 to see how to design with fusion and autocad
For the color changing, I wanted to add LED Pushbuttons buttons, so I 3D modeled a button and 3D print it
===============================================================
Design Files¶
Here is the design files to download
===============================================================
SUBTRACTIVE FABRICATION¶
CNC
Following the same methods as in week 05, I was able to cut the pieces on MDF by CNC machine.
Sanding
LASER CUTTING
For the plantation space, I created a transparent enclosure via acrylic. I used laser cutting machine to achieve that.
FINISHES
For the base of the planter area, I wanted to make it more detailed, So I added the concept statement to it and it gave it an amazing touch with the lights.
I also wanted to defuse the light at the bottom of the bench, so I thought of taking acrylic and sand it to make it opaque. So I cut the pieces by laser cutting and sand it. But I did not like the final outcome as it did not defuse the lights well. So I went back and cut white acrylic and it turned out nice.
The design with white acrylic
===============================================================
Design Files¶
Here is the design files to download
===============================================================
Electronics¶
In the electronics part, I am going to explain the process of designing my final interactive furniture and all the electronic components that I decided to use to make the system.
List input and output devices¶
Input devices :
Limit switch
PUSH Buttons
Moisture sensor
Output devices :
pink LED’S for the plant
Addressable LED’S for the base of the furniture
relay Used for the plant space to make the lights blink
Input and output concept¶
The Idea is to have the limit switch on the base of the furniture. So when it is switched by sitting, it will activate the addressable LED’s down. Then, we have 3 options for light colors to be selected while the light is still activated by the limit switch by pressing the three push buttons, Or we can leave the color the same without using the push button.
The second part of the design is the plantation area. Where it will contain moisture sensor to measure the level of water in it. And if the level of water is lower that what indicated in the program, the LED lights in the plantation area will blink every 4 times every 5 minutes, using the relay.
Programing¶
ARDUINO
I used all the knowledge I gained from Week07 and week 08 to create a whole system for the project by arduino nano microcontroller.
1- The first system /Limit switch, push buttons and addressable LED’S
Here, I was testing the connections and the programing with a small strip of Addressable LED’S. So what I did is I connected the limit switch to pin 2, addressable LED to pin 6, while the push buttons for red color is 3, blue color is 4 and white color is 5.
I downloaded the neo pixel library for coding and inspired from it to create my own code.
The code
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
// int all inputs
const int sitBtn = 2;
const int redBtn = 3;
const int blueBtn = 4;
const int whiteBtn = 5;
const int ledPin = 6;
int sitbtnState = 0;
int redbtnState = 0;
int bluebtnState = 0;
int whitebtnState = 0;
int ledcolor = 3;
int r1 = 255;
int r2 = 0;
int r3 = r2;
int b1 = 0;
int b2 = b2;
int b3 = 255;
int w1 = 250;
int w2 = 100;
int w3 = 110;
// How many NeoPixels are attached to the Arduino?
int numPixels = 290; // Popular NeoPixel ring size
// NeoPixel color format & data rate. See the strandtest example for
// information on possible values.
int pixelFormat = NEO_GRB + NEO_KHZ800;
Adafruit_NeoPixel *pixels;
#define DELAYVAL 5 // Time (in milliseconds) to pause between pixels
void setup() {
// put your setup code here, to run once:
pinMode(sitBtn, INPUT_PULLUP);
pinMode(redBtn, INPUT_PULLUP);
pinMode(blueBtn, INPUT_PULLUP);
pinMode(whiteBtn, INPUT_PULLUP);
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
// Then create a new NeoPixel object dynamically with these values:
pixels = new Adafruit_NeoPixel(numPixels, ledPin, pixelFormat);
pixels->begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
// You'll see more of this in the loop() function below.
pixels->clear(); // Set all pixel colors to 'off'
}
void loop() {
int sitbtnState = digitalRead(sitBtn);
if (sitbtnState == LOW) {
delay(5);
for(int i=0; i<numPixels; i++) { // For each pixel...
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(w1,w2,w3));
delay(50);
pixels->show();}
delay(1);
// ============================================================================
while(sitbtnState == LOW) {
sitbtnState = digitalRead(sitBtn);
int redbtnState = digitalRead(redBtn);
int bluebtnState = digitalRead(blueBtn);
int whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// ================================================================================
if(ledcolor == 1) {
for(int i=0; i<numPixels; i++) { // For each pixel...
pixels->setPixelColor(i, pixels->Color(255,0,0));
}
pixels->show();
delay(100);
for (int r2= 0; r2< 30; r2++) {
for(int i=0; i<numPixels; i++) { // For each pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(r1,r2,r3));
}
delay(25);
pixels->show(); // Send the updated pixel colors to the hardware.
// ===========================================
}
for (int r2= 30; r2 > 0; r2--) {
for(int i=0; i<numPixels; i++) { // For each pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(r1,r2,r3));
}
delay(25);
pixels->show(); // Send the updated pixel colors to the hardware.
// ===========================================
}
}
if(ledcolor == 2) {
for(int i=0; i<numPixels; i++) { // For each pixel...
pixels->setPixelColor(i, pixels->Color(0,0,255));
}
pixels->show();
delay(100);
for (int b1= 0; b1< 30; b1++) {
for(int i=0; i<numPixels; i++) { // For each pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(b1,b2,b3));
}
delay(50);
pixels->show(); // Send the updated pixel colors to the hardware.
// ===========================================
}
for (int b1= 30; b1>0; b1--) {
for(int i=0; i<numPixels; i++) { // For each pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(b1,b2,b3));
}
delay(50);
pixels->show(); // Send the updated pixel colors to the hardware.
// ===========================================
}
}
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
if(ledcolor == 3) {
for(int i=0; i<numPixels; i++) { // For each pixel...
pixels->setPixelColor(i, pixels->Color(w1,w2,w3));
}
pixels->show();
for (int w3= 100; w3 > 30; w3--) {
sitbtnState = digitalRead(sitBtn);
for(int i=0; i<numPixels; i++) { // For each pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(w1,w2,w3));
delay(0.1);
}
pixels->show(); // Send the updated pixel colors to the hardware.
// ===========================================
}
for (int w3= 30; w3 <100; w3++) {
for(int i=0; i<numPixels; i++) { // For each- pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
pixels->setPixelColor(i, pixels->Color(w1,w2,w3));
delay(0.1);
}
pixels->show(); // Send the updated pixel colors to the hardware.
// ===========================================
}
}
}
}
else {
for(int i=numPixels; i>=0; i--) { // For each pixel...
sitbtnState = digitalRead(sitBtn);
redbtnState = digitalRead(redBtn);
bluebtnState = digitalRead(blueBtn);
whitebtnState = digitalRead(whiteBtn);
if(redbtnState == LOW) {
ledcolor = 1;
}
if(bluebtnState == LOW) {
ledcolor = 2;
}
if(whitebtnState == LOW) {
ledcolor = 3;
}
// pixels->Color() takes RGB values, from 0,0,0 up to 255,255,255
// Here we're using a moderately bright green color:
pixels->setPixelColor(i, pixels->Color(0,0,0));
delay(20);
pixels->show();
}
ledcolor = 3;
}
}
When everything was working right, We soldered the longer strip of the addressable LED’S to wires in order to connect it to the Arduino.
Checking again if the soldering is good and the lights working according to the program.
FINALLY, ITS WORKING!
2- The second system / Moisture sensor, LED’S and relay
Basically, The moisture sensor is programmed to be limited to a value of 290. If the moisture inside the soil is less than 290. It will send a signal to the relay. Thus, the relay will switch the light on and off to create a blinking effect by the LED light associated in the plantation area.
The code
int sensorPin = A0;
int sensorValue;
int limit = 290;
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
}
void loop() {
sensorValue = analogRead(sensorPin);
Serial.println("Analog Value : ");
Serial.println(sensorValue);
if (sensorValue<limit) {
digitalWrite(8, LOW);
digitalWrite(3, HIGH);
}
else {
digitalWrite(3, LOW);
digitalWrite(8, HIGH);
}
delay(1000);
}
Final stage Assembly and adjustments¶
To find a solution to how the limit switch will be clicked when a person sits anywhere on the bench. We thought of having another piece of wood on top the actual one. In which the limit switch will be in between the two pieces of wood and when someone will sit, the upper piece will click the limit switch. This is by creating a hole in the middle on the lower wooden piece and stick half of the limit switch in between the two parts creating a small gap in the middle.
We used springs to hold the upper wood slightly up so when someone sits, it the wood will move down and will click the limit switch.
So We test it out, and it was a fail as the distance between the limit switch and the upper wood is high.
As a solution, we pushed the limit switch more to up in order for the upper wood to click it. And It worked!!! FINALLY
We drilled three holes in the upper wood to pass the push buttons and then add the 3d printed buttons caps on them.
How it looks from down. All wires will be glued to the lower face of the structure later.
The connections
The Product, YAS!¶
This is when no one is interacting with the structure.
Sitting but no source of power// HAPPY MAMA
AND THIS IS WHEN IT IS ACTIVATED!!!
AKNOWLEDGMENT¶
On this day, The journey of Fab Academy has come to an end!
thanks to all the people who helped me in completing this project!
1- Rashid, for all the crazy electronic mess, programing headaches and his time.
2- Abdulla, for all the problem fixing, long discussions, trials and errors.
3- abdulghafoor, for all the awesome Ideas and development of the project.
4- Mohammed, for all the hard work and help in assembling the whole project.
5- Duaa, for the knowledge that has been gained from her that led me to do all these stuff.
6- Ameena, For our race against time, talks, enjoyable moments that made the whole process worth it.
YOU ALL MADE THE JOURNEY EXTRA-ORDINARY! THANK YOU.