About

Growing in-doors flowers and produce are a very interesting latent atavism of people being transported into urban areas due to jobs and feel the lack of greeneries around them to be eerie.

Some ready-made solutions exist, browsing some of the largest outlets with prices between USD60 and USD200, given different features and doohickeys that can be bolted on, such as "smart growing", receiving notifications via your mobile phone when plants need watering, and so on. We find that one of the major drawbacks of these all-inclusive hydroponics bays is that they still have a certain amount of lock-in tactics, mainly due to their delivery system that is concentrated enough to be able to grow right about any plants with any exotic diet; a delivery system that will have to be renewed once the ones delivered with the hydroponics bay runs out. For instance, most of the commercially available hydroponics bays use a sponge-cone that is also spiked with some type of fertilizer. Once the cones run out, you will have to buy new cones, such that you will more or less end up paying a subscription.

In any case, here are some of the features of the commercially available hydroponics bays; enumerated such that we know what has to be created as a substitute:

  • spiked growth soil via sponge-like cones,
  • growth light,
  • water circulation and automatic watering

Given the above, and with the help of some IoT, a new circuit can be sketched, along with a shopping list, in order to create a DIY hydroponics bay.

Requirements

This project will be built on top of the solar panel endeavor and will be powered entirely by solar. In case this project is to be executed individually, then just a $12V$ input is needed.

  • in order to emulate the sponge-like cones that acts as the soil, here is a growing pot that seems like a good replacement

the nice part about the pot is that once the flowers are grown, the cotton rope will water the roots of the plants over time. Similarly, any excess water will just drip down into the storage basin at the bottom without having to clog the soil.

  • some full-spectrum growing lights that emulate the light emitted by the sun

  • for the watering system:
    • a $12V$ submersible pump,
    • plastic tubes used to wash car windshields,
    • T-splitters for the plastic tubes in order to create a distribution system,
    • an appropriately sized large water container
  • the rest of the equipment will be the usual IoT equipment that is used by Wizardry and Steamworks:
    • this project will be created based on an ESP32 (instead of an ESP8266) due to the ESP32 having more than one analog input,
    • step-downs, from $12V$ to $3.3V$ and to $5V$ in order to make all the components happy,
    • some transistor switches used to toggle the growing lights with its various functions,
    • a $3.3V$ relay that will couple $12V$ right from the MPPT solar charger output directly into a pair of leads to engage the water pump

Block Diagram

The following is the complete block diagram of the project,

                                                                        
                                                    Grow                
                                             \\  | Lights               
                                  #             /|  ----------+         
                                  #        ----+ +--          |         
                                  #             \| --------+  |         
                                  #              |         |  |         
                                  # water                  |  |         
                              +------------------+         |  |         
                              |   # distribution |         |  |         
                  +-----+     |   #         +----+----+    |  |         
                  |     |     |   #         |         |    |  |         
                +-|-----|-+   |   #       #///#     #///#  |  |         
                | |     | |   |   #       #...#     #...#  |  |         
          +-----+-+-+   | |   |   #       #...#     #...#  |  |         
          | to 3.3V |   | |   |   #########################|##|######## 
          +---+-+---+   | |   |                            |  |         
              | |       | |   |                            |  |         
              | |       | |   |                            |  |         
              | |   +---+-+-+ |                            |  |         
              | |   | Relay | |                            |  |         
              | |   +-+-+-+-+ |                            |  |         
              | |     | | |   | GPIO           Transistor  |  |         
              | |     | | +---|-----+            Switch    |  |         
      12V     | |     | |     |     |            Array     |  |         
     >--------+-|-----+ |     |     |                      |  |         
 battery      | |     | |     |   +-+-----+        |       |  |         
     >--------|-+-------+     |   | ESP32 |       /+    +--+--+--+      
              | |     | |     |   |       +--/\/-| .    | Grow-  |      
              | |     | |     |   |       |       \+----+  Light |      
              | |     | |     |   |       +----.....    | Remote |      
              | |   +-+-+---+ |   |       |        .----+        |      
              | |   | water | |   |       +----.....    |        |      
              | |   | pump  +-+   |       |        .----+        |      
              | |   +---+---+     |       +----.....    |        |      
              | |       |         |       |        .----+        |      
              | |       |         +-+-----+        .    |        |      
              | |       |           |              .    +-+------+      
              | |       |           |              |      |             
           +--+-+--+    |           |              |      |             
           | to 5V +----|-----------+---------------------+             
           +-------+    |                          |                    
                        |                          |                    
                        |                         ///                   
                    +---------+                                         
                    |  water  |                                         
                    |..     ..|                                         
                    |.........|                                         
                    |.........|                                         
                    |.........|                                         
                    +---------+                                         

