The aim is to create a compact, transportable structure that can be installed in different places, making it possible to produce mushrooms while turning resources considered waste into value.

The project follows a circular economy approach, focused on sustainability and waste reduction. Oyster mushrooms can be grown on various organic substrates, including certain agricultural and textile waste.

We chose oyster mushrooms because they are easy to grow and grow quickly. They can be used as food and are rich in nutrients. They can also grow on different types of organic waste, giving new life to materials that would otherwise be thrown away. Finally, they can be grown in small spaces, making them a good choice for our mobile and self-sufficient pavilion.



To guarantee optimal growing conditions, the pavilion is designed to keep the humidity level between 80% and 90%. To do this, a humidity sensor is used that continuously monitors the indoor conditions and automatically controls the opening and closing of the windows:

  • When humidity exceeds 90%, the windows open automatically to 30° to allow ventilation and reduce excess humidity.
  • When humidity becomes too low, the windows close to retain moisture inside the pavilion.

The structure has an A-shaped form. This geometry organizes the growing spaces on several levels, while ensuring that each floor receives enough indirect light. The shape also makes the most of the available space in a compact structure.

The upper part is used first to shield the mushrooms from the direct sunlight but it also collects rainwater so it can be reused to maintain the humidity conditions needed for growing.

The pavilion includes a water tank located in its upper part, which stores the water collected by the rainwater harvesting system. The tank is fitted with a water level sensor that monitors the amount of water available. When the tank is empty or the level becomes too low, an audible alarm goes off to warn users that it needs to be refilled.

This system ensures that a water reserve is always available to maintain a humidity level suited to mushroom growth.

#include “Servo.h”

#include <Wire.h>

#include “DHT20.h”

DHT20 DHT;

Servo Servo1;

Servo Servo2;

// Servo motor 1

int servoPin1 = 6;

int startingAngle = 0;

int targetAngle = 0;

// Servo motor 2

int servoPin2 = 2;

// Servo motor speed because it was too fast

int servoSpeed = 20;

unsigned long servoTime = 0;

// Water level sensor

int waterSensor = A0;

int waterValue = 0;

// Buzzer

int buzzer = 5;

// Alarm

int melody[] = {262, 330, 392, 523};

int noteDurations[] = {200, 200, 200, 400};

// Melody

int currentNote = 0;

unsigned long noteTime = 0;

bool melodyPlaying = false;

void setup() {

  Serial.begin(115200);

  Wire.begin();

  DHT.begin();

  Servo1.attach(servoPin1);

  Servo1.write(startingAngle);

  Servo2.attach(servoPin2);

  Servo2.write(180 – startingAngle);

  pinMode(buzzer, OUTPUT);

}

void loop() {

  // humidity

  DHT.read();

  float humidity = DHT.getHumidity();

  // change the position of the windows

  if (humidity < 80) {

    targetAngle = 30;

  }

  else if (humidity > 90) {

    targetAngle = 0;

  }

  // to change the speed of the oppening windows

  if (millis() – servoTime >= servoSpeed) {

    servoTime = millis();

    if (startingAngle < targetAngle) {

      startingAngle++;

    }

    else if (startingAngle > targetAngle) {

      startingAngle–;

    }

  // to change the direction of rotation of the too servo

    Servo1.write(startingAngle);

    Servo2.write(180 – startingAngle);

  }

  // Write value on the serial monitor

  waterValue = analogRead(waterSensor);

  Serial.print(“Humidity: “);

  Serial.println(humidity);

  Serial.print(“Water level: “);

  Serial.println(waterValue);

  // Start alarm melody if the water reservoir is empty

  if (waterValue == 0 && !melodyPlaying) {

    melodyPlaying = true;

    currentNote = 0;

    noteTime = millis();

    tone(buzzer, melody[currentNote]);

  }

  // Play alarm

  if (melodyPlaying) {

    if (millis() – noteTime >= noteDurations[currentNote]) {

      currentNote++;

      if (currentNote < 4) {

        noteTime = millis();

        tone(buzzer, melody[currentNote]);

      }

      else {

        noTone(buzzer);

        melodyPlaying = false;

      }

    }

  }

  // Stop alarm when water is detected

  if (waterValue != 0) {

    noTone(buzzer);

    melodyPlaying = false;

  }

}