Mitigation of Shock

by Superflux in Workshop > Hydroponics

6212 Views, 49 Favorites, 0 Comments

Mitigation of Shock

DSC04540w.jpg
38w.jpg

Mitigation of Shock by Superflux: Our website

Mitigation of Shock’ endeavours to design responses to near future first world disasters, by prototyping alternatives today.

As the promise of climate change comes into season, and the fruits of its harvest ripen: It will soon overrun the world we have grown to expect. The days of supermarket shelves filled with all the food you could want, from around the world, all year round, so cheap that you can buy two for one and throw one away, will soon be over.

Predictions and anticipatory warnings from climate researchers, data scientists and economists collide with the lifestyles of access and abundance we have grown to take for granted. The disconnect between scientific and data-driven predictions of global warming, and the lack of immediately visible signs keeps us in a state of collective cognitive dissonance, while we blindly work to manifest the worst of those predictions. We want to stop climate change, but we still drive everywhere, waste food, and leave the lights on. The implications of our contradictory behaviour are unsettling and ominous.

But we still have the capability to seize what opportunities remain, to confront our fears, and use the impetus to change, experiment, and find creative ways to respond to the approaching impact of climate change. Because as Milton Friedman once said: “Only a crisis - actual or perceived - produces real change.”

The future will not be marked exclusively by the crisis of climate change. Coexistent trends and emergent forces will simultaneously work to shape our futures. Mitigation of Shock aims to understand not just the impending challenges but also their potential solutions. It investigates what skills and resources might be most readily available in this near future and puts them to work.

The project transports you into a London flat, thirty five years in the future. A future where extreme weather has caused global supply chains to falter. Everyday items are often either out of stock or have become expensive luxuries. In response, living space has been increasingly given over to experimental forms of domestic agriculture. Food computers have been improvised from the detritus of a technological utopia that never quite arrived.

Local networks of barter and trade have grown in the space once filled by global capital. Self selected networks of trust and cooperation compete with the rule of law. Self reliance and ingenuity fill the void left by the collapse of the paradigm of consumption. Both familiar and alien, the space gives a rich experiential insight into some of the challenges we could all soon face, and the solutions we might employ to mitigate and overcome them.

Building the Modules Frame

superflux_mitigationofshock_components-01.jpg
superflux_mitigationofshock_module frame-01.jpg
Capture d’écran 2017-11-21 à 14.05.45.png
Capture d’écran 2017-11-21 à 14.28.03.png
Capture d’écran 2017-11-21 à 14.34.40.png

This Instructables provides examples and advices on how to build your own Mitigation of Shock prototype. The purpose of it is to define some basic models with the same grid system.

Depending on the space available in your room, we made samples that are flexible and you can add a unit as much as you want.

We developed our prototypes with the materials near us, the list of elements presented in the document is not exhaustive and can be personalized depending on your motivation.

---


Minimum material list:


Building instructions:

  1. Drill the lid of the grow boxes in order to install the hydroponic pots. You will also need to drill holes for the piping system (fig.2)
  2. Build the shelf of your choice - For MOS we used the IKEA Hyllis shelf model. Drill holes in the middle of the shelf in order to put a grid system for your vegetables to stabilize them when they grow.
  3. In one of the shelves, we called the "Main Head", you can set up the water tank and fogger box (fig.1). But also, the fan box which will be used to create wind in the foggers box and generate the circulation of fog in the greenhouses.
  4. Drill holes for the piping system of the fogger box (fig.3)
  5. You can pre-install the junction boxes behind your shelves without the electrical system. (fig.4)


Vegetable recommendation:

ARDUINO INSTALLATION: the Main Head

main head module _bb.png

Material List:

  • Arduino Mega 2560
  • Fan 12v (PWM)
  • 4 channel relay module
  • LCD screen 16x2
  • DHT-11 (temperature+humidity sensor)
  • x2 Peristaltic pump (12v)
  • Water pump (12v)
  • ESP 8266-12 (Facultative)


Arduino Code:

#include LiquidCrystal.h
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5

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

#define SensorPin A2 #define Offset 0.00 #define LED 13 #define samplingInterval 20 #define printInterval 5000 #define printIntervaloff 5000 #define ArrayLenth 40 int pHArray[ArrayLenth]; int pHArrayIndex = 0;

#define Water_Level_Sensor 2 int buttonState = 1;

int chk; float hum; float temp; float voltagee; float voltage; float pHValue;

#define RELAY1 2 #define RELAY2 3 #define RELAY3 24 #define RELAY4 25

int ledPinn = 10;