along with the water distribution system at the top-right where the plants will grow. Here are some notes on how all of this is supposed to come together:

  • the ESP will use a digital GPIO output pin to control the relay that, once activated, will start the pump and sprinkle water into the flower pots,
  • the ESP will additionally use another four GPIO digital output pins in order to control the grow lights via a dismantled grow-light remote control

The entire system will be mediated from Node-Red, even though it would be fairly trivial to just include all the logic within the ESP32 instead.

Taking Apart the Grow Lights Remote

Fortunately, the grow lights are shipped with a remote that is easy to disassemble and, even more fortunately, the buttons are press buttons such that they can be hooked into using a transistor switch.

The wires can then be de-soldered and new wires fitted on the final PCB.

Realization

Here are the realizations of the various components of this project.

The Controller

Just like reading the ending of a book before the book itself, the following table contains the realized project from top to bottom.

Top Bottom

Here is an explantion of the components to be found on the PCB, following the image of the top of the PCB, from left to right:

  • a $3.3V$ relay, that can transfer up to $5A$ $220V$ to which the pump will be coupled to (it is currently on, due to the red LED that shines),
  • in the middle, there's an ESP32 that will be the one mediating between the various components,
  • at the bottom part of the PCB, there is a standard power jack and on the left and right there are two step-downs, from $12$ to $3.3V$, respectively to $5V$,
  • on the right, the disassembled PCB of the grow lights remote is mounted on top of the project PCB, and even further right there are four transistor switches that latch onto the remote button, used to press and depress the remote using MQTT and thereby toggle various functions of the grow lights remote

The Pump and Water Tank

The water tank is a 5L canister with a plastic lid that is removed in order to fit a plastic tube connector and a power jack. The idea is that when the tank needs refilling, the plastic tube carrying the water to the plants can be removed, along with the power jack such that the tank can be transported on its own to be refilled.

The pump itself is just a $12V$ pump that should manage to push water from the tank through the plastic tubes. Here is a closeup of the plastic cap that has been modified to fit two ports for water tubes and power.

The water connector is made out of a T-junction plastic bit that is used for car windshields to split the water stream in two. The transversal junction of the T has been cut and then tapered such that a plain plastic pipe is obtained that is then fitted to the plastic lid using JB Weld.

Bringing it All Together

The PCB controller is mounted on the side of a wardrobe, the water tank is placed somwhere underneath the wardrobe and plastic tubes are used to distribute water to the planters. Overall, the result looks pretty good and works well given some preliminary testing such that we can move on to the software.

Software

The ESP32 uses a boilerplate Arduino pin setting sketch and the rest is controlled via Node-Red.

Right now, the Node-Red flow is responsible for turning the lights on and off depending on the time of day. About 8 hours or the grow lights being on should be sufficient to allow any plants to grow properly. Although not implemented yet, the water pump can be scheduled to drip some water both in the mornings and the evenings in order to ensure that the soil is always moist.

Node-Red Flow

