Introduction: MOS - Mushroom Stack

About: We are a research, design and foresight company. We translate future uncertainties into present-day choices.

Mitigation of Shock by Superflux: Our website

In Superflux Studio we have chosen to build mushroom stacks as an alternative source of food. From Pink Oyster to blue oyster mushroom the possibilities to grow mushrooms are vast and need a system similar but simpler than our Fogponic system.

Before we begin this guide, there are few recommendations you must know to grow mushrooms properly:

  • Blue and Pink oysters grow well in this following temperature range: 15 - 25°C
  • The mushrooms need first incubation in a dark room
  • After incubation, they need a room with a decent amount of light

Step 1: Building the Stack

Material List:

  • Timber
  • Arduino
  • MEGA 2560 or Arduino UNO
  • Relay Module
  • Fan
  • Led Light
  • Fogger 24V
  • Mushroom tray
  • Transparent boxes
  • Foggers


  1. Build the frame of the incubation and incubation room - We chose a simple timber enough strong to support mushroom trays, which are light.
  2. Install the Led light strips to create an ambient light in the stack.
  3. Place the transparent boxes inside the stack and put the foggers inside them to create a large amount of humidity in the room.
  4. Put the fan on the top of the stack to favorise the production of fresh air.
  5. Connect the fan/foggers/lights to different relay module channel.
  6. Pay attention to separate the foggers wires to the rest because of different voltage:
    • Fan + Lights + Arduino: 12v
    • Foggers: 24v

Step 2: Arduino Installation


#define RELAY_ON 0
#define RELAY_OFF 1 #define RELAY_1 8 //LIGHT #define RELAY_2 9 //FAN #define RELAY_3 10 #define RELAY_4 11 //FOGGERS

int blinkPin = 13;

int ledState = LOW; unsigned long previousMillis = 0; long OnTime = 600000; long OffTime = 600000; int ledPin = 14; int ledPin2 = 12; // the number of the LED pin int ledState2 = HIGH; int ledState3 = LOW; // ledState used to set the LED unsigned long previousMillis2 = 0; // will store last time LED was updated long OnTime2 = 43200000; // milliseconds of on-time long OffTime2 = 43200000;

int ledState6 = LOW; int ledState7 = HIGH;

#include <Time.h> #include <TimeAlarms.h> #include <Wire.h> #include "RTClib.h" #include <SimpleTimer.h> SimpleTimer timer; #include <AccelStepper.h>

//#define BLYNK_PRINT Serial //#include <ESP8266_Lib.h> //#include <BlynkSimpleShieldEsp8266.h> //char auth[] = "21a98b508d804d03822986b711dca2d2"; //char ssid[] = "SHS_M48_2G"; //char pass[] = "M48Studios"; //#define EspSerial Serial1 //#define ESP8266_BAUD 115200 //ESP8266 wifi(&EspSerial);

#include <OneWire.h> #include <SoftwareSerial.h>

SoftwareSerial display(3, 2);

//use digital pin 2

void setup() { pinMode(RELAY_1, OUTPUT); pinMode(RELAY_2, OUTPUT); pinMode(RELAY_3, OUTPUT); pinMode(RELAY_4, OUTPUT); //Initialize relay one as off so that on reset it would be off by default digitalWrite(RELAY_1, RELAY_ON); digitalWrite(RELAY_2, RELAY_OFF); digitalWrite(RELAY_3, RELAY_ON); digitalWrite(RELAY_4, RELAY_ON);

pinMode(blinkPin, OUTPUT); Serial.begin(9600); // delay(10); // EspSerial.begin(ESP8266_BAUD); // delay(10); // Blynk.begin(auth, wifi, ssid, pass); //Set pin as output.

//sensors.begin(); // timer.setInterval(10000L, sendUptime);


void loop() {

unsigned long currentMillis = millis();

if ((ledState == LOW) && (ledState2 == HIGH) && (currentMillis - previousMillis >= OnTime)) { ledState = HIGH; ledState2 = LOW; previousMillis = currentMillis; digitalWrite(ledPin, ledState); digitalWrite(RELAY_2, RELAY_OFF); digitalWrite(RELAY_3, RELAY_OFF); }

else if ((ledState == HIGH) && (ledState2 == LOW) && (currentMillis - previousMillis >= OffTime)) { ledState = LOW; ledState2 = HIGH; previousMillis = currentMillis; digitalWrite(ledPin, ledState); digitalWrite(RELAY_2, RELAY_ON); digitalWrite(RELAY_3, RELAY_ON);


if ((ledState6 == LOW) && (ledState7 == HIGH) && (currentMillis - previousMillis >= OnTime2)) { ledState6 = HIGH; ledState7 = LOW; previousMillis = currentMillis; digitalWrite(blinkPin, ledState); digitalWrite(RELAY_1, RELAY_ON);


else if ((ledState6 == HIGH) && (ledState7 == LOW) && (currentMillis - previousMillis >= OffTime2)) { ledState6 = LOW; ledState7 = HIGH; previousMillis = currentMillis; digitalWrite(blinkPin, ledState); digitalWrite(RELAY_1, RELAY_OFF);