//#define BLYNK_PRINT Serial //#include <ESP8266_Lib.h> //#include <BlynkSimpleShield8266.h> //char auth[] = "authentication"; //char ssid[] = "Network Name"; //char pass[] = "Network Password"; //#define EspSerial Serial1 //#define ESP8266_BAUD 115200 //ESP8266 wifi(&EspSerial);

int trig = 10; int echo = 11; //int DS18S20_Pin = 52; //char tmpstring[10]; int t, h, hp;

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

int DS18S20_Pin = 10; char tmpstring[10];

OneWire ds(DS18S20_Pin);

SoftwareSerial display(3, 2);

int ledPin1 = 12; int ledState1 = LOW; unsigned long previousMillis1 = 0; long OnTime1 = 10000; long OffTime1 = 1000; int ledPin2 = 13; int ledState2 = LOW; unsigned long previousMillis2 = 0; long OnTime2 = 300000; long OffTime2 = 400;

int read_LCD_buttons() { adc_key_in = analogRead(0); if (adc_key_in > 1000) return btnNONE; if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 250) return btnUP; if (adc_key_in < 450) return btnDOWN; if (adc_key_in < 650) return btnLEFT; if (adc_key_in < 850) return btnSELECT; return btnNONE; }

void setup() { Serial.begin(9600); lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("MAIN MODULE"); pinMode(Water_Level_Sensor, INPUT); pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); digitalWrite(RELAY1, 0); digitalWrite(RELAY2, 0); // EspSerial.begin(ESP8266_BAUD); // Blynk.begin(auth, wifi, ssid, pass); // timer.setInterval(10000L, sendUptime); }

//void sendUptime() //{ //Blynk.virtualWrite(V5,ledPinn); // Blynk.virtualWrite(V10, pHValue); // Blynk.virtualWrite(V11, voltage); // Blynk.virtualWrite(24, hp); // Blynk.virtualWrite(V1, DHT.temperature); // Blynk.virtualWrite(V2, DHT.humidity); // Blynk.virtualWrite(23, m); //}

void loop() { Serial.print("hey"); unsigned long currentMillis = millis(); if((ledState1 == HIGH) && (ledState2 == HIGH) && (currentMillis - previousMillis1 >= OnTime1)) { ledState1 = HIGH; ledState2 = LOW; previousMillis1 = currentMillis; previousMillis2 = currentMillis; digitalWrite(ledPin1, ledState1); analogWrite(ledPinn, 100); lcd.setCursor(0, 2); lcd.print("fan speed: "); lcd.print(70); {for (int fadeValue = 65 ; fadeValue <= 70; fadeValue += 5) { analogWrite(ledPinn, fadeValue); lcd.setCursor(0, 2); lcd.print("fan speed: "); lcd.print(fadeValue); delay(1000); } } }

else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1)) { ledState1 = HIGH; ledState2 = HIGH; previousMillis1 = currentMillis; previousMillis2 = currentMillis; digitalWrite(ledPin1, ledState1); analogWrite(ledPinn, 50); lcd.setCursor(0, 2); lcd.print("fan speed: "); lcd.print(50); }

