Kinetic façade examples
Mashrabiya
In the past, Islamic architecture used the Mashrabiya to allow natural light while keeping spaces cool. It reduced heat and provided privacy, blending beauty with function.
Today, kinetic architecture takes this further by making building elements move and adapt electronically. This project combines both ideas, allowing the Mashrabiya to open, close, or adjust electronically, responding to light and temperature.
By merging tradition with modern technology, the idea offers a flexible and efficient way to manage light and heat, respecting the past while welcoming the future.
WHY?
I care deeply about this project because it aligns with my passion for sustainable architecture and innovative design. As an architecture student, I am motivated to create solutions that contribute to a more sustainable and energy-efficient future.
Inspiration
inspiration comes from several sources, including:
Nature: Many natural systems, like flowers and leaves, respond dynamically to environmental changes.
Existing Projects: Notable examples such as the Al Bahr Towers in Abu Dhabi, the Media-TIC Building in Barcelona, and the One Ocean Thematic Pavilion showcase the potential and effectiveness of kinetic facades. These projects demonstrate how innovative design can lead to energy savings and enhanced visual appeal.
Fusion360
Cardboard to visualizing the dimensions and mechanism
GrabCAD Library
Started with sketching the movable panel
Extrude
Downloaded the hinge from GrabCAD and Added it
Fixing the servo on the panel
For the Circle, I sketched on the gear plane and projected the gear shape for screws
Extrude
To mount the servo I designed that holder, starting with a sketch taking the dimensions by Project tool from STEP servo file
Extrude
Ready for mounting!
For designing, we usually start by creating a component for each part. Then, we begin with sketching and extruding the sketch to give it shape. Once all the faces are done, we mount the electronic components, make holes for screws, and join all the parts together.
After that, you need to prepare the files for fabrication.
Design Timeline
3D Printing
Ultimaker Cura software
Used for slicing 3D models into layers to prepare them for printing.
PRUSA i3 (3d printer)
A model of 3D printer
PLA filament
A widely used type of plastic filament for 3D printing.
Laser Cutting
Laser cutter software (RDworks)
It is software used for controlling laser engraving and cutting.
PRUSA i3 (3d printer)
A model of laser cutting printer
3mm plywood
Popular material for laser cutting are chosen for its ease of cutting and durability.
Here is Glimpse of fabrication process.
Glimpse of fabrication
For Laser cutter, I transferred the (.DXF) files from my computer to the laser machine using a USB drive. After confirming the cut parameters 'speed and power' and dimensions were on set, I downloaded the files to the machine.
The parameters I used for cut are (speed= 40mm/s & power=45) and for scan are (speed= 250mm/s & power=30)
Next, I fixed the plywood sheet in the machine with small pieces of wood. Then, I adjusted the machine's nozzle to the right corner of the plywood sheet and set the origin. I then pressed 'frame' to ensure everything was aligned correctly.
Once everything was prepared, I pressed 'Start'.
Laser cutting process
3D printing process
After preparing the file and slicing it using Cura, I adjusted the temperature and cooling settings of the machine with the lab specialist. I set the temperature to 215 degrees, the cooling to 60 degrees, and Fan speed to 20. Then, I transferred the file from the computer to the memory card to be inserted into the 3D printer.
Then I selected the file using the turning knob and pressed 'select'. Then, I chose 'start printing' and waited for the first layers to be printed.
I connected the positive terminal to the breadboard’s power rail and the negative terminal to the GND rail.
For the Connections:
**Switches:
- Mode Switch (modepin): Connect to digital pin 4 on the Arduino.
- Power Switch (powerpin): Connect to digital pin 7 on the Arduino.
**LCD Display:
- VCC to 5V on the positive rail
- GND to the common GND
- SDA to A4 on Arduino (for I2C communication).
- SCL to A5 on Arduino (for I2C communication).
**DHT11 Sensor (Temperature and Humidity):
- VCC to 5V on the positive rail
- GND to the common GND
- DATA to Digital Pin 2 on Arduino.
**LDR (Light Dependent Resistor):
- VCC to 5V on the positive rail
- GND to the common GND
- Other end to Analog Pin A2 on Arduino.
**Servos:
- Servo 1 (myservo1):
- Signal Pin to Digital Pin 9 on Arduino.
- VCC to 5V on the positive rail
- GND to the common GND
**Servo 2 (myservo2):
- Signal Pin to Digital Pin 8 on Arduino.
- VCC to 5V on the positive rail
- GND to the common GND
**Potentiometer:
- One end to 5V on Arduino.
- GND to the common GND
- Middle pin to Analog Pin A3 on Arduino.
Components
Circuit
Smart system integration:
Power Source: Supplies power to the Arduino and all components.
Arduino: Collects sensor data, reads switch states, and sends commands to the servos and LCD.
LCD: Displays feedback from the Arduino.
Sensors (DHT11 and LDR): Provide environmental data to the Arduino.
Servos: Move based on commands from the Arduino.
Potentiometer: Provides manual input for servo positioning.
I used an external power source (5V, 5A) to power all components.
I used 9V adaptor to power the Arduino.
I selected a (5V, 5A) power source for my project because the Arduino’s 5V output couldn’t provide enough current for all the components. The higher current rating of the external power source ensured that all components received sufficient power for reliable operation.
Powering
How the Code Works:
*Automatic Mode:
- Reads temperature, humidity, and light level.
- Adjusts the servos based on these readings (e.g., opens or closes panels).
-LCD displays the Temperature, light intensity, and the panels status
*Manual Mode:
- Uses the potentiometer to directly adjust the servo position.
*Power Off:
- If there’s no power, the LCD displays "NO POWER" and the system does nothing.
Flowchart
Programming the Code
For the code, I used text-based coding. I followed the 'baby steps' method, working incrementally to ensure each part of both code and components functioned correctly.
At first, after testing each component, I made 2 separate codes for each Manual mode and automatic mode.
**Manual mode:
for the motion and control, I used the code from examples. (example-> servo -> knob) and made some edits, like adding 2 servos instead of one. Then added the LCD displaying part like the library and the other fuctions
// LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <Servo.h>
Servo myservo1; // create Servo object to control a servo
Servo myservo2;
int potpin = A3; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
void setup() {
Serial.begin (9600);
pinMode(potpin, INPUT);
lcd.begin(16, 2);
// Turn on the backlight
lcd.backlight();
myservo1.attach(9); // attaches the servo on pin 9 to the Servo object
myservo2.attach(8); // attaches the servo on pin 10 to the Servo object
myservo1.write(10);
myservo2.write(10);
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
int val = map(val, 0, 1023, 10, 170); // scale it for use with the servo (value between 0 and 180)
myservo1.write(val);
myservo2.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
lcd.clear(); // Clear the LCD screen
lcd.setCursor(0, 0); // Set cursor to the first row
lcd.print("Pos:");
lcd.print(val);
Serial.print(val);
}
Manual mode code
Codes Combination
I wanted to include two switches: one to turn off the power for the project and another to toggle between auto and manual modes. That’s what the code.
#define powerpin 7 // on and off key
#define modepin 4 // switches between manual and automatic mode
void setup() {
pinMode(powerpin, INPUT); // Fixed missing semicolon
pinMode(modepin, INPUT); // Changed name to switchPin since "switch" is a reserved word
}
void loop() {
if (digitalRead(powerpin) == HIGH) { // Use digitalRead to check the state of the power input
// Your code for when power is ON
if (digitalRead(modepin) == HIGH) { // Check the state of the switchPin (manual/auto mode)
// Code for automatic mode
} else {
// Code for manual mode
}
}
}
Codes Combination
**Automatic mode:
That code felt like solving a puzzle or playing with building blocks, you start with one piece and gradually put everything together.
-So I started with Block-1, Sensors, I started by checking the LDR and DHT functions separately by using the serial monitor.
-Then added Block-2, Servos, I made (one If-Condition function) to check the functionality. Then added more conditions to the loop.
-Then Block-3, Displaying on LCD.
// LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// DHT
#include "DHT.h"
#define DHTPIN 2 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
#define Initial 10
// LDR
int ldrPin = A2; // Pin connected to LDR
// Servos
#include <Servo.h>
Servo myservo1; // create Servo object to control a servo
Servo myservo2;
int val; // variable to read the value from the analog pin
void setup() {
Serial.begin(9600);
// Initialize the LCD with the number of columns and rows
lcd.begin(16, 2);
// Turn on the backlight
lcd.backlight();
// DHT Sensor
Serial.println(F("DHT11 test!"));
dht.begin();
// Servos
myservo1.attach(9); // attaches the servo on pin 9 to the Servo object
myservo2.attach(8); // attaches the servo on pin 8 to the Servo object
myservo1.write(Initial); // initial position for servo
myservo2.write(Initial); // initial position for servo
}
void loop() {
delay(2000); // Wait 2 seconds between measurements
// LDR (Light Intensity)
int ldrValue = analogRead(ldrPin);
float lightLevel = map(ldrValue, 0, 1023, 100, 0); // Convert to a percentage
// DHT (Temperature and Humidity)
float temperature = dht.readTemperature(); // Celsius
float humidity = dht.readHumidity(); // Percentage
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Clear the LCD and display temperature and light level on the first row
lcd.clear(); // Clear the LCD screen
lcd.setCursor(0, 1); // Set cursor to the first row
lcd.print("T:");
lcd.print(temperature);
lcd.print("C L:");
lcd.print(lightLevel);
lcd.print("%");
// Determine the status and control the servos accordingly
String status;
if (lightLevel > 80 && temperature > 20 && humidity > 20) {
myservo1.write(170); // Fully close the servos
myservo2.write(170);
status = "Closed";
} else if (lightLevel > 50 && temperature > 20 && humidity > 20) {
myservo1.write(120); // Half-close the servos
myservo2.write(120);
status = "Partially Open";
} else if (lightLevel < 50 && lightLevel > 20 && temperature > 20 && humidity > 20) {
myservo1.write(50); // Open the servos
myservo2.write(50);
status = "Open";
} else if (lightLevel < 20 && temperature > 20 && humidity > 20) {
myservo1.write(20); // Open the servos
myservo2.write(20);
status = "Open Wide";
} else {
myservo1.write(Initial); // Set servos to initial position
myservo2.write(Initial);
status = "Idle";
}
// Center the status on the second row
int padding = (16 - status.length()) / 2; // Calculate leading spaces to center the text
lcd.setCursor(padding, 0); // Set cursor with leading spaces
lcd.print(status); // Display centered status
// For debugging, also print to Serial Monitor
Serial.print("Temp: ");
Serial.print(temperature);
Serial.print(" C, Light: ");
Serial.print(lightLevel);
Serial.print("%, Status: ");
Serial.println(status);
}
Automatic mode code
After fabricating the components, I began assembling the modules, starting by connecting each panel together to form a single unit. I then attached the servos to each unit. Next, I made the hook-shaped wires responsible for the movement and, after verifying their functionality, securely fixed them to the acrylic sheet. Finally, I integrated the enclosure and mounted all the components in place.
Integrating parts
DEMO video
I asked my instructor for feedback before fabrication, and he commented on the servo holder, as it was weak and would not hold the servo well, so we made some edits on it to be strong enough to hold servos.
One of my peers was struggling with a part of her design, so I helped her create it.
While wiring the components for manual mode, I had a problem where the servos were moving randomly and weren’t stable. I asked my peers for help, and we figured out the issue and fixed it.
Before Edits
After Edits
I always turned to my instructors and Maker Diploma alumni for help.
When deciding the dimensions, I was confused because it seemed so big. I had to pause and visualize it using cardboard before moving on.
In designing, I made some mistakes. The STEP files of some components didn’t match the actual dimensions, which caused problems when mounting them during integration. It's important to double-check the dimensions of everything you use.
If I had more time, I would make the servo move smoothly instead of jumping between positions.
I would also like to add remote monitoring so you could control the panels with your phone.