THE CHALLENGE

In contemporary shared environments, the relationship between openness and privacy is constantly shifting. While open spaces encourage interaction and collaboration, they also introduce challenges related to noise, distraction, and personal comfort. Traditional architectural partitions often remain static, unable to respond to changing environmental conditions.

H U S H challenges this limitation by exploring how architecture can sense its surroundings and physically adapt to them.

CONCEPT

| From Sound To Movement |

H U S H is a sound responsive kinetic screen. It responds to the acoustic conditions of its surrounding environment, transforming sound into physical movement.

Designed to create a more adaptable and comfortable workspace, the system uses a sound sensor to detect changes in ambient noise levels. Rather than reacting instantly to every fluctuation, H U S H responds only when a certain sound level is sustained for a period of time, preventing unnecessary movement and creating a more stable and intentional response.

As noise remains present over time, the panels gradually close, creating a visual and spatial barrier between the user and their surroundings. When the environment becomes quieter again, the panels reopen, restoring openness and connectivity.

Through this responsive behavior, H U S H explores how architecture can actively adapt to environmental stimuli, transforming a static partition into a dynamic interface between privacy, interaction, and spatial comfort.

SCHEMATIC DESIGN & BOM
CODE
  • #include <Servo.h>
  • Servo servos[5];
  • int pins[5] = {2, 3, 4, 5, 6};
  • int speed = 20;
  • int offset = 30;
  • // Sound
  • int soundPin = A2;
  • unsigned long soundDelay = 5000;
  • int filteredSound = -1;
  • // Target positions
  • int positions[3][5] = {
  •   {0, 0, 0, 0, 0},
  •   {90, 60, 30, 0, 0},
  •   {90, 90, 90, 90, 90}
  • };
  • int angles[5] = {0, 0, 0, 0, 0};
  • // State
  • int state = 0;
  • int soundState = -1;
  • unsigned long soundStart = 0;
  • void setup() {
  •   Serial.begin(9600);
  •   for (int i = 0; i < 5; i++) {
  •     servos[i].write(0);
  •     servos[i].attach(pins[i]);
  •   }
  • }
  • void loop() {
  •   // Measure sound
  •   int minimum = 1023;
  •   int maximum = 0;
  •   unsigned long startTime = millis();
  •   while (millis() – startTime < 50) {
  •     int reading = analogRead(soundPin);
  •     if (reading < minimum) minimum = reading;
  •     if (reading > maximum) maximum = reading;
  •   }
  •   int soundLevel = maximum – minimum;
  •   // Smooth sound readings
  •   if (filteredSound < 0) {
  •     filteredSound = soundLevel;
  •   } else {
  •     filteredSound = (filteredSound * 4 + soundLevel) / 5;
  •   }
  •   // Determine sound state
  •   int newState;
  •   if (filteredSound < 300) {
  •     newState = 0;
  •   } else if (filteredSound <= 600) {
  •     newState = 1;
  •   } else {
  •     newState = 2;
  •   }
  •   // Serial Monitor
  •   Serial.print(“Sound: “);
  •   Serial.print(soundLevel);
  •   Serial.print(” | Filtered: “);
  •   Serial.print(filteredSound);
  •   Serial.print(” | Current state: “);
  •   Serial.print(state);
  •   Serial.print(” | Target state: “);
  •   Serial.println(newState);
  •   delay(50);
  •   // Count 5 seconds
  •   if (newState != soundState) {
  •     soundState = newState;
  •     soundStart = millis();
  •   }
  •   // Start movement after 5 seconds
  •   if (millis() – soundStart >= soundDelay &&
  •       newState != state) {
  •     bool forward = newState > state;
  •     rotateWave(newState, forward);
  •     state = newState;
  •   }
  • }
  • // Overlapping wave rotation
  • void rotateWave(int newState, bool forward) {
  •   int starts[5] = {0, 0, 0, 0, 0};
  •   int count = 0;
  •   int lastStep = 0;
  •   for (int k = 0; k < 5; k++) {
  •     int i = forward ? k : 4 – k;
  •     int distance = abs(positions[newState][i] – angles[i]);
  •     if (distance > 0) {
  •       starts[i] = count * offset;
  •       lastStep = max(lastStep, starts[i] + distance);
  •       count++;
  •     }
  •   }
  •   for (int step = 0; step <= lastStep; step++) {
  •     for (int i = 0; i < 5; i++) {
  •       int difference = positions[newState][i] – angles[i];
  •       int movement = constrain(
  •         step – starts[i], 0, abs(difference)
  •       );
  •       int angle = angles[i];
  •       if (difference >= 0) {
  •         angle += movement;
  •       } else {
  •         angle -= movement;
  •       }
  •       servos[i].write(angle);
  •     }
  •     delay(speed);
  •   }
  •   for (int i = 0; i < 5; i++) {
  •     angles[i] = positions[newState][i];
  •   }
  • }

FUTURE DEVELOPMENT

H U S H currently achieves gradual, overlapping panel movements, creating a wave-like transition between different levels of enclosure.

Future development aims to introduce directional sound detection, allowing individual panels to respond according to where noise originates rather than relying solely on overall sound intensity. This would enable more localized and adaptive privacy.

Further exploration of acoustic materials and sound attenuation could enhance the screen’s performance, transforming  H U S H   from a kinetic visual barrier into a more intelligent architectural system that responds to both the intensity and direction of sound.

PROCESS DOCUMENTATION
H U S H | VIDEO