if((ledState1 == HIGH) && (ledState2 == LOW) && (currentMillis - previousMillis1 >= OnTime2)) { ledState1 = HIGH; ledState2 = HIGH; previousMillis1 = currentMillis; previousMillis2 = currentMillis; {for (int fadeValue = 250 ; fadeValue <= 255; fadeValue += 5) { analogWrite(ledPinn, fadeValue); lcd.setCursor(0, 2); lcd.print("fan speed: "); lcd.print(fadeValue); delay(1000); } } digitalWrite(ledPin1, ledState1); // analogWrite(ledPinn, 255); // lcd.setCursor(0, 2); // lcd.print("fan speed: "); // lcd.print(255); } // //for (int fadeValue = 100 ; fadeValue <= 110; fadeValue += 10) { //analogWrite(ledPinn, fadeValue); //lcd.setCursor(0, 2); //lcd.print("fan speed: "); //lcd.print(fadeValue); //delay(300000); // //} // //for (int fadeValue = 110 ; fadeValue <= 255; fadeValue += 145) { //analogWrite(ledPinn, fadeValue); //lcd.setCursor(0, 2); //lcd.print("fan speed: "); //lcd.print(fadeValue); //delay(10000); //} // //for (int fadeValue = 255 ; fadeValue >= 100; fadeValue -= 155) { //analogWrite(ledPinn, fadeValue); //lcd.setCursor(0, 2); //lcd.print("fan speed: "); //lcd.print(fadeValue); //delay(1000); //}

//Blynk.run();

timer.run();

lcd_key = read_LCD_buttons(); switch (lcd_key) { case btnRIGHT: {

for (int fadeValue = 100 ; fadeValue <= 255; fadeValue += 5) {

analogWrite(ledPinn, fadeValue); lcd.setCursor(11, 2); lcd.print(fadeValue ); lcd.print(" "); delay(500); }

break; } case btnLEFT: {

for (int fadeValue = 100 ; fadeValue >= 0; fadeValue -= 5) { analogWrite(ledPinn, fadeValue); lcd.setCursor(11, 2); lcd.print(fadeValue ); lcd.print(" ");

delay(500); } break; } case btnUP: { lcd.setCursor(12, 2); // lcd.print("UP2LED"); delay(1000); break; } case btnDOWN: { lcd.setCursor(12, 2); //lcd.print("DOWN IHOIHOIH "); delay(1000); break; } case btnSELECT: { lcd.setCursor(12, 2); //lcd.print("SELECT"); delay(1000); break; } case btnNONE: { lcd.setCursor(12, 2); // lcd.print("NONE "); delay(1000); break; }

}

// for (int fadeValue = 70 ; fadeValue <= 70; fadeValue += 5) { // analogWrite(ledPinn, fadeValue); // delay(10); // }

/////////pH Sensor/////////

/ static unsigned long samplingTime = millis(); // static unsigned long printTime = millis(); // static float pHValue, voltage; // if (millis() - samplingTime > samplingInterval) // { // pHArray[pHArrayIndex++] = analogRead(SensorPin); // if (pHArrayIndex == ArrayLenth)pHArrayIndex = 0; // voltage = avergearray(pHArray, ArrayLenth) * 5.0 / 1024; // pHValue = 3.5 * voltage + Offset; // samplingTime = millis(); // } // if (millis() - printTime > printInterval) //Every 800 milliseconds, print a numerical, convert the state of the LED indicator // { // lcd.setCursor(0, 1); // lcd.print("pH:"); // lcd.print(pHValue, 2); // lcd.print(" Volt:"); // lcd.print(voltage, 2); // lcd.setCursor(4, 0); // t = pulseIn(echo, HIGH); // h = t / 45; // h = h - 10; // h = 45 - h; // hp = 10; // lcd.print("w lvl:"); // lcd.print(hp); // lcd.print("%"); // digitalWrite(LED, digitalRead(LED) ^ 1); // printTime = millis(); // // buttonState = digitalRead(Water_Level_Sensor); // // if (buttonState == HIGH) { Serial.println( "WATER LEVEL - LOW"); // //} // //else { // //Serial.println( "WATER LEVEL - HIGH" ); // //} // } //} // // //double avergearray(int* arr, int number) { // int i; // int max, min; // double avg; // long amount = 0; // if (number <= 0) { // Serial.println("Error number for the array to avraging!/n"); // return 0; // } // if (number < 5) { //less than 5, calculated directly statistics // for (i = 0; i < number; i++) { // amount += arr[i]; // } // avg = amount / number; // return avg; // } else { // if (arr[0] < arr[1]) { // min = arr[0]; max = arr[1]; // } // else { // min = arr[1]; max = arr[0]; // } // for (i = 2; i < number; i++) { // if (arr[i] < min) { // amount += min; //arr max) { // amount += max; //arr>max // max = arr[i]; // } else { // amount += arr[i]; //min<=arr<=max // } // }//if // }//for // avg = (double)amount / (number - 2); // }//if // return avg;

}

ARDUINO INSTALLATION: Modules

side module.png

Material List:

  • Arduino MEGA 2560 or Arduino UNO
  • DHT-11
  • YL-609
  • LCD Screen 16x2

Code:

#include LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
#include <Time.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include "RTClib.h"
#include <SimpleTimer.h>
SimpleTimer timer;
#include <AccelStepper.h>
#define SensorPin A11
#define Offset 0.00
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40
int pHArray[ArrayLenth];
int pHArrayIndex = 0;
int ledPin =  13;
int ledState = LOW;
unsigned long previousMillis = 0;
long OnTime = 57600000;
long OffTime = 28800000;
int ledPin2 =  12;     
int ledState2 = HIGH;
int ledState3 = LOW;
unsigned long previousMillis2 = 0;      
long OnTime2 = 330;         
long OffTime2 = 400;
int ledState6 = LOW;
int ledState7 = HIGH;
int chk;
float hum;
float temp;
float voltagee;
float voltage;
float pHValue;
#include 
#include 
dht11 DHT;
#define DHT11_PIN A8
byte humidity_sensor_pin = A9;
#define Humidity A10
int m, mRaw;
#define RELAY1  22
#define RELAY2  23
//#define BLYNK_PRINT Serial
//#include Blynk_Print Serial 1
//#include 
//char auth[] = "Your Blynk authentication";
//char ssid[] = "Network SSID";
//char pass[] = "Network Passeword";
//#define EspSerial Serial1
//#define ESP8266_BAUD 115200
//ESP8266 wifi(&EspSerial);
int trig = 12;
int echo = 11;
int DS18S20_Pin = 52;
char tmpstring[10];
int t, h, hp;
#include 
#include 
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int read_LCD_buttons()
{
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 250)  return btnUP;
  if (adc_key_in < 450)  return btnDOWN;
  if (adc_key_in < 650)  return btnLEFT;
  if (adc_key_in < 850)  return btnSELECT;
  return btnNONE;
}


