SPIRA: DIY



Detailed instructions are provided for making a simple microalgae photobioreactor yourself, adaptable to varying degrees of expertise. This reflects the independent design philosophy inherent in the field, making the practice truly accessible to anyone.
DIY - BASIC



MATERIALS
MATERIALS | QUANTITY | PRICE |
---|---|---|
MICROALGAE & NUTRIENTS | 2000 mL | ~€20 |
IV BAG (1L) | 1 | €6 |
USB AQUARIUM PUMP | 1 | €15 |
5µm FILTER | 1 | €12 |
TOT: | €53 |
INSTRUCTIONS
- Remove the cap of the bag from the side with the help of a screwdriver
- Drain the liquid inside and close the bag.
- Cut a hole of about 1 cm at the top of the IV bag.
- Insert the tube with the diffuser inside the bag.
- Pour the nutrients inside using a syringe or funnel.
- Pour in the microalgae.
DIY - ADVANCED

MATERIALS
MATERIALS | QUANTITY | PRICE |
---|---|---|
MICROALGAE & NUTRIENTS | 200 mL | ~€20 |
IV BAGS | 1-5 | €6 |
6V PUMP | 1 | €2 |
AIRSTONES | 1-5 | €2 |
TUBES & VALVES | 4m | €5 |
ARDUINO NANO RP2040 | 1 | €33 |
BREADBOARD + JUMPER | 1 | €8 |
CO2 SENSOR | 1 | ~€20 |
TEMPERATURE SENSOR | 1 | €2 |
5µm FILTER | 1 | €12 |
TOT: | €110 |
INSTRUCTIONS
- Carry out the first 4 steps of the BASIC version.
- Make the electrical connections according to the diagram.
- Open the Arduino IDE app on your PC and open a new Sketch on which to paste the code shared on the SPIRA website.
- Connect the Arduino to your PC and upload the code via the Arduino IoT platform.
- The .STL file for 3D printing the case to house the electronic components is also provided.
APPENDIX - WIRING
APPENDIX - CODING
#include <WiFiNINA.h>
char ssid[] = SECRET_SSID; // Insert your WiFi
namechar pass[] = SECRET_OPTIONAL_PASS; // Insert your WiFi password
// DHT sensor library - Version: 1.4.4
#include <DHT.h>
#include <DHT_U.h>
// Mhz19 - Version: Latest
#include <Mhz19.h>
#include "thingProperties.h"
#define DHTPIN A3 // DHT11 pin
#define DHTTYPE DHT11 // type of DHT11
DHT dht(DHTPIN, DHTTYPE);
Mhz19 sensor1;
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial);
// WiFi
Serial.print("Connecting to ");
Serial.println(ssid);
if (WiFi.begin(ssid, pass) == WL_CONNECTED) { Serial.println("Connected to WiFi!"); printWiFiDetails();
} else {
Serial.println("Failed to connect to WiFi. Check your SSID and password."); }
// Init sensor CO2
sensor1.begin(&Serial1); sensor1.setMeasuringRange(Mhz19MeasuringRange::Ppm_5000);
// Init sensor DHT11
dht.begin();
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud ArduinoCloud.begin(ArduinoIoTPreferredConnection);
// Debug information
setDebugMessageLevel(2); ArduinoCloud.printDebugInfo();
// Preheat sensors
Serial.println("Preheating...");
delay(60000);
// wait 60s to preheat
Serial.println("Ready...");}
void loop() {
ArduinoCloud.update(); // read values every 5s
if (millis() % 5000 == 0) {
readSensors();
}
}
void readSensors() {
// Lettura CO2
int co2_value = sensor1.getCarbonDioxide();
if (co2_value >= 0) {
CO2 = co2_value; // update Variable on Arduino IoT
}
// read Temperature & Humidity
float h = dht.readHumidity();
float t = dht.readTemperature();
// check if values are ok
if (!isnan(h) && !isnan(t)) {
Humidity = h;
Temperature = t;
}
}
void printWiFiDetails() {
// Print IP Address
Serial.print("IP Address: "); Serial.println(WiFi.localIP())
// Print RSSI Signal
Serial.print("Signal strength (RSSI): "); Serial.print(WiFi.RSSI());
Serial.println(" dBm");
}
char ssid[] = SECRET_SSID; // Insert your WiFi
namechar pass[] = SECRET_OPTIONAL_PASS; // Insert your WiFi password
// DHT sensor library - Version: 1.4.4
#include <DHT.h>
#include <DHT_U.h>
// Mhz19 - Version: Latest
#include <Mhz19.h>
#include "thingProperties.h"
#define DHTPIN A3 // DHT11 pin
#define DHTTYPE DHT11 // type of DHT11
DHT dht(DHTPIN, DHTTYPE);
Mhz19 sensor1;
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial);
// WiFi
Serial.print("Connecting to ");
Serial.println(ssid);
if (WiFi.begin(ssid, pass) == WL_CONNECTED) { Serial.println("Connected to WiFi!"); printWiFiDetails();
} else {
Serial.println("Failed to connect to WiFi. Check your SSID and password."); }
// Init sensor CO2
sensor1.begin(&Serial1); sensor1.setMeasuringRange(Mhz19MeasuringRange::Ppm_5000);
// Init sensor DHT11
dht.begin();
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud ArduinoCloud.begin(ArduinoIoTPreferredConnection);
// Debug information
setDebugMessageLevel(2); ArduinoCloud.printDebugInfo();
// Preheat sensors
Serial.println("Preheating...");
delay(60000);
// wait 60s to preheat
Serial.println("Ready...");}
void loop() {
ArduinoCloud.update(); // read values every 5s
if (millis() % 5000 == 0) {
readSensors();
}
}
void readSensors() {
// Lettura CO2
int co2_value = sensor1.getCarbonDioxide();
if (co2_value >= 0) {
CO2 = co2_value; // update Variable on Arduino IoT
}
// read Temperature & Humidity
float h = dht.readHumidity();
float t = dht.readTemperature();
// check if values are ok
if (!isnan(h) && !isnan(t)) {
Humidity = h;
Temperature = t;
}
}
void printWiFiDetails() {
// Print IP Address
Serial.print("IP Address: "); Serial.println(WiFi.localIP())
// Print RSSI Signal
Serial.print("Signal strength (RSSI): "); Serial.print(WiFi.RSSI());
Serial.println(" dBm");
}