[
    {
        "id": "32d027e661530e74",
        "type": "tab",
        "label": "Hydroponics",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "4484ae51a2ccb4f5",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Feedback",
        "style": {
            "label": true
        },
        "nodes": [
            "8ba06389a07522f9",
            "92ceef98a69ba4e4",
            "1ddb01818b54a5a4"
        ],
        "x": 294,
        "y": 19,
        "w": 1568,
        "h": 328
    },
    {
        "id": "0a261dbe1394d521",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Light Switch",
        "style": {
            "label": true
        },
        "nodes": [
            "590dbe14a34f5778",
            "374c66be6df1abe5",
            "975d366c61bfb773",
            "6cbc0ccc51390907",
            "ef3672983b7c69ad",
            "8e7ba0aef8e2df43",
            "51457689a5d94d7d",
            "4a4e5cc7163482f4",
            "bf5c7f64d1132744",
            "7becb909f4bddf16",
            "896b64c95774305c",
            "08495d894db77d04",
            "641267a7bbff47c4",
            "b8a7896a4f0c9722",
            "053a5d720148da79",
            "62ff6f26bb9d82b9",
            "975b719b01b41fdd",
            "e0ff8e014faa2970",
            "4995224ad9848ea7"
        ],
        "x": 314,
        "y": 439,
        "w": 1112,
        "h": 522
    },
    {
        "id": "38e386a497b7494c",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Scheduling",
        "style": {
            "label": true
        },
        "nodes": [
            "4b399c7602045b83",
            "f8e19949a8523515",
            "a8f8ee5d7e221371",
            "40dbda74da5ec015",
            "ad18e871217116cb",
            "3d35bbdbecf29f48",
            "bc93b19563327aaf",
            "6b694e3ada38423b",
            "900a0f7e457b613d"
        ],
        "x": 314,
        "y": 1019,
        "w": 1062,
        "h": 222
    },
    {
        "id": "d68759f86859c790",
        "type": "group",
        "z": "32d027e661530e74",
        "name": "Water Pump",
        "style": {
            "label": true
        },
        "nodes": [
            "443b1549a1832b4e",
            "a387335795df9388",
            "7b7351cf24c53d30",
            "00283e3635668185",
            "563c1db45f5d6eed"
        ],
        "x": 314,
        "y": 1279,
        "w": 512,
        "h": 162
    },
    {
        "id": "1ddb01818b54a5a4",
        "type": "group",
        "z": "32d027e661530e74",
        "g": "4484ae51a2ccb4f5",
        "name": "Light Status",
        "style": {
            "label": true
        },
        "nodes": [
            "e923ef9a7a1ce56b",
            "4d8bef63bbabbfb4",
            "3751f6e88c02a18e",
            "78767dc1de179d15",
            "4e602877d1662927",
            "8b6322c929eafce1",
            "3d7c6f4a46ffd2f6",
            "082b9a0a921ac26b",
            "288f0c1581828a75",
            "2e80482e137f0668",
            "e4dd511e0bcee2ee",
            "b975b3a9a1dc52b1",
            "ea79023ab4b33b24"
        ],
        "x": 474,
        "y": 51.5,
        "w": 1362,
        "h": 269.5
    },
    {
        "id": "590dbe14a34f5778",
        "type": "mqtt out",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "topic": "esp/9067",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "725ed69c.6d76a8",
        "x": 1080,
        "y": 840,
        "wires": []
    },
    {
        "id": "8ba06389a07522f9",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "4484ae51a2ccb4f5",
        "name": "debug 22",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 60,
        "wires": []
    },
    {
        "id": "92ceef98a69ba4e4",
        "type": "mqtt in",
        "z": "32d027e661530e74",
        "g": "4484ae51a2ccb4f5",
        "name": "",
        "topic": "esp/9067",
        "qos": "2",
        "datatype": "auto-detect",
        "broker": "725ed69c.6d76a8",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 380,
        "y": 120,
        "wires": [
            [
                "8ba06389a07522f9",
                "e923ef9a7a1ce56b"
            ]
        ]
    },
    {
        "id": "374c66be6df1abe5",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "measure(GPIO 35)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "35",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "measure",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 870,
        "y": 920,
        "wires": [
            [
                "590dbe14a34f5778"
            ]
        ]
    },
    {
        "id": "e923ef9a7a1ce56b",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "GPIO 35 |-> 1",
        "property": "payload.pin",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "35",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 580,
        "y": 240,
        "wires": [
            [
                "4d8bef63bbabbfb4"
            ],
            []
        ]
    },
    {
        "id": "975d366c61bfb773",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init(msg)",
        "func": "msg = {}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 640,
        "y": 920,
        "wires": [
            [
                "374c66be6df1abe5"
            ]
        ]
    },
    {
        "id": "443b1549a1832b4e",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "On (Relay)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "25",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.state",
                "pt": "msg",
                "to": "on",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "set",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 1320,
        "wires": [
            [
                "563c1db45f5d6eed"
            ]
        ]
    },
    {
        "id": "a387335795df9388",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{}",
        "payloadType": "json",
        "x": 410,
        "y": 1320,
        "wires": [
            [
                "443b1549a1832b4e"
            ]
        ]
    },
    {
        "id": "7b7351cf24c53d30",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "Off (Relay)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "25",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.state",
                "pt": "msg",
                "to": "off",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "set",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 570,
        "y": 1400,
        "wires": [
            [
                "563c1db45f5d6eed"
            ]
        ]
    },
    {
        "id": "00283e3635668185",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{}",
        "payloadType": "json",
        "x": 410,
        "y": 1400,
        "wires": [
            [
                "7b7351cf24c53d30"
            ]
        ]
    },
    {
        "id": "4b399c7602045b83",
        "type": "light-scheduler",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "settings": "ef6eaeb844d08601",
        "events": "[{\"start\":{\"dow\":2,\"mod\":240},\"end\":{\"dow\":2,\"mod\":1140}},{\"start\":{\"dow\":6,\"mod\":240},\"end\":{\"dow\":6,\"mod\":1140}},{\"start\":{\"dow\":0,\"mod\":240},\"end\":{\"dow\":0,\"mod\":1140}},{\"start\":{\"dow\":4,\"mod\":240},\"end\":{\"dow\":4,\"mod\":1140}},{\"start\":{\"dow\":5,\"mod\":240},\"end\":{\"dow\":5,\"mod\":1140}},{\"start\":{\"dow\":3,\"mod\":240},\"end\":{\"dow\":3,\"mod\":1140}},{\"start\":{\"dow\":1,\"mod\":240},\"end\":{\"dow\":1,\"mod\":1140}}]",
        "topic": "",
        "name": "",
        "onPayload": "on",
        "onPayloadType": "str",
        "offPayload": "off",
        "offPayloadType": "str",
        "onlyWhenDark": false,
        "scheduleRndMax": 0,
        "sunElevationThreshold": 6,
        "sunShowElevationInStatus": true,
        "outputfreq": "output.statechange.startup",
        "x": 460,
        "y": 1120,
        "wires": [
            [
                "f8e19949a8523515"
            ]
        ]
    },
    {
        "id": "4d8bef63bbabbfb4",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "init(msg) & msg.payload = value",
        "func": "let value = msg.payload.value\nmsg = {}\nmsg.payload = parseInt(value)\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 830,
        "y": 240,
        "wires": [
            [
                "3751f6e88c02a18e"
            ]
        ]
    },
    {
        "id": "6cbc0ccc51390907",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "push(GPIO 12)",
        "rules": [
            {
                "t": "set",
                "p": "payload.pin",
                "pt": "msg",
                "to": "12",
                "tot": "num"
            },
            {
                "t": "set",
                "p": "payload.action",
                "pt": "msg",
                "to": "push",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload.delay",
                "pt": "msg",
                "to": "75",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 860,
        "y": 840,
        "wires": [
            [
                "975d366c61bfb773",
                "590dbe14a34f5778"
            ]
        ]
    },
    {
        "id": "3d7c6f4a46ffd2f6",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "debug 25",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1680,
        "y": 140,
        "wires": []
    },
    {
        "id": "3751f6e88c02a18e",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "ADC := High | Low |-> 1 | 2",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "gt",
                "v": "2048",
                "vt": "str"
            },
            {
                "t": "lte",
                "v": "2048",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 1120,
        "y": 240,
        "wires": [
            [
                "4e602877d1662927"
            ],
            [
                "78767dc1de179d15"
            ],
            []
        ]
    },
    {
        "id": "8b6322c929eafce1",
        "type": "redis-command",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "server": "a37a41f9.a98da8",
        "command": "SET",
        "name": "",
        "topic": "",
        "params": "[]",
        "paramsType": "json",
        "payloadType": "json",
        "block": false,
        "x": 1680,
        "y": 240,
        "wires": [
            [
                "082b9a0a921ac26b",
                "3d7c6f4a46ffd2f6"
            ]
        ]
    },
    {
        "id": "4e602877d1662927",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "SET harponics/light/state := off",
        "func": "msg = {}\nmsg.payload = [\"harponics/light/state\", \"off\"]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1430,
        "y": 280,
        "wires": [
            [
                "8b6322c929eafce1"
            ]
        ]
    },
    {
        "id": "78767dc1de179d15",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "SET harponics/light/state := on",
        "func": "msg = {}\nmsg.payload = [\"harponics/light/state\", \"on\"]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1430,
        "y": 200,
        "wires": [
            [
                "8b6322c929eafce1"
            ]
        ]
    },
    {
        "id": "ef3672983b7c69ad",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "switch(msg.payload) := on | off",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 1050,
        "y": 560,
        "wires": [
            [
                "7becb909f4bddf16"
            ],
            [
                "896b64c95774305c"
            ]
        ]
    },
    {
        "id": "8e7ba0aef8e2df43",
        "type": "ui_switch",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "label": "Switch",
        "tooltip": "",
        "group": "8ae51af3338acf00",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "decouple": "false",
        "topic": "topic",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "x": 630,
        "y": 720,
        "wires": [
            [
                "08495d894db77d04",
                "975b719b01b41fdd"
            ]
        ]
    },
    {
        "id": "51457689a5d94d7d",
        "type": "redis-command",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "server": "a37a41f9.a98da8",
        "command": "GET",
        "name": "",
        "topic": "",
        "params": "[]",
        "paramsType": "json",
        "payloadType": "json",
        "block": false,
        "x": 820,
        "y": 560,
        "wires": [
            [
                "ef3672983b7c69ad"
            ]
        ]
    },
    {
        "id": "4a4e5cc7163482f4",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "GET harponics/light/state",
        "func": "msg = {}\nmsg.payload = [\"harponics/light/state\"]\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 610,
        "y": 560,
        "wires": [
            [
                "51457689a5d94d7d"
            ]
        ]
    },
    {
        "id": "bf5c7f64d1132744",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "{}",
        "payloadType": "json",
        "x": 550,
        "y": 500,
        "wires": [
            [
                "62ff6f26bb9d82b9"
            ]
        ]
    },
    {
        "id": "7becb909f4bddf16",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "msg.payload := true",
        "func": "msg = {}\nmsg.payload = true\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1290,
        "y": 480,
        "wires": [
            [
                "053a5d720148da79",
                "8e7ba0aef8e2df43"
            ]
        ]
    },
    {
        "id": "896b64c95774305c",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "msg.payload := false",
        "func": "msg = {}\nmsg.payload = false\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1300,
        "y": 620,
        "wires": [
            [
                "053a5d720148da79",
                "8e7ba0aef8e2df43"
            ]
        ]
    },
    {
        "id": "08495d894db77d04",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init(msg)",
        "func": "msg = {}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 840,
        "y": 720,
        "wires": [
            [
                "6cbc0ccc51390907"
            ]
        ]
    },
    {
        "id": "641267a7bbff47c4",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "init(msg)",
        "func": "msg = {}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 400,
        "y": 560,
        "wires": [
            [
                "4a4e5cc7163482f4"
            ]
        ]
    },
    {
        "id": "f8e19949a8523515",
        "type": "change",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "msg.payload |-> msg.request",
        "rules": [
            {
                "t": "set",
                "p": "request",
                "pt": "msg",
                "to": "payload",
                "tot": "msg",
                "dc": true
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "[\"harponics/light/state\"]",
                "tot": "json"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 700,
        "y": 1120,
        "wires": [
            [
                "a8f8ee5d7e221371"
            ]
        ]
    },
    {
        "id": "a8f8ee5d7e221371",
        "type": "redis-command",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "server": "a37a41f9.a98da8",
        "command": "GET",
        "name": "",
        "topic": "",
        "params": "[]",
        "paramsType": "json",
        "payloadType": "json",
        "block": false,
        "x": 920,
        "y": 1120,
        "wires": [
            [
                "ad18e871217116cb",
                "6b694e3ada38423b"
            ]
        ]
    },
    {
        "id": "40dbda74da5ec015",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "trigger",
        "payloadType": "str",
        "x": 410,
        "y": 1060,
        "wires": [
            [
                "4b399c7602045b83"
            ]
        ]
    },
    {
        "id": "ad18e871217116cb",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "msg.payload := request |-> 1,2",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "request",
                "vt": "msg"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 1150,
        "y": 1120,
        "wires": [
            [],
            [
                "3d35bbdbecf29f48",
                "bc93b19563327aaf"
            ]
        ]
    },
    {
        "id": "b8a7896a4f0c9722",
        "type": "link in",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "link in 13",
        "links": [
            "75f31c3f7c8a9a38",
            "c78ff9f407cea372",
            "bc93b19563327aaf",
            "ea79023ab4b33b24"
        ],
        "x": 665,
        "y": 780,
        "wires": [
            [
                "08495d894db77d04"
            ]
        ]
    },
    {
        "id": "3d35bbdbecf29f48",
        "type": "delay",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "",
        "pauseType": "delay",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 440,
        "y": 1200,
        "wires": [
            [
                "900a0f7e457b613d"
            ]
        ]
    },
    {
        "id": "563c1db45f5d6eed",
        "type": "mqtt out",
        "z": "32d027e661530e74",
        "g": "d68759f86859c790",
        "name": "",
        "topic": "esp/9067",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "725ed69c.6d76a8",
        "x": 740,
        "y": 1360,
        "wires": []
    },
    {
        "id": "053a5d720148da79",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "debug 26",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1100,
        "y": 700,
        "wires": []
    },
    {
        "id": "62ff6f26bb9d82b9",
        "type": "delay",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "pauseType": "delay",
        "timeout": "1",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 700,
        "y": 500,
        "wires": [
            [
                "4a4e5cc7163482f4"
            ]
        ]
    },
    {
        "id": "975b719b01b41fdd",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "debug 27",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 1040,
        "y": 780,
        "wires": []
    },
    {
        "id": "082b9a0a921ac26b",
        "type": "link out",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "link out 9",
        "mode": "link",
        "links": [
            "e0ff8e014faa2970"
        ],
        "x": 1795,
        "y": 240,
        "wires": []
    },
    {
        "id": "e0ff8e014faa2970",
        "type": "link in",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "link in 14",
        "links": [
            "082b9a0a921ac26b"
        ],
        "x": 445,
        "y": 620,
        "wires": [
            [
                "4a4e5cc7163482f4"
            ]
        ]
    },
    {
        "id": "bc93b19563327aaf",
        "type": "link out",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "link out 10",
        "mode": "link",
        "links": [
            "b8a7896a4f0c9722"
        ],
        "x": 1335,
        "y": 1120,
        "wires": []
    },
    {
        "id": "6b694e3ada38423b",
        "type": "debug",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "debug 28",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1120,
        "y": 1200,
        "wires": []
    },
    {
        "id": "900a0f7e457b613d",
        "type": "function",
        "z": "32d027e661530e74",
        "g": "38e386a497b7494c",
        "name": "function 30",
        "func": "msg = {}\nmsg.payload = \"trigger\"\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 610,
        "y": 1200,
        "wires": [
            [
                "4b399c7602045b83"
            ]
        ]
    },
    {
        "id": "4995224ad9848ea7",
        "type": "inject",
        "z": "32d027e661530e74",
        "g": "0a261dbe1394d521",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 480,
        "y": 920,
        "wires": [
            [
                "975d366c61bfb773"
            ]
        ]
    },
    {
        "id": "e4dd511e0bcee2ee",
        "type": "amazon-echo-device",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "Harponics Lights",
        "topic": "",
        "x": 930,
        "y": 100,
        "wires": [
            [
                "288f0c1581828a75",
                "2e80482e137f0668"
            ]
        ]
    },
    {
        "id": "b975b3a9a1dc52b1",
        "type": "link in",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "link in 19",
        "links": [
            "e83f88e6.89dfb8"
        ],
        "x": 795,
        "y": 100,
        "wires": [
            [
                "e4dd511e0bcee2ee"
            ]
        ]
    },
    {
        "id": "288f0c1581828a75",
        "type": "switch",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "",
        "property": "on",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            },
            {
                "t": "false"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 1110,
        "y": 100,
        "wires": [
            [
                "78767dc1de179d15"
            ],
            [
                "4e602877d1662927"
            ],
            []
        ]
    },
    {
        "id": "2e80482e137f0668",
        "type": "delay",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "",
        "pauseType": "delay",
        "timeout": "2",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 1120,
        "y": 160,
        "wires": [
            [
                "ea79023ab4b33b24"
            ]
        ]
    },
    {
        "id": "ea79023ab4b33b24",
        "type": "link out",
        "z": "32d027e661530e74",
        "g": "1ddb01818b54a5a4",
        "name": "link out 15",
        "mode": "link",
        "links": [
            "b8a7896a4f0c9722"
        ],
        "x": 1235,
        "y": 160,
        "wires": []
    },
    {
        "id": "725ed69c.6d76a8",
        "type": "mqtt-broker",
        "name": "",
        "broker": "",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": false,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willPayload": ""
    },
    {
        "id": "ef6eaeb844d08601",
        "type": "light-scheduler-settings",
        "name": "Local",
        "latitude": "44.49",
        "longitude": "26.1734"
    },
    {
        "id": "a37a41f9.a98da8",
        "type": "redis-config",
        "name": "Local",
        "options": "{}",
        "cluster": false,
        "optionsType": "json"
    },
    {
        "id": "8ae51af3338acf00",
        "type": "ui_group",
        "name": "Lights",
        "tab": "b7988cc7b62d5c6e",
        "order": 1,
        "disp": true,
        "width": "6",
        "collapse": false
    },
    {
        "id": "b7988cc7b62d5c6e",
        "type": "ui_tab",
        "name": "Harponics",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]

Problems and Further Work

Here are a few problems encountered along the way:

  • The growing lights consume a lot of power; in fact, the PCB will have to be modified in order to exchange the $5V$ step down with a more powerful counterpart such that both grow lights can be active at the same time. This is a matter of amperage and the $5V$ buck module is simply insufficient to power both growth lights.
  • The sprinkling system should not be in series, but rather in parallel (concerning water) - there should be one center point of distribution and then the distance to all planters should remain the same in order to ensure that all the pots get the same amount of water.

environmentalism/creating_a_hydroponics_bay_for_growing_plants.txt ยท Last modified: 2023/08/06 22:49 by office

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.