void setup() {
  Serial.begin(9600);
  delay(10);
//EspSerial.begin(ESP8266_BAUD);
//delay(10);
//Blynk.begin(auth, wifi, ssid, pass);
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  digitalWrite(RELAY1, 0);
  digitalWrite(RELAY2, 0);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("MODULE3");
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
//Serial.println("Dallas Temperature IC Control Library Demo");
//sensors.begin();
//timer.setInterval(10000L, sendUptime);
}

//void sendUptime()
//{
//  Blynk.virtualWrite(V1, DHT.temperature);
//  Blynk.virtualWrite(V2, DHT.humidity);
//  Blynk.virtualWrite(23, m);
//}


void loop() {
//  timer.run();
//  Blynk.run();
int chk = DHT.read(DHT11_PIN);
temp = DHT.temperature;
hum = DHT.humidity;
unsigned long currentMillis = millis();
//
//  if ((ledState == LOW) && (ledState2 == HIGH) && (currentMillis - previousMillis >= OnTime))
//  {
//    ledState = HIGH;
//    ledState2 = LOW;
//    previousMillis = currentMillis;
//    digitalWrite(ledPin, ledState);
//    digitalWrite(RELAY1, 0);
//    digitalWrite(RELAY2, 0);
//  }
//
//  else if ((ledState == HIGH) && (ledState2 == LOW) && (currentMillis - previousMillis >= OffTime))
//  {
//    ledState = LOW;
//    ledState2 = HIGH;
//    previousMillis = currentMillis;
//    digitalWrite(ledPin, ledState);
//  digitalWrite(RELAY1, 0);
//    digitalWrite(RELAY2, 0);
//  }

if ((ledState6 == LOW) && (ledState7 == HIGH) && (currentMillis - previousMillis >= OnTime2))
  {
    ledState6 = HIGH;
    ledState7 = LOW;
    previousMillis = currentMillis;
    digitalWrite(ledPin, ledState);
    lcd.setCursor(0, 1);
    lcd.print ("H:");
    lcd.print(hum);
    lcd.print("% T:");
    lcd.print(temp);
    lcd.println(".c");
    lcd.setCursor(8, 0);
    mRaw = analogRead(A9);
    m = map(mRaw, 400, 3200, 1700, 0);
    lcd.print ("Soil:");
    lcd.print(m);
    lcd.print ("%");
    lcd.print(m);
  }else if ((ledState6 == HIGH) && (ledState7 == LOW) && (currentMillis - previousMillis >= OffTime2))
  {
    ledState6 = LOW;
    ledState7 = HIGH;
    previousMillis = currentMillis;
    digitalWrite(ledPin, ledState);
    lcd.setCursor(0, 1);
    lcd.print ("H:");
    lcd.print(hum);
    lcd.print("% T:");
    lcd.print(temp);
    lcd.println(".c");
    lcd.setCursor(8, 0);
    mRaw = analogRead(A9);
    m = map(mRaw, 400, 3200, 1700, 0);
    lcd.print ("Soil:");
    lcd.print(m);
    lcd.print ("%");
  }


//lcd.setCursor(5, 1);
//digitalWrite(RELAY1, 0);
//digitalWrite(RELAY2, 0);
//lcd.print("ON");
//lcd.setCursor(11, 0);
//lcd_key = read_LCD_buttons();
//switch (lcd_key)
//{
//case btnRIGHT:
//{
//lcd.print("RIGHT ");
//break;
//}
//case btnLEFT:
//{
//lcd.print("LEFT   ");
//break;
//}
//case btnUP:
//{
  //        lcd.print("UP    ");
  //        break;
  //      }
  //    case btnDOWN:
  //      {-
  //        lcd.print("DOWN  ");
  //        break;
  //      }
  //    case btnSELECT:
  //      {
  //        lcd.print("SELECT");
  //        break;
  //      }
  //    case btnNONE:
  //      {
  //        break;
  //      }
  //  }
  //
  //delay(3000);</p><p>}</p>

Downloads

Wiring System

superflux_mitigationofshock_lights+foggers-01.jpg
Capture d&rsquo;écran 2017-11-20 à 12.41.04.png

Material List:

  1. 2 core cable (Example)
  2. 3 core cable (Example)
  3. Grow lights (Example)
  4. Blue/red led stripes (Example)
  5. Wire connectors/Waygo (Example)
  6. Stripe terminal (Example)
  7. Immersion pump (Example)
  8. Peristaltic pump (Example)

Wiring system steps:

  1. To connect the different modules together you need to use a junction box and a colour code which separate the 12v/24v/240v elements.
  2. Following the scheme, some elements need to be wired to the power supply but also to the relay module:
    • Peristaltic pump 12v - relay module
    • Water pump 12v - relay module
    • Lights 240v - relay module
  3. The foggers are the only elements that don't need to be controlled by the Arduino because they are always on. In this case, the foggers don't go to the junction box

About the fan:

The fan gets its own controller which is called the PWM (Pulse Width Modulation) - This tool is very useful at the moment you want to have a precise fan speed.

To control the fan, you don't need to connect the fan to the relay module BUT directly to the Arduino.

Here is a simple example:

int fanPulse = 0;
unsigned long pulseDuration;

void setup()
{
Serial.begin(9600);
pinMode(fanPulse, INPUT);
digitalWrite(fanPulse,HIGH);
}

void readPulse() {
pulseDuration = pulseIn(fanPulse, LOW);
double frequency = 1000000/pulseDuration;
Serial.print("pulse duration:");
Serial.println(pulseDuration);
Serial.print("time for full rev. (microsec.):");
Serial.println(pulseDuration*2);
Serial.print("freq. (Hz):");
Serial.println(frequency/2);
Serial.print("RPM:");
Serial.println(frequency/2*60);
}


void loop()
{
analogWrite(3,20);
delay(5000);
readPulse();
analogWrite(3,50);
delay(5000);
readPulse();
analogWrite(3,100);
delay(5000);
readPulse();
analogWrite(3,200);
delay(5000);
readPulse();
analogWrite(3,255);
delay(5000);
readPulse();
}

Piping System

piping system-01.jpg
Capture d&rsquo;écran 2017-11-20 à 12.41.35.png

Material List:

  1. Black pond hose 38mm (Example)
  2. Black pond hose 28 mm ( Example)
  3. Float valve (Example)
  4. PVC clear transparent tube ( Example)
  5. Hosepipe 13mm ( Example)
  6. Nut O Ring set (Example)
  7. Cable ties ( Example)

Piping steps:

  1. To connect the boxes with the pipes we made our own 3D printed connectors. After few experiences, it appears that the hoses slipped from the boxes hole.
  2. You can 3D print the .stl files if you want to use our technique
  3. After this, connect the water tank to the fog tank. To do that, you need two float valves, a 13mm hose and a nut o ring set.
  4. Install the water pump inside the fog box and with a PVC tube, connect the water and fog tanks with the water pump.
  5. Make holes in the greenhouse boxes and install the flow pipes on it. Again, we made our own 3D printed pieces, you can download and print them.
  6. Finally, place a pvc transparent tube to link the peristaltic pump to the box.

Choose and Begin Your Home Culture

Vegetables condition.jpg
Capture d&rsquo;écran 2017-11-21 à 14.42.12.png
Capture d&rsquo;écran 2017-11-21 à 14.44.16.png

Here is another reason why we chose the fogponic system for our home culture, it is because this system fits well with most of the vegetables. Otherwise, it is important to notice that some of the vegetables will grow better than others depending on the few variables: Temperature/Amount of Nutrients/Humidity/Daylight cycle/ Dark cycle/soil humidity but also kind of soil.

In the Mitigation of Shock installation we grow:

  • Small vegetables: Coriander / Basile / Thyme / Sage / Rosemary
  • Medium vegetables: Cherry tomatoes / Chilies
  • Large vegetables: Potatoes

Here is a document where you can access the different vegetable characteristics:

https://docs.google.com/spreadsheets/d/102sibaARc0...