{"id":1971,"date":"2020-06-03T16:32:35","date_gmt":"2020-06-03T21:32:35","guid":{"rendered":"http:\/\/kylegabriel.com\/projects\/?p=1971"},"modified":"2022-08-28T22:08:07","modified_gmt":"2022-08-29T03:08:07","slug":"automated-hydroponic-system-build","status":"publish","type":"post","link":"https:\/\/kylegabriel.com\/projects\/2020\/06\/automated-hydroponic-system-build.html","title":{"rendered":"Automated Hydroponic System Build"},"content":{"rendered":"\n<p>Last Updated: August 28, 2022<\/p>\n\n\n\n<p>Hydroponic farming is a method of growing crops without soil, with the main benefits of environmental and nutrient control, water conservation, and reduction of labor. This technique relies on a number of technologies that the principles of automation can be applied in order to improve yield and consistency. In this article and accompanying video, I&#8217;ll show you how to built a hydroponic system with basic components and automate it using the open source software Mycodo running on a Raspberry Pi single board computer.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.youtube.com\/watch?v=nyqykZK2Ev4\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/DSC00154-04-1024x576.jpg\" alt=\"\" class=\"wp-image-2546\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/DSC00154-04-1024x576.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/DSC00154-04-300x169.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/DSC00154-04-768x432.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/DSC00154-04-1536x864.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/DSC00154-04.jpg 1970w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Watch the video <a href=\"https:\/\/www.youtube.com\/watch?v=nyqykZK2Ev4\" data-type=\"URL\" data-id=\"https:\/\/www.youtube.com\/watch?v=nyqykZK2Ev4\" target=\"_blank\" rel=\"noreferrer noopener\">Automated Hydroponic System Build<\/a> on YouTube<\/figcaption><\/figure><\/div>\n\n\n<p>Many of the aspects that make hydroponic farming so efficient can also make it challenging to implement. Water and nutrients must be provided in a balanced ratio while being constantly monitored and adjusted as plants develop. Temperature regulation can also become a problem since the circulating water system acts as a heat pump. Additionally, the microbial communities that can benefit or harm your crops are now competing in an aqueous rather than a terrestrial environment, sending us even further into unknown and potentially dangerous territory. And to make matters worse, if you have a prolonged power outage, you may need to manually water or have a generator to keep the water pump going, else you may injure your crops.<\/p>\n\n\n\n<p>Even with these challenges, there are several aspects that make hydroponics attractive (Barbosa et al. 2015). An optimal amount of nutrients can be supplied directly to plant roots in an immediately-usable form. Plants can be grown in areas with poor soil or limited space, or grown vertically to maximize plant density. Water waste is reduced by recirculating it back into the system. There&#8217;s also no need to worry about weeds.<\/p>\n\n\n\n<p>Although there are a number of different hydroponic and cultivation techniques, this article explores only one of the ways to build a hydroponic system and apply principles of automation to monitor and regulate it. This is meant primarily to demonstrate the process of applying automation techniques, which can be adapted to many other systems. And while the hydroponic system I built is relatively small, it&#8217;s a modular design that can be scaled to different growing spaces, be it a small grow tent or a large commercial greenhouse.<\/p>\n\n\n\n\n\n<h2 class=\"wp-block-heading\">Support<\/h2>\n\n\n\n<p>If you find this article or video useful or you use Mycodo and want to support my future work and software development, consider becoming a Patron at <a href=\"https:\/\/patreon.com\/kylegabriel\" target=\"_blank\" rel=\"noreferrer noopener\">patreon.com\/kylegabriel<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/800px-Raspberry_Pi_4-e1579390581447.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/800px-Raspberry_Pi_4-e1579390581447.jpg\" alt=\"\" class=\"wp-image-1980\" width=\"273\" height=\"273\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/800px-Raspberry_Pi_4-e1579390581447.jpg 450w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/800px-Raspberry_Pi_4-e1579390581447-300x300.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/800px-Raspberry_Pi_4-e1579390581447-150x150.jpg 150w\" sizes=\"(max-width: 273px) 100vw, 273px\" \/><\/a><figcaption>Raspberry Pi 4 single board computer (courtesy of <a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Raspberry_Pi_4.jpg\">WC<\/a>)<\/figcaption><\/figure><\/div>\n\n\n<p>At the core of this automated hydroponic system is the Raspberry Pi single board computer. This $35 computer is only the size of a deck of playing cards, but it has all the components you would find in a full computer, including CPU, RAM, video\/audio output, USB, WiFi, Bluetooth, Ethernet, and micro SD slot. The most important feature of the Raspberry Pi for our application is its general purpose input-output (GPIO) pins, which will be used to connect inputs, such as switches and sensors to measure the environment, and outputs such as pumps and relays to move liquids and control electrical devices that will manipulate the environment.<\/p>\n\n\n\n<p>Until recently (this month, in fact), the major Achilles Heel of the Raspberry Pi has been an inability to boot from external storage devices, forcing the use of a micro SD card. Micro SD cards were designed for cameras where there are minimal read\/write operations. Running a full Linux operating system along with a time-series database recording measurements severely reduces the life expectancy of the SD card and reduces the stability of the system due to file system corruption. In May 2020, firmware that allows the <a rel=\"noreferrer noopener\" href=\"https:\/\/www.tomshardware.com\/how-to\/boot-raspberry-pi-4-usb\" target=\"_blank\">Raspberry Pi 4 to natively boot from an external storage device<\/a> entered beta. This drastically improves its stability and suitability in critical automation applications.<\/p>\n\n\n\n<p>The software which will be installed on the Raspberry Pi to automate the hydroponic system is a free and open source software package I&#8217;ve developed, <a href=\"https:\/\/kizniche.github.io\/Mycodo\/\">Mycodo<\/a>, which is essentially a universal tool for environmental measuring, monitoring, and manipulation, and <a rel=\"noreferrer noopener\" aria-label=\"has been used for a number of interesting applications (opens in a new tab)\" href=\"https:\/\/github.com\/kizniche\/Mycodo#uses\" target=\"_blank\">has been used for a number of interesting and diverse applications<\/a>. Mycodo is a user-friendly yet powerful tool for building automation into almost any system. Below is a brief overview of the functionality that will be configured in Mycodo to operate as a hydroponic system controller:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hydroponic System Automation Features<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Measure water conditions: pH, electrical conductivity, temperature, level, and flow.<\/li><li>Measure air conditions: temperature, humidity, vapor pressure deficit, and carbon dioxide (CO<sub>2<\/sub>).<\/li><li>Control relays to modulate lights, air exhaust fan, and humidifier.<\/li><li>Control four peristaltic pumps to dispense specific volumes of solutions: acid, base, nutrient A, and nutrient B.<\/li><li>Automatically adjust water to target pH range by dispensing acid\/base solutions.<\/li><li>Automatically adjust water to target electrical conductivity range by dispensing nutrient solutions.<\/li><li>Automatically adjust air to target humidity, temperature, and CO<sub>2<\/sub> concentration ranges by modulating an exhaust fan and humidifier.<\/li><li>Automatically regulate air vapor pressure deficit (VPD) with a humidifier and exhaust fan, using a PID controller.<\/li><li>Use timers to schedule grow lights, air exhaust, and a DSLR camera shutter for high quality time-lapse photography.<\/li><li>E-mail alert notifications if select measurements fall outside acceptable ranges (e.g. temperature too high, water level too low, water flow has stopped, etc.).<\/li><li>Measure electrical energy usage with a transformer to automatically calculate operating costs.<\/li><li>Use the Raspberry Pi Camera to monitor plants with a live video stream and conduct time-lapse photography of plant growth.<\/li><li>Configure dashboards with gauges, graphs, camera feed, and other widgets to view all relevant data on a single page.<\/li><li>Forward port 443 through your router to the Raspberry Pi to be able to access the Mycodo web interface from anywhere with internet access (using a user login system for security).<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Disclosures<\/h2>\n\n\n\n<p>I reached out to Atlas Scientific to ask if they would be willing to contribute to this project, and they were kind enough to donate 4 peristaltic pumps, an electrical conductivity sensor kit, and a pH sensor kit. I&#8217;ve used Atlas Scientific instruments for years and have incorporated support for several of their sensors and pumps into Mycodo, all prior to this project. I&#8217;d like to thank them for their donations and for making quality products.<\/p>\n\n\n\n<p>Additionally, I earn a commission from qualifying purchases. What this means is if you click a link on my site to a product and purchase it, I may earn a small commission, without any additional cost to you. Please consider using these links if you would like to support my work and see more like it in the future.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Materials &amp; Parts List<\/h2>\n\n\n\n<p>Each part of building and operating the hydroponic system will be covered in detail. As needs vary, so too will the choice of materials one incorporates into his or her system. The materials list below is only meant to provide a complete list of the components used in this particular build.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Tools (Essential)<\/h3>\n\n\n\n<p>These tools are the minimum required to build this system, unless you want to adopt some creative fabrication techniques.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Soldering Iron<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oUVrs4\" data-eafl-id=\"6255\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Solder<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3yGEINp\" data-eafl-id=\"6256\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Saw or Dremel with Cutting Kit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/34mffuW\" data-eafl-id=\"6257\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/amzn.to\/3fHbG7K\" data-eafl-id=\"6258\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Heat Gun<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2StfYaP\" data-eafl-id=\"6259\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Cordless Drill<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3yG8dis\" data-eafl-id=\"6260\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Drill Bit Set (16-Piece)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fP4VAU\" data-eafl-id=\"6261\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Step Drill Bit (1\/4 to 1 3\/8 in.)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3yF1EMV\" data-eafl-id=\"6263\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1 3\/4 in. Hole Saw Bit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fNKjJd\" data-eafl-id=\"6264\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Screwdriver Set<\/td><td class=\"has-text-align-right\" data-align=\"right\">Hardware Store<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Thread Seal Tape<\/td><td class=\"has-text-align-right\" data-align=\"right\">Hardware Store<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Tools (Non-Essential)<\/h3>\n\n\n\n<p>These tools aren&#8217;t required to build the system but are useful for verifying measurements and tuning the system.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Photosynthetically active radiation (PAR) Meter<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2QWynwo\" data-eafl-id=\"6265\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Clamp Electrical Current Meter<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fmegRG\" data-eafl-id=\"6266\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Base Hydroponic System<\/h3>\n\n\n\n<p>These are the components necessary to build the base hydroponic system that can operate to grow crops but will need to be manually operated. The materials further below will automate various parts of the system.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"> <strong>Description<\/strong><\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Grow Tent<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3yDK9g5\" data-eafl-id=\"6245\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Grow Light<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3qiSAuO\" data-eafl-id=\"6247\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Microtube Grommet<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/shop.amhydro.com\/products\/amhydro-microtube-grommet-id-1-4-in-od-3-8-in\" target=\"_blank\" rel=\"noreferrer noopener\">AmHydro<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">6<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Microtube<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/shop.amhydro.com\/products\/amhydro-microtube-1-4-in-x-16-in\" target=\"_blank\" rel=\"noreferrer noopener\">AmHydro<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">6<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">2 in. x 3 in. Vinyl Downspout<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Amerimax-Home-Products-2-in-x-3-in-x-120-in-White-Vinyl-Downspout-M0593\/100095267\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">4 in. PVC Sewer and Drain Pipe<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/JM-eagle-4-in-x-10-ft-PVC-D2729-Sewer-and-Drain-Pipe-1610\/202280933\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">4 in. PVC Sewer and Drain Cap<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/NDS-4-in-PVC-Sewer-and-Drain-Cap-4P06\/100172701\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3\/4 in. Bulkhead Union<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Everbilt-3-4-in-FIP-Barrel-Bulkhead-Union-with-EPDM-Washer-Fitting-800479\/207176307\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1 1\/2 in. ID Swimming Pool Hose (2 feet)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/HDX-35-ft-x-1-5-in-Swimming-Pool-Vacuum-Hose-69235\/203796282\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1 in. PVC Pipe<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/1-in-x-10-ft-PVC-Schedule-40-Plain-End-Pipe-531194\/202280936\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1 in. PVC End Cap<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Charlotte-Pipe-1-in-PVC-Sch-40-Socket-Cap-PVC021161000HD\/203818100\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1 in. x 1 in. x 1\/2 in. PVC Tee (S x S x FPT)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Charlotte-Pipe-1-in-x-1-in-x-1-2-in-PVC-Sch-40-S-x-S-x-FPT-Red-Tee-PVC024013200HD\/203812423\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1\/2 in. ID x 1\/2 in. MIP Plastic Hose Barb Adapter Fitting<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Everbilt-1-2-in-ID-x-1-2-in-MIP-Plastic-Hose-Barb-Adapter-Fitting-800409\/300862730\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">10 Gallon Bin<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Husky-Heavy-Duty-10-Gal-Storage-Tote-with-Lid-235596\/303083131\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Submersible Water Pump<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3Jp7SFT\" data-eafl-id=\"6248\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1\/2 in. ID Clear Vinyl Tubing<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/UDP-1-2-in-I-D-x-5-8-in-O-D-x-10-ft-Clear-Vinyl-Tubing-T10006010\/304185142\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Stainless-Steel Hose Clamp (3\/8 in. &#8211; 7\/8 in.)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Everbilt-3-8-in-7-8-in-Stainless-Steel-Hose-Clamp-6760595\/206261538\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Stainless-Steel Hose Clamp (3\/4 in. &#8211; 1 3\/4 in.)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Everbilt-3-4-in-1-3-4-in-Stainless-Steel-Hose-Clamp-6720595\/202309386\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Nylon Filter Bags<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fLhDjX\" data-eafl-id=\"6249\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Plant Growth Nutrient Solutions (Two Part, A and B)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3wAsTXb\" data-eafl-id=\"6250\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">pH Adjustment Solutions (Up\/Base and Down\/Acid)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/34iiQKb\" data-eafl-id=\"6251\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Mycostop Biocontrol (<em>Streptomyces griseoviridis<\/em> bacteria)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3wE3jR1\" data-eafl-id=\"6252\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">2 Grams<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Planting<\/h3>\n\n\n\n<p>These are the materials for germinating and growing plants.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Seeds<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.johnnyseeds.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Johnny&#8217;s<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">Choose<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Rockwool Grow Cubes or Horticubes<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2SyQWa8\" data-eafl-id=\"6240\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/amzn.to\/34l7KEA\" data-eafl-id=\"6241\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Seed Germination Tray and Dome<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3vvrLUU\" data-eafl-id=\"6242\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Waterproof Seedling Heat Mat<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oW5Nb8\" data-eafl-id=\"6243\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Environmental Monitoring and Regulation System<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Raspberry Pi v4<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3KzicMP\" data-eafl-id=\"6663\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Micro SD Card (32 GB)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oQQpg9\" data-eafl-id=\"6235\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Raspberry Pi v2 Camera Module<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oZCNPB\" data-eafl-id=\"6234\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Raspberry Pi Camera Ribbon Cable<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3yQxWoy\" data-eafl-id=\"6233\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">HDPE Plastic Mounting Panel<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/34l4Z6c\" data-eafl-id=\"6232\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">6-Outlet Power Strip<\/td><td class=\"has-text-align-right\" data-align=\"right\"><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">20 character, 4 line I<sup>2<\/sup>C LCD<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oPtWju\" data-eafl-id=\"6228\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/www.dfrobot.com\/product-590.html?tracking=pgcWkSCxHrHgqtReHGxyAgIlGeJRW5PZWO8Tcp9RgzRrbwJWfSL41yhj6G2Ysbn5\" data-eafl-id=\"6650\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">DFRobot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">#1 x 7\/16 in. Stainless Steel Screws<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/34lvmsA\" data-eafl-id=\"6219\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Round Nylon Spacers (H 6 mm, OD 7 mm, ID 4 mm)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fOPCIi\" data-eafl-id=\"6229\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>,<\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Mini Breadboards<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3tmLbfX\" data-eafl-id=\"6230\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>,<\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Jumper Wire Kit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3uuTAeI\" data-eafl-id=\"6231\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>,<\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Power Control Box<\/h3>\n\n\n\n<p>These materials are for building a power control box that has 4 individually-controllable outlets, allowing any 120 VAC device to be controlled by the automation system.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"> <strong>Description<\/strong><\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">6 in. x 6 in. Junction Box<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Carlon-6-in-x-6-in-x-4-in-Gray-PVC-Junction-Box-E987RR\/100404096\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">RJ45 Panel Mount Connector<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/34p6FLC\" data-eafl-id=\"6271\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">RJ45 Surface Mount Jack<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3bWaNai\" data-eafl-id=\"6272\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">RJ45 Crimper, Connectors, and Cable Test Tools<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3vCc26x\" data-eafl-id=\"6273\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">RJ45 CAT-6 Ethernet Cable (5-foot)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">IEC 320 Panel Mount Power Socket<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2REvyR3\" data-eafl-id=\"6274\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">IEC 320 Power Cord<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2SzDtPK\" data-eafl-id=\"6275\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Wall Outlets<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Leviton-Decora-15-Amp-Residential-Grade-Self-Grounding-Duplex-Outlet-Gray-R54-05325-0GS\/100117108\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">2-Gang Wall Plate<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Leviton-Decora-2-Gang-Midway-Nylon-Wall-Plate-Gray-R54-PJ262-0GY\/202059892\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">2-Channel Relay Module (Mechanical, 10-Amp)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3voJWLT\" data-eafl-id=\"6276\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">2-Channel Relay Module (Solid State, 2-Amp)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/34SsgA3\" data-eafl-id=\"6277\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">14 Gauge Copper Wire<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Southwire-25-ft-14-Black-Stranded-CU-THHN-Wire-22955985\/301084071\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Spool<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Water Condition Sensing<\/h3>\n\n\n\n<p>These materials enable various water chemistry to be measured and provides feedback for the water dosing system.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"> <strong>Description<\/strong><\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific PT-1000 Temperature Sensor Kit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fm3z1h\" data-eafl-id=\"6282\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific EZO Carrier Board (for Temperature Sensor)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fm9Z0o\" data-eafl-id=\"6283\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific pH Sensor Kit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oQLtb5\" data-eafl-id=\"6284\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific Electrical Conductivity Sensor Kit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3g2T5TZ\" data-eafl-id=\"6285\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Aquarium Specimen Container<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3umFEmU\" data-eafl-id=\"6286\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Water Dosing<\/h3>\n\n\n\n<p>These materials enable the water chemistry to be adjusted by dispensing different liquid solutions.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific Peristaltic Pump<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oTMwH7\" data-eafl-id=\"6287\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">4<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Silicone Tubing (ID 3 mm x OD 5 mm)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oPKo3e\" data-eafl-id=\"6288\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1\/8 in. Hose Barb Union<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3KvVi9g\" data-eafl-id=\"6664\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1 Pack<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">12-Volt 5-Amp DC Power Supply and Female Barrel Connector<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fQIWJE\" data-eafl-id=\"6289\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Water Flow and Level Sensing<\/h3>\n\n\n\n<p>These materials enable the measuring of water conditions that allow for the system to be monitored for proper operation.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\"><strong>Description<\/strong><\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific Flow Meter<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/atlas-scientific.com\/probes\/3-8-flow-meter\/\" target=\"_blank\" rel=\"noreferrer noopener\">Atlas Scientific<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific Flow Meter Totalizer<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3hSBpg3\" data-eafl-id=\"6290\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Atlas Scientific EZO Carrier Board<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fm9Z0o\" data-eafl-id=\"6283\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">1\/4 in. O.D. x 3\/8 in. MIP NPTF Push-to-Connect Adapter Fitting<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/John-Guest-1-4-in-O-D-x-3-8-in-MIP-NPTF-Polypropylene-Push-to-Connect-Adapter-Fitting-803359\/300753485\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3\/8 in. FIP Brass Pipe Coupling Fitting<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/www.homedepot.com\/p\/Everbilt-3-8-in-FIP-Lead-Free-Brass-Pipe-Coupling-Fitting-802109\/300096245\" target=\"_blank\" rel=\"noreferrer noopener\">Home Depot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">2<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Water Level Float Switch with Pipe Mount<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2QYmiXA\" data-eafl-id=\"6291\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Assorted Resistor Kit<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3oXnEOH\" data-eafl-id=\"6292\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Air Condition Sensing<\/h3>\n\n\n\n<p>These materials enable various air conditions to be measured.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">HTU21DF Temperature\/Humidity Sensor (or AM2315, SHT31, etc. See <a href=\"https:\/\/github.com\/kizniche\/Mycodo\/blob\/master\/mycodo-manual.rst#built-in-inputs\" target=\"_blank\" rel=\"noreferrer noopener\">Supported Sensors<\/a>)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2QZQjGw\" data-eafl-id=\"6293\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/amzn.to\/3N3pbOT\" data-eafl-id=\"6294\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/amzn.to\/3yEF0V2\" data-eafl-id=\"6295\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/www.dfrobot.com\/product-2014.html?tracking=pgcWkSCxHrHgqtReHGxyAgIlGeJRW5PZWO8Tcp9RgzRrbwJWfSL41yhj6G2Ysbn5\" data-eafl-id=\"6648\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">DFRobot<\/a>, <a href=\"https:\/\/www.dfrobot.com\/product-2160.html?tracking=pgcWkSCxHrHgqtReHGxyAgIlGeJRW5PZWO8Tcp9RgzRrbwJWfSL41yhj6G2Ysbn5\" data-eafl-id=\"6649\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">DFRobot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Dupont Crimping Tool and Connectors<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fQKjrM\" data-eafl-id=\"6296\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">MH-Z19B CO2 Sensor<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fmcJLe\" data-eafl-id=\"6297\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/www.tindie.com\/products\/carboncycle\/mh-z19b-co2-sensor-with-usb-interface\/\" target=\"_blank\">Tindie<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">UART to USB Converter (USB Interface)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3fo7Gdc\" data-eafl-id=\"6298\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Electrical Power Sensing<\/h3>\n\n\n\n<p>These materials enable the amount of power consumed by the system to be measured.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Description<\/th><th class=\"has-text-align-right\" data-align=\"right\">Purchase<\/th><th class=\"has-text-align-right\" data-align=\"right\">Quantity<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Analog-to-Digital Converter<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3bT9Csk\" data-eafl-id=\"6299\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a>, <a href=\"https:\/\/www.dfrobot.com\/product-1730.html?tracking=pgcWkSCxHrHgqtReHGxyAgIlGeJRW5PZWO8Tcp9RgzRrbwJWfSL41yhj6G2Ysbn5\" data-eafl-id=\"6647\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">DFRobot<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">AC Current Sensor with Split Transformer or <a rel=\"noreferrer noopener\" href=\"https:\/\/www.galco.com\/buy\/Greystone-Energy-Systems\/CS-650-R1\" target=\"_blank\">Greystone CS-650-R1 Solid Core Current Sensor<\/a> (only one, not both)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/3yGbSNm\" data-eafl-id=\"6300\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Extension Cord (1 ft.)<\/td><td class=\"has-text-align-right\" data-align=\"right\"><a href=\"https:\/\/amzn.to\/2RR5O3L\" data-eafl-id=\"6301\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Amazon<\/a><\/td><td class=\"has-text-align-right\" data-align=\"right\">1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3D Printed Parts<\/h3>\n\n\n\n<p>These are various 3D models of simple parts I created and printed with my 3D printer that helped with the build.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">Model 1: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.thingiverse.com\/thing:4216311\" target=\"_blank\">Sensor Probe Reservoir Lid<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">Model 2: <a rel=\"noreferrer noopener\" href=\"https:\/\/www.thingiverse.com\/thing:4216335\" target=\"_blank\">Bottle Support Mount<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3D Printer: <a href=\"https:\/\/amzn.to\/3oT5rSl\" data-eafl-id=\"6303\" data-eafl-parsed=\"1\" class=\"eafl-link eafl-link-text eafl-link-direct\" target=\"_blank\" rel=\"nofollow\">Creality Ender 5 Pro<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3D Modeling Software: <a rel=\"noreferrer noopener\" aria-label=\"Fusion 360 (opens in a new tab)\" href=\"https:\/\/www.autodesk.com\/campaigns\/fusion-360-for-hobbyists\" target=\"_blank\">Autodesk Fusion 360<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3D Slicing Software: <a rel=\"noreferrer noopener\" aria-label=\"Ultimaker Cura (opens in a new tab)\" href=\"https:\/\/ultimaker.com\/software\/ultimaker-cura\" target=\"_blank\">Ultimaker Cura<\/a><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3D Printer Control Software: <a rel=\"noreferrer noopener\" aria-label=\"OctoPi (opens in a new tab)\" href=\"https:\/\/github.com\/guysoft\/OctoPi\" target=\"_blank\">OctoPi<\/a> (<a rel=\"noreferrer noopener\" aria-label=\"OctoPrint (opens in a new tab)\" href=\"https:\/\/octoprint.org\" target=\"_blank\">OctoPrint<\/a> for the Raspberry Pi)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Building the Hydroponic System<\/h2>\n\n\n\n<p>This hydroponic system being built relies on a method known as the nutrient film technique (NFT). These systems are popular for their ease of use and the high yields that can be achieved. Plants that benefit the most from NFT are leafy greens, such as lettuces and herbs.<\/p>\n\n\n\n<p>The design of an NFT hydroponic system is simple. Water is pumped up from a reservoir to fluid channels, where the channels are placed at a slight angle to allow the water to flow from the high end to the low end by gravity, where the water is then returned to the reservoir. Plants are placed in holes cut in the top of the channels and are supported by a growth substrate. The substrate provides a place to absorb water and\/or support the plant. As the plants grow, their roots extend into the fluid flowing across the bottom of the channels. This particular design was inspired by do-it-yourself projects as well as systems built by the commercial hydroponics company <a rel=\"noreferrer noopener\" aria-label=\"AmHydro (opens in a new tab)\" href=\"https:\/\/shop.amhydro.com\/collections\/complete-nft-systems\" target=\"_blank\">AmHydro<\/a>, from which the grommets and microtubes being used in this build were purchased.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Frame<\/h3>\n\n\n\n<p>A frame is needed to support the water channels as well as the water inlet and collection pipes. One end should be higher than the other to allow water to flow through the channels by gravity. I had 1-inch punched square steel tubing left over from a previous project, so this is what I used to construct my frame (drawing below). However, there are many ways to support channels, from raising one end of a table to building a custom frame. Steel is a relatively expensive material, so I would suggest using angled aluminum bar or tubing if you&#8217;re going to design your own frame. Another inexpensive and modular option is to use <a rel=\"noreferrer noopener\" href=\"https:\/\/www.homedepot.com\/p\/3-4-in-x-10-ft-Electric-Metallic-Tube-EMT-Conduit-853429\/100400406\" target=\"_blank\">3\/4 inch electric metallic tube<\/a>, a <a rel=\"noreferrer noopener\" href=\"https:\/\/www.homedepot.com\/p\/RIDGID-1-8-in-to-1-1-8-in-Model-150-Constant-Swing-Tubing-Cutter-31622\/100018866\" target=\"_blank\">metal tube cutter<\/a>, and <a rel=\"noreferrer noopener\" href=\"https:\/\/makerpipe.com\/\" target=\"_blank\">Maker Pipe connectors<\/a>.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing-1024x673.jpg\" alt=\"\" class=\"wp-image-2329\" width=\"800\" height=\"527\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing-1024x673.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing-300x197.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing-768x505.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing-1536x1009.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Frame-Drawing-2048x1346.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption>Detailed drawing if the 1-inch square steel tube frame.<\/figcaption><\/figure><\/div>\n\n\n<p>Between 2\u00b0 and 3\u00b0 is a sufficient angle for water to flow through the channels. If the angle is too small, water may not flow fast enough through the channels and cause overflow and spillage on the inlet edge. Cut the square tubing into two 16.25-inch lengths and two 15-inch lengths, to serve as two long and two short leg sets. Cut two 23-inch lengths to attach to the top of each leg set (upon which the channels will rest), and bolt flat steel bars angled at 90\u00b0 to secure them to the legs. Secure all 90\u00b0 flat bars using 4 bolts to improve rigidity, so no cross-bracing is necessary. Cut a 24-inch length and bolt each end to each of the rear leg sets, to serve as a spine. This spine will also later serve as a support for the pumps to mount to.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Frame-02-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Frame-02-1-1024x683.jpg\" alt=\"\" class=\"wp-image-2402\" width=\"800\" height=\"532\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Frame-02-1-300x200.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Frame-02-1-768x512.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Frame-02-1-1536x1024.jpg 1536w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption>The frame with 90\u00b0 steel bars securing the rear-left leg to the spine.<\/figcaption><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Water Channels<\/h3>\n\n\n\n<p>The water channels are made by cutting vinyl gutter downspouts into five 2.5-foot segments. I used 2 in. x 3 in. downspouts, but 3 in. x 4 in. downspouts were also available, which could be a good option if you have more space or are building a system with longer channels or for larger plants. Using a hole saw, cut 1.75-inch diameter holes on the widest side of the channels, at a spacing of approximately 6 inches, on center. I alternated the cutting so when the channels were placed side-by-side, the holes alternated and formed a checkerboard pattern, which maximizes space between plants to grow. Drill a 1\/4-inch hole in the top of each channel, on the inlet side, about 3 inches from the end, which will be used to supply water to each channel. The bottom edge of the inlet side of each channel can also be heated and bent upward to reduce the chance of water spilling out in the event water backs up in the channel (e.g. due to excessive root growth or if the channel angle isn&#8217;t steep enough). Place the channels on the frame, with the inlet sides with the 1\/4 inch holes resting on the higher end.<\/p>\n\n\n\n<p>Different plants may require different channel spacing. Additionally, channels can be made with holes closely-spaced (2 inches on center) to be used as nursery channels to grow many seedlings prior to transplanting to finishing channels with wider spacing for mature plants.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Water Input<\/h3>\n\n\n\n<p>To supply water to each channel, 1-inch PVC is routed along the length of the inlet side of the frame and connected to a water pump. Cut two 11-inch PVC lengths, then cement a PVC tee in the center and PVC end caps to the ends. Screw a 1\/2-inch hose barb adapter into the tee after applying thread seal tape. Drill five 3\/8-inch holes into the inlet pipe, one in front of each channel. Remove any burs and install a microtube grommet into each hole. Secure the inlet pipe to the frame edge with zip-ties or other fasteners, just under the channels. Connect one end of a 1\/2-inch inner-diameter hose to the inlet pipe&#8217;s hose barb with a hose clamp and the other end to the water pump. Last, connect a microtube from each grommet to each channel&#8217;s 1\/4-inch inlet hole.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Channel-Inlets-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Channel-Inlets-01-1024x683.jpg\" alt=\"\" class=\"wp-image-2396\" width=\"800\" height=\"531\"\/><\/a><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Water Collection<\/h3>\n\n\n\n<p>To collect the water exiting the channels, we&#8217;ll construct an open pipe on the outlet side to route the water back to the reservoir. Cut a 22-inch length of 4-inch PVC pipe (S&amp;D PVC that I am using for this project is thinner, cheaper, and easier to work with than schedule 40 PVC, but it is not rated as food-safe. For safety, always use food-grade, schedule-40 PVC). To increase the area to open the 4-inch pipe, cut two PVC end caps to remove excess plastic so the caps are shortened to a width of about 3\/4 inch, then cement them to the ends of the pipe. Mark a straight line down the length of the pipe, from end cap to end cap, then cut the pipe along the mark. Cut about 4 inches at a 90\u00b0 angle at both ends, creating a flap that can open down the length of the pipe. Using a heat gun, slowly and evenly heat the pipe along the flap hinge while applying slight pressure to bend the flap open. Once the flap opens far enough to be able to fit the channels in, stop heating the pipe and allow it to cool and harden in the open position.<\/p>\n\n\n\n<p>Fit the channels into the pipe opening along the length of the pipe and position the pipe at the lower end of the frame to determine an optimum mounting position. In the center of the pipe, mark the lowest point where water will pool. This is where a 1.25-inch hole should be drilled to attach the bulkhead union that will drain the water back into the reservoir. Once the hole has been drilled, use a heat gun to gently heat around this hole so when the bulkhead is tightened, the curved PVC flattens so the rubber gasket of the bulkhead forms a water-tight seal. Secure the 4-inch pipe to the edge of the stand with large zip-ties or other fasteners and insert all the channels. Attach swimming pool hose to the bulkhead with a hose clamp and secure the other end in the water reservoir. Attach a nylon filter bag to the end of the hose to catch any large particles from entering the reservoir that may potentially clog the pump (e.g. rockwool, plant material, etc.).<\/p>\n\n\n\n<p>Fill the water reservoir with a few gallons of water until the pump is fully submerged. Turn the pump on and adjust the flow knob on the pump so all microtubes are outputting enough water to make a thin film of water flow down each channel. Inspect all parts of the system for leaks and monitor everything for several hours or days to ensure it continuously runs as expected. A cover should be placed over the water reservoir to reduce evaporative water loss and algae growth.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Airflow<\/h3>\n\n\n\n<p>Airflow is important for modulating temperature, humidity, carbon dioxide, oxygen, and vapor pressure deficit, as well as reducing the risk of mold growth. An airflow that gently bends the plants also promotes thickening, resulting in a more crisp taste. For both greenhouses and grow tents, adequate air circulation and exhaust is crucial to plant development. Since this system is operating in a 2 ft. x 4 ft. grow tent, small 80 mm to 150 mm PC fans are sufficient for circulating and exhausting air. A circulation fan was connected to an always-on outlet and placed near the humidifier to distribute humid air being produced. The larger fan was positioned in one of the wall ducts to blow outward and was connected to the power control box so the control software can modulate exhausting.<\/p>\n\n\n\n<p>To retain humidity when not exhausting, shutters were added to both the intake and exhaust ducts of the grow tent. Two 6-inch lengths of 4-inch PVC were cut and inserted into the ducting sleeves of the tent to provide a large opening for air to pass when the exhaust fan turns on. These PVC pieces had a flat piece of plastic placed over the opening on the inside the tent and a piece of tape used to secure the top of the plastic to the top of the pipe. Another shutter was added to the exhaust pipe on the outside of the tent. These act as simple one-way air valves that will fall flat over the openings when air isn&#8217;t being pulled into the tent and will open when the exhaust fan turns on. To improve the seals of the shutter against the PVC pipe, angle the pipes slightly upward so gravity forces the shutters to press the shutters against the pipes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lighting<\/h3>\n\n\n\n<p>I won&#8217;t spend much time discussing specific types of lighting, as this is out of the scope of this article and there are already numerous resources devoted to this. If growing outdoors with good sun exposure, you usually won&#8217;t need any additional lighting, unless you desire a nursery for seedlings or to extend growing hours beyond sunset. However, if growing indoors, you&#8217;ll need at least one grow light. I&#8217;m using a Sun Blaze (T5HO 24) 96 Watt fluorescent fixture for germinating seeds and a Galaxyhydro (HYG05) 300 Watt LED fixture for the mature plants in the grow tent. I&#8217;ve also used both lights in combination in the grow tent.<\/p>\n\n\n\n<p>The grow light puts off a lot of light and can result in poor photo quality. Since I want to capture photos with both a DSLR and Raspberry Pi camera, I needed a less bright and more neutral light source for illuminating the plants during photo acquisition. I also needed a way to turn off the grow light(s) while this secondary light was active and the photos were acquired. Although this will be covered in detail in the automation configuration, briefly, the following is how this was achieved. First, two simple outputs were created, one that controlled the switching of a light for taking photos, named <em>Photo Light<\/em>, and another that controlled the switching of the grow light, named <em>Grow Light<\/em>. Next, a Python Command Output was created, named <em>Grow Light On Only<\/em>, which executes user-defined Python commands when turned On and Off, with the On action executing code to turn <em>Photo Light<\/em> off and <em>Grow Light<\/em> on, and the Off action executing code that turns <em>Grow Light<\/em> off. Next, a Python Command Output was created, named <em>Photo Light On Only<\/em>, with the On action executing code that turns <em>Photo Light<\/em> on and <em>Grow Light<\/em> off, and the Off action executing code that turns <em>Photo Light<\/em> off and <em>Grow Light On Only<\/em> off.<\/p>\n\n\n\n<p>To understand how this works, I&#8217;ll describe how the light timer works and explain the order of operations when photos are acquired. There are two timers that are used in order to keep <em>Grow Light<\/em> on only during the chosen grow period (e.g. 6 AM to 8 PM). The first is a duration timer, that at a regular period (e.g. every 15 seconds) between 6 AM and 8 PM, will set <em>Grow Light On Only<\/em> on, if it is not already on. This will cause <em>Photo Light<\/em> to turn off and <em>Grow Light<\/em> to turn on. A second timer (a single time point timer) will set <em>Grow Light On Only<\/em> off at 8:01 PM, which will turn <em>Grow Light<\/em> off. This covers keeping the <em>Grow Light<\/em> on during the grow period.<\/p>\n\n\n\n<p>Now, the photo captures can be configured. My DSLR camera has a remote shutter cable that I wired to two outputs to activate the focus and to activate the shutter (auto focus is turned off, but this is still required by the remote shutter device to allow the shutter to actuate). I created a function that will switch the focus output, wait 1 second, then activate the shutter output, effectively causing the camera to take a photo. This function was set to repeat every 2 hours, which for a 24-frame per second video would equate to 1 second of video for every 2 days of photos. To make only the <em>Photo Light<\/em> active during the photo, I simply added the code to turn <em>Photo Light On Only<\/em> on before the code to capture the photo, and code to turn <em>Photo Light On Only<\/em> off after the code to capture the photo. When <em>Grow Light On Only<\/em> is turned on initially by the duration timer at 6 AM, only <em>Grow Light<\/em> is on. When <em>Photo Light On Only<\/em> is turned on by the time-lapse function, <em>Photo Light<\/em> is turned on and <em>Grow Light<\/em> is turned off. This provides a neutral white light for the photo. After the photo has been captured, turning <em>Photo Light On Only<\/em> off turns both <em>Photo Light<\/em> off and <em>Grow Light On Only<\/em> off (which means now no lights are on). Since the grow light timer checks every 15 seconds whether <em>Grow Light On Only<\/em> is on, and only if it&#8217;s off will it turn it on, <em>Grow Light On Only<\/em> will now be turned on, causing <em>Grow Light<\/em> to turn on.<\/p>\n\n\n\n<p>This allows a single output (<em>Photo Light On Only<\/em>) to control the state of two lights, so that only one of them is permitted to be on at any given time. The Raspberry Pi camera was set up the same way to use this light configuration, by actuating the <em>Photo Light On Only<\/em> output on before photo acquisition and off after acquisition.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Building the Automation Hardware<\/h2>\n\n\n\n<p>We&#8217;ve just finished building a basic hydroponic system that can be manually operated and monitored. Next, we&#8217;ll build the capacity for automated growing by expanding on this base system. The automation hardware is essentially everything added to the base hydroponic system that will allow autonomous monitoring and control. This includes the sensors for air, water, and power measurements, peristaltic pumps, and power control box that will modulate fans, lights, humidifier, or other devices.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Control Panel<\/h3>\n\n\n\n<p>A central location is needed for all the hardware components to interface together to the Raspberry Pi, which will orchestrate the automation processes. Weatherproof enclosures are preferred, but for this build, I chose to use 0.375-inch thick high-density polyethylene (HDPE) plastic panel to mount everything. This is a very rigid material that is easily cut with hand or power tools. Cut the panel to 12 in. x 10 in. and lay all the components on the board to experiment with different layout configurations until you find one that works well. Here are a few things to consider when developing a layout:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Wire lengths should be minimized to reduce the likelihood of introducing excessive noise or voltage-drop.<\/li><li>Cables should be secured to the panel to prevent wires from being pulled out or excessive strain on connections (unless the connector is designed for that purpose, such as BNC, SMA, etc.).<\/li><li>Avoid complex wire routing that makes following or understanding circuits difficult.<\/li><\/ul>\n\n\n\n<p>Start by connecting components with jumper wire. Below is a diagram of the Raspberry Pi and all pin designations on the 40-pin header, including ground pins, 3.3 and 5 volt pins, communication protocol pins, and the general purpose input output (GPIO) pins. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio-1024x1024.jpg\" alt=\"\" class=\"wp-image-2072\" width=\"800\" height=\"800\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio-1024x1024.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio-300x300.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio-150x150.jpg 150w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio-768x768.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/raspberry_pi_3_model_b_plus_gpio.jpg 1500w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption> Diagram of a Raspberry Pi 3 B+ pin mapping (image courtesy of <a href=\"https:\/\/www.raspberrypi-spy.co.uk\/2012\/06\/simple-guide-to-the-rpi-gpio-header-and-pins\/\">Raspberry Pi Spy<\/a>). <\/figcaption><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Breadboard-Diagram-01-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Breadboard-Diagram-01-1.png\" alt=\"\" class=\"wp-image-2066\" width=\"441\" height=\"175\"\/><\/a><figcaption>Mini solderless breadboard with a diagram of how the terminal strips connect the contact points.<\/figcaption><\/figure><\/div>\n\n\n<p>Solderless breadboards are used in this build to create many of the connections. A breadboard essentially allows us to rapidly prototype by being able to easily make and break connections. The contact points of a breadboard are connected by terminal strips to allow us to connect to a row of pins for easier access to connections if we desire multiple wires to be connected together. However, in a production setting you should use a board with <a href=\"https:\/\/amzn.to\/37cPPzB\">screw terminals<\/a> or <a href=\"https:\/\/amzn.to\/2RbQOuf\">a PCB to solder to<\/a> for more secure connections.<\/p>\n\n\n\n<p>The sections below describe how to connect the components, which should aid in developing the layout of the board. Once a good layout has been determined, place and secure the components to the board. Mark the mounting holes for each component on the board, then use an appropriate sized drill bit and screw to mount the component. For most of the components I used, a 1\/16-inch drill bit with 7\/16-inch #1 screws were sufficient. Spacers may be needed to mount some of the boards in a raised position, in order to prevent damage to components on the underside of the circuit boards if they come into contact with the mounting surface. For components without mounting holes, such as the CO<sub>2<\/sub> sensor, double-sided tape or zip-ties can be used to secure the USB cable and the sensor to the board. Last, drill two larger holes near each corner so the board can be secured to two lengths of rope hung from the grow tent frame, which will allow easy adjustment in any direction on the wall.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Connecting the Sensors, LCD, and Pump<\/h4>\n\n\n\n<p>The sensors, LCD, and pumps will all connect to the same four pins of the Raspberry Pi to enable communication. These are the ground pin, 5-volt pin, serial data (SDA) pin, and serial clock (SCL) pin. These SDA and SCL pins represent the <a rel=\"noreferrer noopener\" aria-label=\"Inter-Integrated Circuit, or I2C, bus (opens in a new tab)\" href=\"https:\/\/i2c.info\/\" target=\"_blank\">Inter-Integrated Circuit, or I<sup>2<\/sup>C, bus<\/a>, which was designed for short-distance communication with sensors and devices. Connect the ground, 5-volt, SDA, and SCL pins from the Raspberry Pi to a breadboard so each connection is broken out into its own terminal strip, allowing multiple devices to be connected to these pins on the breadboard. For the number of devices we&#8217;ll be connecting, you will need to use male-to-male jumper wires to further break out these 4 pins to as many terminal strips as needed to connect all devices (I ended up needing to use 2 mini breadboards to connect all devices). Then, connect the sensors, LCD, and peristaltic pump communication lines to these connections of the breadboard(s).<\/p>\n\n\n\n<p>The CO<sub>2<\/sub> sensor components listed on the Material&#8217;s List need RX &lt;-&gt; TX, TX &lt;-&gt; RX, power, and ground to be connected from the sensor to the UART-to-USB board. The board can then be connected to the USB port of the Raspberry Pi and can be accessed at \/dev\/ttyUSB0 (use this device later in the software configuration).<\/p>\n\n\n\n<p>The figure below is not an exact replica of the control board I built, but merely serves as an example of how to break out the I<sup>2<\/sup>C lines to connect all your devices. For a more accurate schematic, <a rel=\"noreferrer noopener\" aria-label=\"click here (opens in a new tab)\" href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Raspberry-Pi-Circuit-Diagram-05-scaled.jpg\" target=\"_blank\">click here<\/a>. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Raspberry-Pi-Circuit-Diagram-04-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Raspberry-Pi-Circuit-Diagram-04-1-1024x690.jpg\" alt=\"\" class=\"wp-image-2106\" width=\"800\" height=\"538\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Raspberry-Pi-Circuit-Diagram-04-1-1024x690.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Raspberry-Pi-Circuit-Diagram-04-1-300x202.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Raspberry-Pi-Circuit-Diagram-04-1-768x517.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Figure-Raspberry-Pi-Circuit-Diagram-04-1.jpg 1198w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption>  Circuit connecting the sensors, LCD, pumps, and float switch to the Raspberry Pi. Not pictured: analog-to-digital converter and current sensor.<\/figcaption><\/figure><\/div>\n\n\n<p><strong>Note 1<\/strong>: Make sure all your I<sup>2<\/sup>C components are 3.3-volt compatible. Never allow 5 volts to be connected to any Raspberry Pi GPIO pin or the device or Raspberry Pi can be damaged. All I<sup>2<\/sup>C devices mentioned here can operate on 3.3-volts, but if you need to use a 5-volt device on the I<sup>2<\/sup>C bus, it&#8217;s best practice to use a <ta linkid=\"2387\" href=\"http:\/\/kylegabriel.com\/projects\/link\/amazon\/8-channel-bi-directional-logic-converter\">logic converter<\/ta> to drop the voltage of SDA and SCL coming off the device down to 3.3 volts before connecting to the Raspberry Pi.<\/p>\n\n\n\n<p><strong>Note 2<\/strong>: In the schematics, you may notice I have all my I<sup>2<\/sup>C devices connected together and powered by 5 volts. There is only one circumstance when it is safe to do this, and that is if none of your devices pull SDA or SCL high to 5 volts with a resistor. Since none of the circuits of my I<sup>2<\/sup>C devices do this, it is safe to power them with 5 volts, since SDA and SCL are only pulled low for communication (<a rel=\"noreferrer noopener\" href=\"https:\/\/www.raspberrypi.org\/forums\/viewtopic.php?p=924630&amp;sid=a312daa2503b9ff3f7a9c388ab1cbc24#p924630\" target=\"_blank\">1<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/raspberrypi.stackexchange.com\/a\/68200\" target=\"_blank\">2<\/a>). This is done because, although most of my I<sup>2<\/sup>C devices are both 3.5- and 5-volt compatible, my LCD only operates on 5 volts. Rather than connect a level shifter for just the LCD, I chose to just use 5 volts for everything. If using this method, be sure you do not inadvertently allow 5 volts to pass to SDA, SCL, or any other GPIO pins of the Raspberry Pi.<\/p>\n\n\n\n<p><strong>Note 3<\/strong>: Atlas Scientific sensors and pumps are set by default to the UART communication mode, not the I<sup>2<\/sup>C communication mode. You will need to refer to the datasheet provided by Atlas Scientific for each device to manually switch each device to I<sup>2<\/sup>C mode before being able to communicate with them on the I<sup>2<\/sup>C bus. This is a simple procedure that involves making a single connection on the sensor board and then powering it for a few seconds. For example, see <a rel=\"noreferrer noopener\" aria-label=\"page 41 of the EZO Temperature circuit board datasheet (opens in a new tab)\" href=\"https:\/\/www.atlas-scientific.com\/_files\/_datasheets\/_circuit\/EZO_RTD_Datasheet.pdf#EZO-RTD.indd%3A.370156%3A1046\" target=\"_blank\">page 41 of the Temperature sensor EZO circuit board datasheet<\/a> for how to manually switch from UART to I<sup>2<\/sup>C mode.<\/p>\n\n\n\n<p><strong>Note 4<\/strong>: If mounting the air temperature and humidity sensors to the control panel, make sure to position the panel where the sensors are at the same height or slightly higher than your plants. If there isn&#8217;t vigorous mixing of air by fans, this is where a temperature and humidity gradient may form (with hotter air above this level). To yield the most accurate temperature and humidity regulation at location of your plants, the sensors should be positioned among or right above your growing plants.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/05\/DSC00162-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/05\/DSC00162-scaled.jpg\" alt=\"\" class=\"wp-image-2495\" width=\"800\" height=\"631\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/05\/DSC00162-300x237.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/05\/DSC00162-768x607.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption>Completed control panel with wires secured with cable fasteners.<\/figcaption><\/figure><\/div>\n\n\n<h4 class=\"wp-block-heading\">Connecting the Float Switch<\/h4>\n\n\n\n<p>The float sensor is a magnetic switch encased in a rigid body, with two wires. A buoyant ring containing a magnet slides up and down this body, causing the switch to open or close the circuit depending on the water level. For the Raspberry Pi to use the float sensor to detect when the water level is high or low, a simple circuit needs to be created that yields either a high voltage (3.3 volts) or low voltage (0 volts) when the switch if open or closed. A GPIO pin on the Raspberry Pi can then be set as an input and measure this signal.<\/p>\n\n\n\n<p>Briefly, to construct this circuit, connect a GPIO pin, a ground pin, and a 3.3-volt pin from the Raspberry Pi to their own terminal strips on a breadboard. Pull the GPIO connection on the breadboard low by connecting the GPIO terminal strip to the ground terminal strip using a 10 k\u03a9 resistor. Last, connect one end of the float switch to the GPIO terminal strip and the other end to the 3.3-volt strip. Below is a minimal schematic of the circuit.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Float-Sensor-Circuit-Schem-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Float-Sensor-Circuit-Schem-03.jpg\" alt=\"\" class=\"wp-image-2390\" width=\"500\" height=\"582\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Float-Sensor-Circuit-Schem-03.jpg 600w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Float-Sensor-Circuit-Schem-03-258x300.jpg 258w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><figcaption>Float sensor wiring schematic.<\/figcaption><\/figure><\/div>\n\n\n<p>When the water level is low and the buoyant ring isn&#8217;t in proximity to the magnetic switch, the circuit is open (disconnected) and the GPIO pin is connected to ground and will measure 0 volts (low). When the water level is high and the magnet actuates the switch, the circuit is closed (connected) and the GPIO will be connected to the 3.3-volt pin and will measure 3.3 volts (high). When the circuit is closed, ground and 3.3-volts is connected by the 10 k\u03a9 resistor that limits any current to a safe amount. When we monitor the GPIO pin, we can determine the water level based on whether the signal being measured is low or high. Note that either a pull-up or pull-down resistor can be used to change the voltage of the circuit when the water level is high or low. By changing this, either water level state can yield either a high or low signal. It does not matter which is used, as the software can be configured either way.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Connecting the RJ45 Surface Mount Jack<\/h4>\n\n\n\n<p>The power control box will allow the Raspberry Pi to independently control the power of four AC outlets with four relays. The control box will connect to the control panel by an RJ45 (Ethernet) surface mount jack, which will then connect to ground, 5-volt, and four GPIO pins on the Raspberry Pi. These connections will power and trigger four relay modules in the power control box, with each GPIO pin switching each relay. Make sure each connection of the RJ45 jack corresponds to the proper connection at the other end in the power control box. You can use the continuity setting of a multimeter to test each connection at both ends to ensure they&#8217;re connected. The ground and 5-volt pins of the Raspberry Pi should connect to GND and VCC of the relay modules, respectively, and each GPIO to each channel of each relay module. Once the power control box is constructed, a short Ethernet cable can connect the RJ45 jack on the control panel to the RJ45 connector on the power control box.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Liquid Solution Dispensing<\/h3>\n\n\n\n<p>Four peristaltic pumps will be used to adjust the water chemistry by dispensing small amounts of acid (lowers pH), base (raises pH), and nutrient A and B solutions (raises electrical conductivity). The pumps need to be located close to the water reservoir to reduce hose length and have enough room to accommodate four solution tanks below the pumps. I found the back horizontal bar (spine) of the frame to be an ideal mounting point.<\/p>\n\n\n\n<p>Cut another piece of HDPE panel to 12 in. x 6 in. that the pumps and solution reservoirs will be mounted to. I <a rel=\"noreferrer noopener\" aria-label=\"modeled and 3D-printed mounts to hang a 12-ounce plastic bottle (opens in a new tab)\" href=\"https:\/\/www.thingiverse.com\/thing:4216335\" target=\"_blank\">modeled and 3D-printed mounts to hang a 12-ounce plastic bottle<\/a> under each pump, but your bottles can rest on the ground or by some other mounting option. Position the pumps and mounts, mark their mounting holes on the panel, then drill 1 1\/4-inch holes for the pumps to extend through the panel and smaller holes for securing the pumps to the panel. To connect the 12-volt DC power supply to the pumps, solder 4 sets of negative and positive wires together, respectively, and connect them to the appropriate negative and positive screw terminals of the female barrel connector that the power supply male barrel connector will plug into. Then, connect each set of 12-volt wires to each pump&#8217;s power screw terminals. Last, the tubing needs to be installed to pump fluid from the bottles to the reservoir. Drill a hole into each bottle lid, then connect 5 mm tubing to each pump input and feed it to the bottom of each bottle. Last, cut four more lengths of tubing, connect them to the output lines of the pumps, then a zip-tie them all together over the reservoir.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<style type=\"text\/css\">\r\n\t#foogallery-gallery-2232 .fg-image {\r\n        width: 500px;\r\n    }\r\n<\/style>\r\n\t\t\t\t<div class=\"foogallery foogallery-container foogallery-default foogallery-lightbox-foobox fg-gutter-10 fg-center fg-default fg-light fg-border-thin fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-hover fg-hover-fade fg-hover-zoom fg-ready\" id=\"foogallery-gallery-2232\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:true},&quot;lazy&quot;:true}\" >\r\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/DSC00030-scaled.jpg\" data-attachment-id=\"2224\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img fetchpriority=\"high\" decoding=\"async\" width=\"500\" height=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/cache\/2020\/03\/DSC00030-scaled\/817148931.jpg\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22400%22%20viewBox%3D%220%200%20500%20400%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/DSC00031-scaled.jpg\" data-attachment-id=\"2225\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" width=\"500\" height=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/cache\/2020\/03\/DSC00031-scaled\/1644674492.jpg\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22400%22%20viewBox%3D%220%200%20500%20400%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\r\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Sensor Sample Reservoir<\/h3>\n\n\n\n<p>A sample reservoir was constructed to divert a small volume of water from the main reservoir for the water sensors to measure. This is done in order to sub-sample the main water reservoir, which will buffer our sensors from the immediate effects of large pH and electrical conductivity swings that can occur in the main reservoir when the pumps are dosing solutions.<\/p>\n\n\n\n<p>For the sample reservoir construction, I <a rel=\"noreferrer noopener\" aria-label=\"modeled and 3D printed a lid that fits the lid of the reservoir (opens in a new tab)\" href=\"https:\/\/www.thingiverse.com\/thing:4216311\" target=\"_blank\">modeled and 3D printed a lid that fits on the top of the sample reservoir<\/a> to hold the temperature, pH, and electrical conductivity probes. However, drilling holes in a flat piece of plastic or zip-tying the probes to the side of the sample reservoir would also work. Rubber gaskets were slid onto the EC and pH probes to prevent them from sliding all the way into the holes and allowing their height in the fluid to be adjusted. These probes will need to always be submerged in water, so inflow and outflow holes need to be added to the sample reservoir. Ensure the outflow hole is sufficiently large so water can exit the reservoir faster than it enters. Drill an outflow hole or slot on the side of the sample reservoir 2 to 4 inches above the bottom of the highest sensor probe. Drill a 1\/4-inch inflow hole near the top of the sample reservoir, on the side opposite side of the outflow hole. Since the plastic material is fragile, I used a Dremel to cut the inflow and outflow holes rather than using a drill bit. Secure the sample reservoir near the water inlet PVC pipe connected to the water pump. Make sure the water pump is turned off, then drill a 3\/8-inch hole in the inlet PVC pipe near the sample reservoir. Place a microtube grommet in this hole, then attach a microtube from the grommet to the sample reservoir. Turn the water pump back on and ensure there are no leaks and the water fills the sample reservoir before spilling back into the main reservoir.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<style type=\"text\/css\">\r\n\t#foogallery-gallery-2235 .fg-image {\r\n        width: 500px;\r\n    }\r\n<\/style>\r\n\t\t\t\t<div class=\"foogallery foogallery-container foogallery-default foogallery-lightbox-foobox fg-gutter-10 fg-center fg-default fg-light fg-border-thin fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-hover fg-hover-fade fg-hover-zoom fg-ready\" id=\"foogallery-gallery-2235\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:true},&quot;lazy&quot;:true}\" >\r\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/DSC00028-scaled.jpg\" data-attachment-id=\"2228\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" width=\"500\" height=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/cache\/2020\/03\/DSC00028-scaled\/2225065412.jpg\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22400%22%20viewBox%3D%220%200%20500%20400%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/DSC00029-scaled.jpg\" data-attachment-id=\"2229\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" width=\"500\" height=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/cache\/2020\/03\/DSC00029-scaled\/3593258107.jpg\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22400%22%20viewBox%3D%220%200%20500%20400%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\r\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Water Flow Sensing<\/h3>\n\n\n\n<p>A water flow meter can be easily installed to the water line feeding the sample reservoir, and is useful for detecting if the pump is operating properly (and notifying you when it is not). After applying thread seal tape to the flow meter, screw push-to-connect fittings to both ends of the flow meter with couplings. Cut out a section of the microtube feeding the sample reservoir that&#8217;s the length of the flow meter, then press the microtube ends into the push-to-connect fittings. Last, connect the three wires of the flow meter to the Atlas Scientific Flow Meter Totalizer on the control panel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Electrical Current Sensing<\/h3>\n\n\n\n<p>In order to measure the amount of electrical current being consumed by the system, we&#8217;ll use a transformer to measure one wire of the main alternating current (AC) power cord that powers the system, upstream from any devices that are plugged in. The transformer will convert the AC current proportionally to a DC voltage. This DC voltage will then be converted to a digital signal with an ADS1115 analog-to-digital converter connected to the Raspberry Pi. Using this voltage, the Mycodo software will then be able to calculate the amount of current that&#8217;s consumed over time, in Amps. This can be further used by Mycodo to automatically calculate the monetary cost to operate over periods of time (day, week, month, year, or custom dates) and based on your local cost per kWh.<\/p>\n\n\n\n<p>To do this, we&#8217;ll need to isolate a single wire in our power cord. I sacrificed a 1-foot extension cord rather than cutting into my power strip cord. Cut away a few inches of the external insulation of the extension cord, being careful not to cut into the insulation of the individual wires. This exposes single wires to clamp the transformer around. Depending on which current sensor used from the Material&#8217;s List, there are two ways to connect the sensor.<\/p>\n\n\n\n<p>The spit-core transformer is easier to use because it can clamp around a wire, however it is less accurate than a solid-core transformer. If using the split-core transformer, open it and close it around the live wire. From there, connect the output connector from the transformer to the current sensing board. Last, connect the negative and positive DC voltage outputs from this board to the analog-to-digital converter&#8217;s Ground and Analog 0 Input (A0) connections, respectively.<\/p>\n\n\n\n<p>A solid core transformer is more accurate than a split-core transformer, but it requires feeding a wire through the core or cutting and feeding a wire through the core before soldering the wire back together. First, ensure the cable is not plugged in. If using the solid core transformer, cut the live wire, strip their ends, and feed one end through the solid-core transformer. Solder the wire ends back together with the transformer still surrounding the wire and use heat-shrink tubing to cover the solder joint. last, connect the negative and positive DC voltage outputs from the transformer to the analog-to-digital converter&#8217;s Ground and Analog 0 Input (A0) connections, respectively.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Power Control Box<\/h3>\n\n\n\n<p>The power control box will allow the 3.3-volt DC signals from the Raspberry Pi GPIO pins to safely switch AC devices, such as grow lights, exhaust fans, humidifiers, or other devices.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Mechanical-and-SS-Relays-665x1024.png\" alt=\"\" class=\"wp-image-2048\" width=\"302\" height=\"465\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Mechanical-and-SS-Relays-665x1024.png 665w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Mechanical-and-SS-Relays-195x300.png 195w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/01\/Mechanical-and-SS-Relays.png 734w\" sizes=\"(max-width: 302px) 100vw, 302px\" \/><figcaption> 2-channel 10-Amp mechanical relay module (top) and 2-channel 2-Amp solid state relay module (bottom)<\/figcaption><\/figure><\/div>\n\n\n<p>To understand how this works, here&#8217;s a brief introduction to how the two main types of relays operate. Mechanical relays use a small input voltage to energize electromagnets that cause the physical movement of metal contacts in the output component of the relay that turns on and off much larger voltages. Solid state relays (SSRs) use a small input voltage to produce a light that shines across an air gap to energize a sensor that switches the output connections. Mechanical relays make an audible &#8220;click&#8221; sound when tuning on and off, and compared to SSRs, are less expensive, can typically handle higher electrical currents, but have a lower life expectancy, with a mean time before failure (MTBF) in the several hundred hours range. Solid state relays are silent when turning on or off, can handle lower currents, but have a high life expectancy, with a MTBF in the several million hours range (yes, million, with some as high as 40 million or more, which equates to 4566 years, under ideal conditions). Although this is not always true, as relays of course vary in their specifications, it does illustrate the general differences.<\/p>\n\n\n\n<p>I typically use mechanical relays for operations that require high current loads and slow switching, such as grow lights that only turn on or off a few times a day. I typically use SSRs for applications that may need to switch much faster, such as heating and humidity control (several switches per minute) or pulse-width modulation (PWM) signal generation (several switches per second). Although mechanical relays can often handle many applications (please don&#8217;t try PWM), increasing their rate of switching can increase their chance of failure (and be annoying as heck to hear their constant clicking). When possible, I try to only use SSRs because of their superior reliability.<\/p>\n\n\n\n<p>For these reasons, I built my power control box with two mechanical relays to handle slow-switching, high-current devices (grow lights), and 2 SSRs to handle fast-switching, low-current devices (exhaust fan and humidifier). Always adhere to the current limitations of your relays and don&#8217;t plug in any devices that could exceed 10 Amps for the mechanical relays or any that could exceed 2 Amps for the SSRs (or whatever the specific current ratings are for your particular relays). Since alternating current is dangerous, I&#8217;m protecting the circuitry and relays in a 6 x 6 inch junction box. <\/p>\n\n\n\n<p>Start by placing two sets of outlets and their cover on the junction box lid and mark where the main opening for the outlets will be. Remember to leave space for the mounting holes to secure the outlets to the lid and to use the outlet cover to ensure you&#8217;re adequately spacing the outlets. Cut the main opening in the junction box lid, drill the mounting holes, and dry-fit the outlets. On the junction box, mark the holes that needs to be cut for the panel mount power socket and the panel mount RJ45 connector near the bottom of the box. Cut each hole and dry fit each part.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01-1024x576.jpg\" alt=\"\" class=\"wp-image-2397\" width=\"800\" height=\"450\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01-1024x576.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01-300x169.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01-768x432.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01-1536x864.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-01-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<p>Next we&#8217;ll wire everything. Inside the junction box, the panel mount power socket will have 3 blade terminals, for neutral, ground, and live (diagram below). Use 14 or 16 gauge wire for all connections involving AC power, and either crimp female blade connectors or solder the wires directly to the power socket connections. I recommend using heat shrink tubing to cover all exposed AC connections. Follow the wiring instructions and diagram, below, for wiring the remaining connections.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Connect G (ground) from the power socket to the green ground connector of each outlet.<\/li><li>Connect N (neutral) from the power socket to the neutral connector of each outlet.<\/li><li>Connect L (live) from the power socket to one of the two output connectors for every relay (i.e. every relay output will control a live connection to an outlet).<\/li><li>Each remaining output connector from each relay will connect to the live connector of each outlet.<\/li><li>One Ethernet wire to the ground (-) input of each relay module.<\/li><li>One Ethernet wire to the positive (+) input of each relay module.<\/li><li>One Ethernet wire to the channel 1 signal input of the mechanical relay.<\/li><li>One Ethernet wire to the channel 2 signal input of the mechanical relay.<\/li><li>One Ethernet wire to the channel 1 signal input of the solid state relay.<\/li><li>One Ethernet wire to the channel 2 signal input of the solid state relay.   <\/li><\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"582\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02-1024x582.png\" alt=\"\" class=\"wp-image-6137\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02-1024x582.png 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02-300x171.png 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02-768x437.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02-1536x873.png 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2021\/04\/Power-Control-Box-wiring-02.png 1632w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Wiring diagram of four relays controlling mains electricity to four outlets.<\/figcaption><\/figure><\/div>\n\n\n<p><strong>Note<\/strong>: many outlets have a metal tab that connects both outlets to the same circuit (one tab for neutral, one tab for live), which can be broken off on each side. When unbroken, this allows one set of wires to power both outlets. Since we want to power each outlet independently, the live tab needs to be broken off with pliers. The neutral tab can remain intact, allowing you to connect only one neutral that will be distributed to both outlets. The diagram, above, has been drawn with the assumption there are no tabs present.<\/p>\n\n\n\n<p><strong>Warning: If you leave the live side tab intact, both outlets will be powered when either live wire is energized by either relay. The live tab must be broken to independently control each outlet. If you don&#8217;t break the tab, you will be potentially powering two devices instead of one when the relay actuates, potentially exceeding your relay&#8217;s maximum current.<\/strong><\/p>\n\n\n\n<p>Each relay will have output screw terminals that will be used to switch the AC power. Wire the power socket&#8217;s live connection to one of these output screw terminals for each relay. if there are 2 connections, it doesn&#8217;t matter which, so long as it&#8217;s connected to only one of the two relay output terminals. If there are 3 connections, connect to the normally-open (NO) connections so the power is off when the relay is not active. Next, connect the second output screw terminal of each relay to the live connector of each outlet. This will allow the live connection of each outlet to be switched by each relay. You should mark which outlets are connected to mechanical relays and which are connected to SSRs.<\/p>\n\n\n\n<p>Now connect the signal wires to the relays from the RJ45 connector inside the junction box. There are two ways to do this: A) cut a small length of raw Ethernet wire and crimp a connector on one end, or B) cut a consumer Ethernet cable leaving a short length on the end. This will give you an Ethernet cable with a connector on one end that will plug into the RJ45 connector inside the box. The other end of the Ethernet cable should have 6 of the 8 wires stripped for connecting to the relay modules. Be sure to note the color of the wires and what they&#8217;re connected to. Since there are two relay modules, the wires you designate for ground and positive will have to connect to the ground and positive of both relay modules. Much like the outlets, you can run the ground wire to the mechanical relay&#8217;s ground screw terminal (typically labeled &#8220;GND&#8221; or &#8220;DC-&#8220;), then run a short wire from that same screw terminal to the other relay&#8217;s ground connector. Since the SSR has only male header pins, you can simply cut and strip a jumper wire with a female header to make this connection. Do the same for the positive connection (typically labeled &#8220;VCC&#8221; or &#8220;DC+&#8221;). For the four relay input signal connections (typically labeled &#8220;CH#&#8221; or &#8220;IN#&#8221;, with # denoting the channel number), you will need to use four wires from the Ethernet cable. Connecting to the screw terminals is straightforward, but to connect to the SSR input signal male header pins, you will have to either crimp or solder jumper wires with female headers to the Ethernet wires.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02-1024x576.jpg\" alt=\"\" class=\"wp-image-2398\" width=\"800\" height=\"450\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02-1024x576.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02-300x169.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02-768x432.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02-1536x864.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/Figure-Control-Box-02-2048x1152.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<p>Once all the connections have been made, screw the relay modules to the bottom of the junction box using spacers and screws, screw the lid to the junction box, screw both outlets to the lid, then screw the face plate over the outlets. Connect an Ethernet cable from the external RJ45 port of the control box to the RJ45 surface mount jack of the control panel. We now have a power control box that can independently control the power to four outlets using a common Ethernet cable.<\/p>\n\n\n\n<p><strong>WARNING: Always be ready to quickly disconnect power when testing electrical devices you built yourself for the first time. No one likes to see smoke come from their hardware, but excessive damage can sometimes be avoided by quickly removing power.<\/strong><\/p>\n\n\n\n<p>Of course, if you want to buy a commercial version of a power control box like this instead of building it, <ta href=\"http:\/\/kylegabriel.com\/projects\/link\/amazon\/relay-controlled-outlet-control-box\" linkid=\"2337\">you can do that as well<\/ta>.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<style type=\"text\/css\">\r\n\t#foogallery-gallery-2247 .fg-image {\r\n        width: 500px;\r\n    }\r\n<\/style>\r\n\t\t\t\t<div class=\"foogallery foogallery-container foogallery-default foogallery-lightbox-foobox fg-gutter-10 fg-center fg-default fg-light fg-border-thin fg-shadow-outline fg-loading-default fg-loaded-fade-in fg-caption-hover fg-hover-fade fg-hover-zoom fg-ready\" id=\"foogallery-gallery-2247\" data-foogallery=\"{&quot;item&quot;:{&quot;showCaptionTitle&quot;:true,&quot;showCaptionDescription&quot;:true},&quot;lazy&quot;:true}\" >\r\n\t<div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/DSC00032-scaled.jpg\" data-attachment-id=\"2248\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" width=\"500\" height=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/cache\/2020\/03\/DSC00032-scaled\/1080831267.jpg\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22400%22%20viewBox%3D%220%200%20500%20400%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><div class=\"fg-item fg-type-image fg-idle\"><figure class=\"fg-item-inner\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/DSC00033-scaled.jpg\" data-attachment-id=\"2249\" data-type=\"image\" class=\"fg-thumb\"><span class=\"fg-image-wrap\"><img decoding=\"async\" width=\"500\" height=\"400\" class=\"skip-lazy fg-image\" data-src-fg=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/cache\/2020\/03\/DSC00033-scaled\/316613788.jpg\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22400%22%20viewBox%3D%220%200%20500%20400%22%3E%3C%2Fsvg%3E\" loading=\"eager\"><\/span><span class=\"fg-image-overlay\"><\/span><\/a><figcaption class=\"fg-caption\"><div class=\"fg-caption-inner\"><\/div><\/figcaption><\/figure><div class=\"fg-loader\"><\/div><\/div><\/div>\r\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>This concludes the hardware section of the build process and getting the hydroponic system ready to be automated with the Mycodo software. Read on to learn how to install the Raspberry Pi operating system on your Raspberry Pi and install and configure Mycodo to automate the system.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Installing and Configuring the Automation Software<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Install Raspberry Pi Operating System<\/h3>\n\n\n\n<p>Now that we have a functioning hydroponic system and all our electrical hardware has been set up, we can install the operating system and Mycodo and begin configuring the system to run autonomously.<\/p>\n\n\n\n<p>You should always <a href=\"https:\/\/github.com\/kizniche\/Mycodo\">follow the latest instructions for installing Mycodo, on GitHub<\/a>, as this will be where the most up-to-date instructions can be found.<\/p>\n\n\n\n<p>As of this article&#8217;s writing, briefly, you will need to install the Raspberry Pi operating system to a micro SD card by downloading the latest <a href=\"https:\/\/www.raspberrypi.org\/downloads\/raspberry-pi-os\/\" target=\"_blank\" rel=\"noreferrer noopener\">Raspberry Pi OS Lite Image<\/a>, then use one of the recommended flashing tools (<a rel=\"noreferrer noopener\" href=\"https:\/\/www.balena.io\/etcher\/\" target=\"_blank\">Etcher<\/a> or the new <a rel=\"noreferrer noopener\" href=\"https:\/\/www.raspberrypi.org\/documentation\/installation\/installing-images\/README.md\" target=\"_blank\">Raspberry Pi Imaging Tool<\/a>) to burn it to your micro SD card. Once the image has been flashed, you should see one of the SD card partitions recognized by your computer, labeled &#8220;boot&#8221;. Create a blank file in this boot drive named &#8220;ssh&#8221; (with no file extension). This will allow the ability to connect to the Raspberry Pi via a secure shell (SSH) connection after booting it for the first time. Also, if you would like your Raspberry Pi to automatically connect to your WiFi router, create another file on the boot drive named &#8220;wpa_supplicant.conf&#8221;. I recommend using a good text editor for this (such as <a rel=\"noreferrer noopener\" aria-label=\"Notepad++ (opens in a new tab)\" href=\"https:\/\/notepad-plus-plus.org\" target=\"_blank\">Notepad++<\/a> or <a rel=\"noreferrer noopener\" aria-label=\"Sublime Text (opens in a new tab)\" href=\"https:\/\/www.sublimetext.com\" target=\"_blank\">Sublime Text<\/a>), as Windows notepad or other simple text editors often cause errors due to extra characters they create in the files. In &#8220;wpa_supplicant.conf&#8221;, add the following text, changing &#8220;NETWORK-NAME&#8221; to your WiFi&#8217;s network name and &#8220;NETWORK-PASSWORD&#8221; to your WiFi&#8217;s password, then save.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">country=US\nctrl_interface=DIR=\/var\/run\/wpa_supplicant GROUP=netdev\nupdate_config=1\n\nnetwork={\n    ssid=\"NETWORK-NAME\"\n    psk=\"NETWORK-PASSWORD\"\n}<\/pre>\n\n\n\n<p>Insert the micro SD card into your Raspberry Pi, then plug in the power. After a minute or so, it should be connected to your WiFi. Alternatively you can connect it to your router with an Ethernet cable. Now, you will need to find the IP address of your Raspberry Pi that&#8217;s connected to your network. This can often be done by logging into your router and viewing the devices that have connected through DHCP, which should show a device named &#8220;raspberry&#8221;. Note the IP address of your Raspberry Pi. Since multicast DNS is supported by the Raspberry Pi OS, you might also be able to reach your Pi at the address raspberry.local. Open a terminal or command prompt and type <code>ping raspberry.local<\/code> and if you get a response, you&#8217;ll find your Raspberry Pi&#8217;s IP address. More information about other methods to find your Raspberry Pi&#8217;s IP address can be found <a rel=\"noreferrer noopener\" href=\"https:\/\/www.raspberrypi.org\/documentation\/remote-access\/ip-address.md\" target=\"_blank\">here<\/a>.<\/p>\n\n\n\n<p>Next, start up your favorite terminal. Linux and Mac already have terminals you can use for this, but if on windows, I recommend <a rel=\"noreferrer noopener\" aria-label=\"Putty (opens in a new tab)\" href=\"https:\/\/www.chiark.greenend.org.uk\/~sgtatham\/putty\/latest.html\" target=\"_blank\">Putty<\/a>. If on Linux\/Mac, open a terminal and use the command <code>ssh pi@192.168.0.50<\/code> replacing &#8220;192.168.0.50&#8221; with the IP address of your Raspberry Pi that you noted earlier. Putty requires settings the host to <code>pi@192.168.0.50<\/code> and port to <code>22<\/code> to connect. You should be prompted for a password, which by default is &#8220;raspberry&#8221;. Once logged in, you should be looking at a terminal with a flashing cursor at the end of <code>pi@raspberry:~ $<\/code><\/p>\n\n\n\n<p>Before installing Mycodo, it is recommended to use the command <code>sudo raspi-config<\/code> and change the default password to something more secure, set the time zone, set the wifi country, then reboot for the changes to take effect. More information about raspi-config can be found <a href=\"https:\/\/www.raspberrypi.org\/documentation\/configuration\/raspi-config.md\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Install Mycodo<\/h3>\n\n\n\n<p>Now we can install Mycodo. Again, always follow the latest <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/kizniche\/Mycodo#install-mycodo\" target=\"_blank\">instructions for installing Mycodo, on GitHub<\/a>. As of the writing of this article, it is a single command that is entered in the terminal:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl -L https:\/\/kizniche.github.io\/Mycodo\/install | bash<\/pre>\n\n\n\n<p>It will take a few minutes for Mycodo to install. Once complete, the text on the terminal will display the web address to use to access the web user interface (UI). Open a web browser to this address and you will be greeted with a screen to create a new administrator user, then the login page.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Port Forwarding<\/h3>\n\n\n\n<p>If you would like to access Mycodo from outside your local network, you will need to log in to the modem\/router that your Raspberry Pi is connected to and forward port 443 to your Raspberry Pi&#8217;s IP address. This can be as simple as forwarding external port 443 to your Pi&#8217;s port 443, or you can forward a different port, such as 5000 to 443 if you want to access your Pi from an non-standard port. Keep in mind the modem\/router that your Raspberry Pi is connected to will need to be connected to the internet for this to work. Once forwarded, you should be able to access your Raspberry Pi from anywhere with internet by visiting your modem&#8217;s IP address. Your modem&#8217;s IP can be found by visiting <a rel=\"noreferrer noopener\" aria-label=\"whatsmyip.com (opens in a new tab)\" href=\"https:\/\/whatsmyip.com\/\" target=\"_blank\">whatsmyip.com<\/a> while connected to your home network. If your modem&#8217;s IP address is 122.22.22.22, and port 443 was forwarded to port 443 of your Raspberry Pi, you can simply open a browser to https:\/\/122.22.22.22 (notice the s in https), however, if port 5000 was forwarded to port 443, then you would specify the port and navigate to https:\/\/122.22.22.22:5000.<\/p>\n\n\n\n<p>If your IP address changes, you won&#8217;t be able to connect from outside your network until you find what the new IP address is. This is where dynamic DNS can provide you a hostname that will point to your IP address, and will update when your IP address changes. This allows you to connect, for instance, to https:\/\/mypi.dyndns.org and be assured it will always forward to your modem&#8217;s current IP address. Check out <a href=\"https:\/\/freedns.afraid.org\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"freedns.afraid.org (opens in a new tab)\">freedns.afraid.org<\/a> for free dynamic DNS services.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configuring Mycodo<\/h3>\n\n\n\n<p>While following this guide, keep in mind that Mycodo is constantly being updated and what&#8217;s documented here may deviate from what can be found in the latest version of Mycodo you may have installed. Therefore, if you notice any discrepancies, it&#8217;s recommended to first refer to the <a rel=\"noreferrer noopener\" aria-label=\"Mycodo Manual (opens in a new tab)\" href=\"https:\/\/github.com\/kizniche\/Mycodo\/blob\/master\/mycodo-manual.rst\" target=\"_blank\">Mycodo Manual<\/a> (also available as <a rel=\"noreferrer noopener\" aria-label=\"PDF (opens in a new tab)\" href=\"https:\/\/kizniche.github.io\/Mycodo\/mycodo-manual.pdf\" target=\"_blank\">PDF<\/a>, <a rel=\"noreferrer noopener\" aria-label=\"HTML (opens in a new tab)\" href=\"https:\/\/kizniche.github.io\/Mycodo\/mycodo-manual.html\" target=\"_blank\">HTML<\/a>, and <a rel=\"noreferrer noopener\" aria-label=\"TEXT (opens in a new tab)\" href=\"https:\/\/kizniche.github.io\/Mycodo\/mycodo-manual.txt\" target=\"_blank\">TEXT<\/a>) before seeking <a href=\"https:\/\/github.com\/kizniche\/Mycodo#support\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"support elsewhere (opens in a new tab)\">support elsewhere<\/a>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Adding and Configuring Inputs<\/h4>\n\n\n\n<p>After logging in, ensure all inputs that are connected by I<sup>2<\/sup>C are detected by the operating system. To do this, you can either execute the command <code>i2cdetect -y 1<\/code> in a Raspberry Pi terminal or navigate to the <strong>Configure -&gt; System Information<\/strong> page on the Mycodo web UI and find the section &#8220;I<sup>2<\/sup>C Bus&#8221;. You should see an address for each I<sup>2<\/sup>C device or sensor that&#8217;s connected (figure, below).<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/figure-i2cdetect.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/figure-i2cdetect.jpg\" alt=\"\" class=\"wp-image-2204\" width=\"800\" height=\"296\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/figure-i2cdetect.jpg 728w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/03\/figure-i2cdetect-300x111.jpg 300w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<p>Navigate to the <strong>Setup -&gt; Data<\/strong> page and use the drop-down menu to search for each of your sensors and add them. The default configuration options are usually okay to use, however some inputs may need additional configuration prior to activation:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>If using the ADS1115 analog-to-digital converter, the voltage that&#8217;s measured will need to be converted to Amps. If using the clamp transformer and current sensor board listed in the Materials list, you&#8217;ll need to set your ADS1x15 Input options as follows: <em>Unscaled Unit Max<\/em> to 2 (volts), <em>Rescaled Unit Max<\/em> to 20 (amps), and <em>Rescaled Measurement<\/em> to &#8220;Electrical Current: Amp (A)&#8221;. If using the Greystone current sensor listed in the Materials List, switch the transformer&#8217;s switch to L and set your ADS1x15 Input options as follows: <em>Unscaled Unit Max<\/em> to 0 (volts), <em>Rescaled Unit Max<\/em> to 10 (amps), and <em>Rescaled Measurement<\/em> to &#8220;Electrical Current: Amp (A)&#8221;.<\/li><li>For the Water Flow Input, you&#8217;ll need to set the Flow Meter Type to &#8220;Atlas Scientific 3\/8&#8243; Flow Meter&#8221;.<\/li><li>For both the Electrical Conductivity and pH Inputs, set the <em>Temperature Compensation Measurement<\/em> to the Atlas Scientific PT-1000 temperature, which will improve accuracy by calibrating each sensor to the temperature of the water prior to acquiring measurements. Note: The PT-1000 Input will have to be created before it will be available for selection in other configuration menus.<\/li><li>For the MH-Z19 sensor, if using the UART-to-USB board, set the Input&#8217;s <em>UART Device<\/em> to &#8220;\/dev\/ttyUSB0&#8221;.<\/li><li>To set up the Input for the float sensor, add a &#8220;GPIO State&#8221; Input, then set <em>Pin (GPIO)<\/em> to the GPIO pin you used when the float sensor circuit was made, previously.<\/li><\/ul>\n\n\n\n<p>Review the rest of the Input options, then activate your Inputs.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2-506x1024.png\" alt=\"\" class=\"wp-image-2526\" width=\"800\" height=\"1619\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2-506x1024.png 506w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2-148x300.png 148w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2-768x1554.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2-759x1536.png 759w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2-1012x2048.png 1012w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Data-Mycodo-8-4-0_2.png 1490w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<p>You can then verify measurements are being successfully recorded by navigating to the <strong>Data -&gt; Live<\/strong> page (figure, below).<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2-916x1024.png\" alt=\"\" class=\"wp-image-2508\" width=\"800\" height=\"894\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2-916x1024.png 916w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2-268x300.png 268w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2-768x858.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2-1375x1536.png 1375w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Live-Mycodo-8-4-0_2.png 1490w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h4 class=\"wp-block-heading\">Adding and Configuring Outputs<\/h4>\n\n\n\n<p>First, ensure all Atlas Scientific peristaltic pumps have been <a href=\"#Connecting_the_Sensors_LCD_and_Pump\">changed to I<sup>2<\/sup>C mode<\/a>. Additionally, all pumps come from the factory set to the same I<sup>2<\/sup>C address by default, but are able to be changed with a simple command. If multiple pumps with the same address were to be connected at the same time, we wouldn&#8217;t be able to communicate with them individually. Therefore, we&#8217;ll first need to set each pump to a unique I<sup>2<\/sup>C address before they can be used independently by Mycodo. First, disconnect all pumps from the Raspberry Pi&#8217;s I<sup>2<\/sup>C bus. Then, start the Atlas Scientific I<sup>2<\/sup>C script in a terminal with the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~\/Mycodo\/env\/bin\/python ~\/Mycodo\/mycodo\/devices\/atlas_scientific_i2c.py<\/code><\/pre>\n\n\n\n<p>Next, use the &#8220;List_addr&#8221; command to list the I<sup>2<\/sup>C addresses of the connected devices. Connect one of the pumps and execute the command again to determine which address the pump is using. The pump should be using 0x63 by default, which as an integer is 100 (and is how the script should list it). Use the command &#8220;Address,100&#8221;, to start communicating with address 100. Now, you can issue the command &#8220;I2C,50&#8221; to change the address of the pump to 50 (0x32). Repeat the procedure with all four pumps, using a unique and unused address for each pump. Since the addresses 0x63, 0x64, 0x66, and 0x68 are in use by other devices, we can&#8217;t use 4 consecutive address next to the default address, so I chose to use 0x32 (50), 0x33 (51), 0x34 (52), and 0x35 (53) for my four pumps. Once all pumps have had their address changed to unique addresses, you can plug them all in at the same time, verify you&#8217;ve successfully changed their addresses, and continue with their setup.<\/p>\n\n\n\n<p>Navigate to the <strong>Setup -&gt; Output<\/strong> page and add four &#8220;On\/Off (GPIO)&#8221; and four &#8220;Atlas Scientific Pump (I2C)&#8221; outputs. Set the <em>Pin (GPIO)<\/em> for each On\/Off output (see the Raspberry Pi pin map image, above) to the pins you connected your control box signal wires to earlier. Then, test whether the outputs works by plugging in a device, such as a lamp, and clicking On for the corresponding output. Set up each pump by setting the proper <em>I<sup>2<\/sup>C Address<\/em> you set for each pump earlier, using the hex format (e.g. 0x32, 0x33, etc.). Then, test that each pump dispenses when you instruct it to dispense a volume.<\/p>\n\n\n\n<p>In line with the previously-mentioned light setup, I named my grow light output <em>Grow Light<\/em>. This is all you need to do for the output configuration for your light, if you have a simple light configuration that you only desire to control one outlet (which can have one or several lights attached to). If a second light is desired to create more neutral light for automated photography (time-lapse), add the additional light outputs, below.<\/p>\n\n\n\n<p>Create &#8220;On\/Off (GPIO)&#8221; output named <em>Photo Light<\/em> and set the GPIO pin connected to the relay controlling the output with the light used to take photos plugged in. Create an On\/Off (Python Command) output named <em>Grow Light On Only<\/em>, and set the <em>On Command<\/em> to to following, changing the IDs to correspond to the IDs of your <em>Photo Light<\/em> and <em>Grow Light<\/em> outputs:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># photo light off\ncontrol.output_off('PHOTO_LIGHT_ID', output_channel=0) \n# grow light on\ncontrol.output_on('GROW_LIGHT_ID', output_channel=0)<\/pre>\n\n\n\n<p>Set the <em>Off Command<\/em> to to following, changing the ID to correspond to the ID of your <em>Grow Light<\/em> output:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># grow light off\ncontrol.output_off('GROW_LIGHT_ID', output_channel=0)<\/pre>\n\n\n\n<p>Create an On\/Off (Python Command) output named <em>Photo Light On Only<\/em>, and set the <em>On Command<\/em> to to following, changing the IDs to correspond to the IDs of your <em>Photo Light<\/em> and <em>Grow Light<\/em> outputs:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># photo light on\ncontrol.output_on('PHOTO_LIGHT_ID', output_channel=0)\n# grow light off\ncontrol.output_off('GROW_LIGHT_ID', output_channel=0)<\/pre>\n\n\n\n<p>Set the <em>Off Command<\/em> to to following, changing the IDs to correspond to the IDs of your <em>Photo Light<\/em> and <em>Grow Light On Only<\/em> outputs:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import time\n# photo light off\ncontrol.output_off('PHOTO_LIGHT_ID', output_channel=0)\ntime.sleep(1)\n# grow light only off\ncontrol.output_off('GROW_LIGHT_ON_ONLY_ID', output_channel=0)<\/pre>\n\n\n\n<p>This allows the <em>Grow Light<\/em> to be the only light on when <em>Grow Light On Only<\/em> is turned on, then <em>Photo Light On Only<\/em> can be used to turn <em>Grow Light<\/em> off and <em>Photo Light<\/em> on during photo acquisitions. For a more detailed description of the use of these functions, see the Lighting section of this publication.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2-628x1024.png\" alt=\"\" class=\"wp-image-2507\" width=\"800\" height=\"1303\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2-628x1024.png 628w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2-184x300.png 184w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2-768x1252.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2-942x1536.png 942w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2-1256x2048.png 1256w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Output-Mycodo-8-4-0_2.png 1490w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h4 class=\"wp-block-heading\">Calibration<\/h4>\n\n\n\n<p>The peristaltic pumps as well as the pH and electrical conductivity sensors may require calibration before they operate accurately. Mycodo has built-in functions for calibrating all of these devices, and provides an easy walk-through guide to instruct you at each step of the way to calibrate them. Navigate to the <strong>More -&gt; Calibration &amp; Setup<\/strong> page and select which device you want to calibrate, then follow the instructions. Note: Inputs being calibrated will need to be deactivated prior to beginning calibration. Briefly, the steps for calibrating each device are as follows. <\/p>\n\n\n\n<p>The peristaltic pump calibration entails priming the tubing to remove all air, then instructing the pump to dispense a calibration amount, such as 10 ml. Measure how much fluid was actually dispensed (e.g. 9 ml), and input this value when prompted by the Mycodo calibration. The pump will now accurately dispense volumes and can be verified by instructing it to dispense a volume from the <strong>Setup -&gt; Output<\/strong> page and verifying it actually dispenses that amount. Make sure to calibrate all peristaltic pumps.<\/p>\n\n\n\n<p>The pH sensor calibration will require either two or three calibration solutions. A three-point calibration will yield higher accuracy than a two-point calibration, but two is still better than none. These solutions should be at 4, 7, and 10 pH. The probe should be placed in each solution and allowed to acclimate before the calibration to each standard pH solution is carried out. Rinse the probe with distilled water before being placed into the next solution. The calibration steps are repeated until all solutions have been used to calibrate.<\/p>\n\n\n\n<p>The electrical conductivity sensor will require two calibration solutions. Enter the values of the solutions when prompted, then insert the probe in the first solution and instruct Mycodo to calibrate to that solution. Rinse the probe with distilled water and repeat for the second solution.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Adding and Configuring Functions<\/h4>\n\n\n\n<p>Navigate to the <strong>Setup -&gt; Function<\/strong> page, where several functions will be created that will automate the system. They include:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Timer to turn on a grow light from 6 AM to 8 PM.<\/li><li>Function to regulate electrical conductivity and pH with the peristaltic pump outputs.<\/li><li>Function to regulate vapor pressure deficit with a humidifier and exhaust fan.<\/li><li>Function to monitor air and water temperature, water level, or other important measurements and alert by email if they fall out of acceptable ranges.<\/li><li>Timer to periodically exhaust air.<\/li><li>Other functions for your application (e.g. I&#8217;m using a timer to trigger my DSLR camera to capture photos for a high quality time-lapse).<\/li><\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2-964x1024.png\" alt=\"\" class=\"wp-image-2510\" width=\"800\" height=\"850\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2-964x1024.png 964w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2-282x300.png 282w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2-768x816.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2-1446x1536.png 1446w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0_2.png 1490w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h5 class=\"wp-block-heading\">Grow Light Schedule<\/h5>\n\n\n\n<p>Add &#8220;Trigger: Timer (Daily Span)&#8221; and &#8220;Trigger: Timer (Daily Point)&#8221; functions. For the Daily Span Timer, add an &#8220;Output (Duration)&#8221; Action, then configure the <em>Output<\/em> by selecting your Grow Light Output, setting <em>State<\/em> to &#8220;On&#8221;, then save. Next, set the <em>Start Time<\/em> to &#8220;6:00&#8221; and <em>End Time<\/em> to &#8220;20:00&#8221;, then save. For the Daily Point Timer, also add an &#8220;Output (Duration)&#8221; Action, and set the <em>Output<\/em> to your Grow Light Output and <em>State<\/em> to &#8220;Off&#8221;, then save. Next, set the <em>Start Time<\/em> to &#8220;20:01&#8221;, then save. Activate both controllers and your grow light output will remain on between 6 AM and 8 PM and turn off at 8:01 PM. If using a Photo Light output, select the Grow Light on Only output instead of the Grow Light output.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-light-schedule-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-light-schedule-2-1024x723.png\" alt=\"\" class=\"wp-image-2511\" width=\"800\" height=\"565\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-light-schedule-2-1024x723.png 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-light-schedule-2-300x212.png 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-light-schedule-2-768x543.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-light-schedule-2.png 1393w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h5 class=\"wp-block-heading\">Electrical Conductivity and pH Regulation<\/h5>\n\n\n\n<p>Add a &#8220;Controller: Conditional&#8221; function. Set the <em>Period<\/em> to &#8220;300&#8221;, then add two &#8220;Measurement (Single, Last)&#8221; Conditions, four &#8220;Output (Duration)&#8221; Actions, and one &#8220;Email (Single)&#8221; Action. Set one Measurement Condition to the pH measurement, and the other to the electrical conductivity measurement. Set the first <em>Output<\/em> to the first pump, with the <em>State<\/em> &#8220;on&#8221; and the <em>Duration<\/em> &#8220;1&#8221;, which will dispense the acid. Set the second <em>Output<\/em> to the second pump, with the <em>State<\/em> &#8220;on&#8221; and the <em>Duration<\/em> &#8220;1&#8221;, which will dispense the base. Set the third <em>Output<\/em> to the third pump, with the <em>State<\/em> &#8220;on&#8221; and the <em>Duration<\/em> &#8220;3&#8221;, which will dispense the nutrient A. Set the fourth <em>Output<\/em> to the fourth pump, with the <em>State<\/em> &#8220;on&#8221; and the <em>Duration<\/em> &#8220;3&#8221;, which will dispense the nutrient B. Last, set the Email Action to the email you would want to get alert notifications if the measurements aren&#8217;t working. Next, copy the following code to the <em>Conditional Statement<\/em>, changing &#8220;PH_MEASURE_ID&#8221; to the ID associated with the pH measurement, &#8220;EC_MEASURE_ID&#8221; to the ID associated with the electrical conductivity measurement, &#8220;IDpump1&#8221; to the pump 1 ID, &#8220;PUMP_2_ID&#8221; to the pump 2 ID, &#8220;PUMP_3_ID&#8221; to the pump 3 ID, &#8220;PUMP_4_ID&#8221; to the pump 4 ID, and &#8220;EMAIL_ID&#8221; to the email action ID. These IDs are found under each Condition or Action that was created earlier.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import time\n\n### Edit below to set desired ranges for pH and electrical conductivity ###\n\n# Desired range for electrical conductivity\nrange_ec_high = 1300\nrange_ec_low = 1000\n\n# Desired range for pH\nrange_ph_high = 6.2\nrange_ph_low = 5.5\n\n# pH range that will immediately cause a pH correction\nrange_ph_high_danger = 7.0\nrange_ph_low_danger = 5.0\n\n### Edit below to set the IDs for Conditions and Actions ###\n\ncondition_id_measurement_ph_id = \"PH_MEASURE_ID\"  # Condition: measurement, last, pH Input\ncondition_id_measurement_ec_id = \"EC_MEASURE_ID\"  # Condition: measurement, last, EC Input\naction_id_pump_1_acid = \"PUMP_1_ID\"  # Action: Pump 1 (Acid)\naction_id_pump_2_base = \"PUMP_2_ID\"  # Action: Pump 2 (Base)\naction_id_pump_3_nutrient_a = \"PUMP_3_ID\"  # Action: Pump 3 (Nutrient A)\naction_id_pump_4_nutrient_b = \"PUMP_4_ID\"  # Action: Pump 4 (Nutrient B)\naction_id_email_notification = \"EMAIL_ID\"  # Action: Email Notification\n\n### DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING ###\n\nif 'notify_ec' not in self.variables:  # Initiate EC notification timer\n    self.variables['notify_ec'] = 0\nif 'notify_ph' not in self.variables:  # Initiate pH notification timer\n    self.variables['notify_ph'] = 0\nif 'notify_none' not in self.variables:  # Initiate None measurement notification timer\n    self.variables['notify_none'] = 0\n\nmeasure_ec = self.condition(condition_id_measurement_ec_id)\nmeasure_ph = self.condition(condition_id_measurement_ph_id)\nself.logger.debug(f\"Conditional check. EC: {measure_ec}, pH: {measure_ph}\")\n\nif None in [measure_ec, measure_ph]:\n    if measure_ec is None:\n        self.message += \"\\nWarning: No EC Measurement! Check sensor!\"\n    if measure_ph is None:\n        self.message += \"\\nWarning: No pH Measurement! Check sensor!\"\n    if self.variables['notify_none'] &lt; time.time():  # Only notify every 12 hours\n        self.variables['notify_none'] = time.time() + 43200  # 12 hours\n        self.run_action(action_id_email_notification, message=self.message)  # Email alert\n    return\n\n# First check if pH is dangerously low or high, and adjust if it is\nif measure_ph &lt; range_ph_low_danger:  # pH dangerously low, add base (pH up)\n    msg = f\"pH is dangerously low: {measure_ph}. Should be > {range_ph_low_danger}. Dispensing 1 ml base\"\n    self.logger.debug(msg)\n    self.message += msg\n    self.run_action(action_id_pump_2_base)  # Dispense 1 ml base (pH up)\n    if self.variables['notify_ph'] &lt; time.time():  # Only notify every 12 hours\n        self.variables['notify_ph'] = time.time() + 43200  # 12 hours\n        self.run_action(action_id_email_notification, message=self.message)  # Email alert\nelif measure_ph > range_ph_high_danger:  # pH dangerously high, add acid (pH down)\n    msg = f\"pH is dangerously high: {measure_ph}. Should be &lt; {range_ph_high_danger}. Dispensing 1 ml acid\"\n    self.logger.debug(msg)\n    self.message += msg\n    self.run_action(action_id_pump_1_acid)  # Dispense 1 ml acid (pH down)\n    if self.variables['notify_ph'] &lt; time.time():  # Only notify every 12 hours\n        self.variables['notify_ph'] = time.time() + 43200  # 12 hours\n        self.run_action(action_id_email_notification, message=self.message)  # Email alert\n\n# If pH isn't dangerously low or high, check if EC is within range\nelif measure_ec &lt; range_ec_low:  # EC too low, add nutrient\n    self.logger.debug(f\"EC: {measure_ec}. Should be > {range_ec_low}. Dosing 3 ml Nut A, 3 ml Nut B\")\n    self.run_action(action_id_pump_3_nutrient_a)  # Dispense 3 ml nutrient A\n    self.run_action(action_id_pump_4_nutrient_b)  # Dispense 3 ml nutrient B\nelif measure_ec > range_ec_high:  # EC too high, add nutrient\n    msg = f\"EC: {measure_ec}. Should be &lt; {range_ec_high}. Need to add water to dilute!\"\n    self.logger.debug(msg)\n    if self.variables['notify_ec'] &lt; time.time():  # Only notify every 12 hours\n        self.variables['notify_ec'] = time.time() + 43200  # 12 hours\n        self.message += msg\n        self.run_action(action_id_email_notification, message=self.message)  # Email alert\n\n# If EC is in range, make sure pH is within range\nelif measure_ph &lt; range_ph_low:  # pH too low, add base (pH up)\n    self.logger.debug(f\"pH is {measure_ph}. Should be > {range_ph_low}. Dispensing 1 ml base\")\n    self.run_action(action_id_pump_2_base)  # Dispense 1 ml base (pH up)\nelif measure_ph > range_ph_high:  # pH too high, add acid (pH down)\n    self.logger.debug(f\"pH is {measure_ph}. Should be &lt; {range_ph_high}. Dispensing 1 ml acid\")\n    self.run_action(action_id_pump_1_acid)  # Dispense 1 ml acid (pH down)<\/pre>\n\n\n\n<p>Activate the controller and it will run the code every 5 minutes, which will check the pH and electrical conductivity and compare them to the first 6 variables which define the minima and maxima of the allowable ranges for pH and electrical conductivity. A pH &#8220;danger&#8221; range is first checked, which if the pH is outside this range, an email notification will be set and acid or base will be dispensed until the pH returns to within this range. Next, if the pH is within the danger range, but the pH is out of the normal range and the electrical conductivity is low, it will first add nutrients A and B at an equal ratio (1:1) in 3 ml increments until the electrical conductivity rises above the minimum that&#8217;s set. Only after the electrical conductivity is within the desired range will acid or base be added to bring the pH into the desired normal range.<\/p>\n\n\n\n<p>These order of events were chosen because nutrients are typically acidic and will lower the pH when added. If nutrients were added after the pH was adjusted, the pH could be brought back out of the desired normal range and require readjustment. By adjusting the electrical conductivity first, this issue is avoided. The only exception is if the pH becomes so low or high that it falls outside the designated danger range, which will trigger an email notification and cause the pH to be immediately adjusted with acid or base until it falls back within the danger range. Once back within this range, electrical conductivity can be adjusted again. For instance, this prevents the pH from becoming dangerously acidic if a large amount of water is replaced in the system, requiring a large amount of nutrient solution to be dispensed to being the electrical conductivity back to the desired range. This large amount of nutrient solution will significantly lower the pH, which doesn&#8217;t usually occur under normal operating conditions, where small amounts of nutrients are added at a time. Another benefit of this is the email notification that the pH is found to be at an extreme, which could also indicate something is wrong with the system.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3-710x1024.png\" alt=\"\" class=\"wp-image-2512\" width=\"800\" height=\"1154\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3-710x1024.png 710w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3-208x300.png 208w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3-768x1108.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3-1065x1536.png 1065w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-regulate-ep-and-ph-3.png 1396w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h5 class=\"wp-block-heading\">Vapor Pressure Deficit Regulation<\/h5>\n\n\n\n<p>To effectively adjust the vapor pressure deficit, a humidifier and exhaust fan is required. Essentially, we will change the vapor pressure deficit to an ideal range for plant health by either adding humidity with a humidifier or removing humidity and heat with an exhaust fan. Add a &#8220;Controller: PID&#8221; function, then set the following options: <em>Measurement<\/em> to &#8220;vapor pressure deficit&#8221; (this should be a measurement included with a temperature\/humidity sensor), <em>Direction<\/em> to &#8220;Both&#8221;, <em>Setpoint<\/em> to &#8220;850&#8221;, <em>Band<\/em> to &#8220;350&#8221;, <em>Kp Gain<\/em> to &#8220;0.05&#8221;, <em>Ki Gain<\/em> to &#8220;0.05&#8221;, <em>Kd Gain<\/em> to &#8220;0.01&#8221;, <em>Integrator Min<\/em> to &#8220;-1000&#8221;, <em>Integrator Max<\/em> to &#8220;1000&#8221;, <em>Output (Raise)<\/em> to &#8220;Exhaust Output&#8221;, <em>Min On Duration (Raise)<\/em> to &#8220;5&#8221;, <em>Output (Lower)<\/em> to the &#8220;Humidifier Output&#8221;, and <em>Min On Duration (Lower)<\/em> to &#8220;5&#8221;. Save, then activate the controller.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-vpd.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-vpd.png\" alt=\"\" class=\"wp-image-2458\" width=\"800\" height=\"523\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-vpd.png 1003w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-vpd-300x197.png 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-vpd-768x503.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h5 class=\"wp-block-heading\">Configure Email Notification\/Alert Settings<\/h5>\n\n\n\n<p>For email notifications to work, you&#8217;ll have to first configure an email address that will be used to send the emails. Gmail is a good option, but you will have to <a rel=\"noreferrer noopener\" aria-label=\"Enable Less-Secure Apps (opens in a new tab)\" href=\"https:\/\/support.google.com\/accounts\/answer\/6010255?hl=en\" target=\"_blank\">Enable Less-Secure Apps<\/a> for the account first. You may want to create a new Gmail address only to be used with sending Mycodo notification emails. Your email credentials should be entered on the <strong>Configure -&gt; Alerts<\/strong> page. Once you have configured the required settings, enter your email address and click &#8220;Send Test Email&#8221; to test whether your settings worked.<\/p>\n\n\n\n<p>There are many alerts that can be created to notify you by email when a measurement deviates from a set range, but I&#8217;ll document how to create two, and these examples can be used to create ones for other measurements. Of the notifications I&#8217;ve used, the most important are knowing when a measurement isn&#8217;t being acquired, which indicates a sensor issue, knowing when the water level is low so I can replenish the water reservoir, and knowing that the water and air temperatures are within an acceptable range.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Email Notification for Air Temperature<\/h5>\n\n\n\n<p>Add a &#8220;Controller: Conditional&#8221; function. Add the Condition &#8220;Measurement (Single, Last), and set it to the measurement you want to monitor (e.g. air temperature). Add the Action &#8220;E-Mail (Single)&#8221; and set it to the email address you will want to be notified. If you want to edit or add email addresses, this can be done from the user configuration menu. Copy the following code to the <em>Conditional Statement<\/em>, then replace &#8220;asdf1234&#8221; with the ID associated with your Measurement Condition, and &#8220;qwer5678&#8221; with the ID associated with your Email Action.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">air_temperature_C_high = 35\nair_temperature_C_low = 5\n\nair_temperature = self.condition(\"{asdf1234}\")\n\nif air_temperature is not None:\n    if air_temperature > air_temperature_C_high:\n        self.message += \"Air temperature is too high! ({} C) \\n\".format(air_temperature)\n    elif air_temperature &lt; air_temperature_C_low:\n        self.message += \"Air temperature is too low! ({} C) \\n\".format(air_temperature)\n    else:\n        return\n    self.run_action(\"{qwer5678}\", message=self.message)\nelse:\n    self.message += \"Cold not find an air temperature measurement. Check your sensor!\"\n    self.run_action(\"{qwer5678}\", message=self.message)<\/pre>\n\n\n\n<p>The two variables at the top set the minimum and maximum allowed temperatures. If the measured temperature falls outside this range, a message is generated and emailed informing the user the temperature is too high or too low. An email notification is also sent if a measurement cannot be found, indicating there may be an issue with the sensor.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-monitor-air-temp.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-monitor-air-temp.png\" alt=\"\" class=\"wp-image-2460\" width=\"800\" height=\"807\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-monitor-air-temp.png 1002w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-monitor-air-temp-298x300.png 298w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-monitor-air-temp-150x150.png 150w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-monitor-air-temp-768x774.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h5 class=\"wp-block-heading\">Email Notification for Water Level<\/h5>\n\n\n\n<p>Add a &#8220;Controller: Conditional&#8221; function. Add the Condition &#8220;Measurement (Single, Last), and set it to the GPIO State Input measurement. Add the Action &#8220;E-Mail (Single)&#8221; and set it to the email address you will want to be notified. Copy the following code to the <em>Conditional Statement<\/em>, then replace &#8220;asdf1234&#8221; with the ID associated with your Measurement Condition, and &#8220;qwer5678&#8221; with the ID associated with your Email Action.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">bool_water_float = self.condition(\"{asdf1234}\")\n\nif bool_water_float is not None:\n    if bool_water_float == 1:\n        self.message += \"The water level is low. Add water.\\n\"\n        self.run_action(\"{qwer5678}\", message=self.message)\nelse:\n    self.message += \"No water float measurement found!\"\n    self.run_action(\"{qwer5678}\", message=self.message)<\/pre>\n\n\n\n<p>This code is configured to send an email notification that the water level is low when the float sensor GPIO is pulled to 3.3-volts (high). If, however, your float sensor circuit pulls the GPIO pin low (0 volts) when the water level is low, change line 4 from this:<br><code>    if bool_water_float == 1:<\/code><br>to this:<br><code>    if bool_water_float == 0:<\/code><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Exhaust Timer<\/h5>\n\n\n\n<p>Add a &#8220;Trigger: Timer (Duration)&#8221; function, then add the Action &#8220;Output (Duration)&#8221; and set it to the exhaust output and the <em>State<\/em> to &#8220;on&#8221; and the <em>Duration<\/em> to &#8220;60&#8221; seconds, then save the Action. Set the function <em>Period<\/em> to &#8220;3600&#8221;, save, then activate. This will turn the exhaust fan on for 60 seconds every 3600 seconds (1 hour).<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-timer-exhaust.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-timer-exhaust.png\" alt=\"\" class=\"wp-image-2461\" width=\"800\" height=\"280\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-timer-exhaust.png 1004w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-timer-exhaust-300x105.png 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/04\/Screenshot_2020-04-25-hydra-Function-Mycodo-8-4-0-timer-exhaust-768x270.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h5 class=\"wp-block-heading\">DSLR Camera Timelapse<\/h5>\n\n\n\n<p>The following configures a DSLR camera to acquire photos at a regular interval using a secondary neutral light described previously in this publication. This configuration also makes use of two additional outputs that control a remote shutter cable connected to the camera by activating one output to actuate the focus (<em>DSLR Focus<\/em>) and another output to activate the shutter (<em>DSLR Shutter<\/em>). You may need to adjust your configuration to suit your needs if your system operates differently than this.<\/p>\n\n\n\n<p>Add a &#8220;Controller: Conditional&#8221; function and set <em>Period (Seconds)<\/em> to 7200 to capture photos every 2 hours (or any other desired period). Add the Action &#8220;Output (Duration)&#8221; and set <em>Controller ID<\/em> to the &#8220;Photo Light On Only&#8221; output and the <em>State<\/em> to &#8220;on&#8221;. Add the Action &#8220;Output (Duration)&#8221; and set <em>Controller ID<\/em> to the &#8220;Photo Light On Only&#8221; output and the <em>State<\/em> to &#8220;off&#8221;. Add the Action &#8220;Output (Duration)&#8221; and set <em>Controller ID<\/em> to the &#8220;DSLR Focus&#8221; output and the <em>State<\/em> to &#8220;on&#8221;. Add the Action &#8220;Output (Duration)&#8221; and set <em>Controller ID<\/em> to the &#8220;DSLR Focus&#8221; output and the <em>State<\/em> to &#8220;off&#8221;. Add the Action &#8220;Output (Duration)&#8221; and set <em>Controller ID<\/em> to the &#8220;DSLR Shutter&#8221; output and the <em>State<\/em> to &#8220;on&#8221;. Add the Action &#8220;Output (Duration)&#8221; and set <em>Controller ID<\/em> to the &#8220;DSLR Shutter&#8221; output and the <em>State<\/em> to &#8220;off&#8221;. Copy the following code to the <em>Conditional Statement<\/em>, then replace &#8220;PHOTO_LIGHT_ON_ONLY_ON_ID&#8221; with the ID associated with the Condition turning <em>Photo Light On Only<\/em> on, &#8220;PHOTO_LIGHT_ON_ONLY_OFF_ID&#8221; with the ID associated with the Condition turning <em>Photo Light On Only<\/em> off, &#8220;DSLR_FOCUS_ON_ID&#8221; with the ID associated with the Condition turning <em>DSLR Focus<\/em> on, &#8220;DSLR_FOCUS_OFF_ID&#8221; with the ID associated with the Condition turning <em>DSLR Focus<\/em> off, &#8220;DSLR_SHUTTER_ON_ID&#8221; with the ID associated with the Condition turning <em>DSLR Shutter<\/em> on, and &#8220;DSLR_SHUTTER_OFF_ID&#8221; with the ID associated with the Condition turning <em>DSLR Shutter<\/em> off.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import time\n\nself.run_action(\"{PHOTO_LIGHT_ON_ONLY_ON_ID}\")  # Photo Light On Only (ON)\ntime.sleep(3)\n\nself.run_action(\"{DSLR_FOCUS_ON_ID}\")  # Stage 1 On\ntime.sleep(1)\nself.run_action(\"{DSLR_SHUTTER_ON_ID}\")  # Stage 2 On\ntime.sleep(1)\nself.run_action(\"{DSLR_SHUTTER_OFF_ID}\")  # Stage 2 Off\ntime.sleep(1)\nself.run_action(\"{DSLR_FOCUS_OFF_ID}\")  # Stage 1 Off\n\nself.run_action(\"{PHOTO_LIGHT_ON_ONLY_OFF_ID}\")  # Photo Light On Only (OFF)<\/pre>\n\n\n\n<p>This will turn only the <em>Photo Light<\/em> on during the photo capture. For a more detailed description of how this works, see the previous two sections discussing Lighting and Outputs.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Adding and Configuring the LCD<\/h4>\n\n\n\n<p>On the <strong>Setup -&gt; Function<\/strong> page, add a &#8220;20&#215;4 Generic LCD&#8221; (or &#8220;16&#215;2 Generic LCD&#8221; if using a 16 character, 2 line LCD). Set the <em>Address (I<sup>2<\/sup>C)<\/em> to the address of your LCD and the <em>Period<\/em> to how often you want the LCD to update or display the next set of lines. For configuring what is displayed on the LCD, there are display sets. By default, there is one display set, which is a set of data you can set to be displayed on the lines of the LCD. If you would like to display more data, you can change &#8220;Number of Line Sets&#8221; from 1 to your desired number of line sets to be displayed. You can create as many display sets as desired. The <em>Period<\/em> will determine how often the display cycles between these display sets. Activate the LCD and verify the LCD starts displaying data.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-LCD-Mycodo-8-4-0-lcd_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-LCD-Mycodo-8-4-0-lcd_2-1024x968.png\" alt=\"\" class=\"wp-image-2513\" width=\"800\" height=\"756\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-LCD-Mycodo-8-4-0-lcd_2-1024x968.png 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-LCD-Mycodo-8-4-0-lcd_2-300x284.png 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-LCD-Mycodo-8-4-0-lcd_2-768x726.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-LCD-Mycodo-8-4-0-lcd_2.png 1490w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption>LCD Function &#8211; Newer versions of the software may look different.<\/figcaption><\/figure><\/div>\n\n\n<h4 class=\"wp-block-heading\">Adding and Configuring the Camera<\/h4>\n\n\n\n<p>If using a Raspberry Pi camera, ensure it&#8217;s properly connected and it has been enabled through the menu accessible with the command <code>sudo raspi-config<\/code> or from the <strong>Configure -&gt; Raspberry Pi<\/strong> menu. Make sure you reboot after enabling the camera for your changes to take effect.<\/p>\n\n\n\n<p>Navigate to the <strong>More -&gt; Camera<\/strong> page, select the &#8220;PiCamera&#8221; <em>Library<\/em> (or &#8220;opencv&#8221; or &#8220;fswebcam&#8221; if using a USB camera), then click Add. Click &#8220;Capture Still&#8221; to see if an image can be acquired from the camera. There are a number of options that can be configured, including <em>Output<\/em>, which is the output to be turned on prior to acquiring an image. This is useful for taking photos at night by turning on a light while the photo is being acquired. See the previous Lighting and Output sections for descriptions of a custom lighting configuration that enables activating a photo light if you desire more neutral lighting during photos than your grow light can provide. The setting <em>Duration (Output)<\/em> is the number of seconds to turn the output on prior to taking the photo, which is useful if your lights take several seconds to turn on or warm up (such as with fluorescent bulbs). There are also options for setting the still image and live streaming resolutions. It&#8217;s advised to first test with the default settings, as certain settings combinations may prevent images from being acquired properly.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59-715x1024.png\" alt=\"\" class=\"wp-image-2515\" width=\"800\" height=\"1146\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59-715x1024.png 715w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59-209x300.png 209w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59-768x1100.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59-1072x1536.png 1072w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59-1429x2048.png 1429w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/screenshot-192.168.0.6-2020.06.02-22_05_59.png 1490w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h4 class=\"wp-block-heading\">Adding and Configuring a Dashboard<\/h4>\n\n\n\n<p>On the <strong>Data -&gt; Dashboard<\/strong> page, there are many types of widgets that can be added, organized by dragging, and resized. Perhaps the most useful widget is the Graph. Graphs allow you to select any number of Inputs, Outputs, PID controllers, and other measurements to be displayed on a historical graph. Graphs are updated automatically with new data, so you always see the latest measurements. There are also a number of settings to tune the graph to your liking, including the x-axis duration, series colors, and range selector, among others. You can also create multiple dashboards to organize different views, or to prevent one dashboard from becoming too cluttered. I won&#8217;t go into too much detail here, but suffice to say, configuring a dashboard and exploring the various widgets is one of the more fun experiences in Mycodo.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2.png\" alt=\"\" class=\"wp-image-2516\" width=\"800\" height=\"2241\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2.png 1490w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2-107x300.png 107w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2-768x2152.png 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2-548x1536.png 548w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/Screenshot_2020-04-25-hydra-Default-Dashboard-Mycodo-8-4-0-dashboard_2-731x2048.png 731w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Automation Epilogue<\/h3>\n\n\n\n<p>Now that automation has been set up and is running, you&#8217;ll want to run your system for at least a few days before entrusting it to care for your plants. This will give you a chance to find potential issues and correct them. You&#8217;ll want to ensure the system can properly adjust nutrients and pH. You can test this by removing water from the reservoir and replacing it with fresh water, which should raise the pH and lower the electrical conductivity. You should also ensure lighting, exhaust, and other functions are operating as expected.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Plant Cultivation<\/h2>\n\n\n\n<p>Once Mycodo has been configured and monitored for a sufficient amount of time to determine it&#8217;s operating as expected, it&#8217;s safe to begin growing plants.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Biocontrol<\/h3>\n\n\n\n<p>With the system operational, it&#8217;s only a matter of when, not if, undesirable microorganisms will find the large amount of nutrient-rich water and begin to feast, potentially causing plant disease and crop loss. It&#8217;s far easier to initially establish desirable microorganisms in the system at the beginning to competitively-exclude undesirable microbes, than to try to exclude undesirable microbes later if they&#8217;ve been allowed established themselves. Therefore, I recommend inoculating a new water system with a healthy community of microorganisms.<\/p>\n\n\n\n<p>There is debate about the best method for doing this, but what&#8217;s worked for me is introducing a small soil sample as well as a commercial biocontrol agent. The soil will introduce a large number of soil-associated microorganisms and the biocontrol agent will inoculate the system with a known beneficial microorganism known to combats pathogens. To inoculate with soil, I placed 20 g of potting soil in a small mesh bag and steeped it in the water reservoir for 30 minutes. For the biocontrol agent, I chose to use the bacterium <em>Streptomyces griseoviridis<\/em>, which has been observed to combat pathogens and increase yields. This bacterium is sold under the commercial name <ta linkid=\"2262\" href=\"http:\/\/kylegabriel.com\/projects\/link\/amazon\/mycostop-biocontrol-2-g\">Mycostop<\/ta>. This microorganism develops a mutualistic relationship with plant roots, known as the rhizophere, providing a benefit to both the bacterium and the plant. Bacteria of the genus <em>Streptomyces<\/em> are known to produce numerous antimicrobial compounds, and this is believed to be <a rel=\"noreferrer noopener\" aria-label=\"how this organism confers protection to the plants it colonizes (opens in a new tab)\" href=\"http:\/\/www.agbio-inc.com\/mycostop-research-results.html\" target=\"_blank\">how this organism confers protection to and improves the health of plants it colonizes<\/a>. This organism is of a natural origin (non-GMO), food-safe, used in commercial food production, and is certified organic. Mycostop can be purchased in different amounts, from <ta linkid=\"2262\" href=\"http:\/\/kylegabriel.com\/projects\/link\/amazon\/mycostop-biocontrol-2-g\">2 grams<\/ta> to several kilograms. A two-gram packet is more than enough for several inoculations of a small water system.<\/p>\n\n\n\n<p>It should be noted that deep-cleaning to remove potential contaminants is not advised (unless you had a particularly bad contamination occur), as this could negatively impact the established <em>S. griseoviridis<\/em> and other beneficial microbes. Rather, it is recommended not to use any chemical or mechanical cleaning methods following inoculation of biocontrol agents. This is the beauty of biocontrol. Rather than decontaminating undesired microorganisms following an infection, we&#8217;ve purposefully established a beneficial community that will compete with any pathogens trying to establish themselves. Although this is will not be able to combat every pathogen, as long as we support the health of our beneficial microorganisms, we&#8217;ve conferred reasonable protection to our system. You should still monitor the health of your plants and respond quickly to any decreases in health or yields by assessing the underlying cause and developing actions to mitigate the issue.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Planting Seeds<\/h3>\n\n\n\n<p>Before planting, you should consider the quantity and rate you would like to harvest. If you plant to the maximum capacity of your system, you will harvest a large amount at once, with long periods between harvests. However, if you stagger your planting, your harvests will be staggered as well, with smaller harvests at a more frequent rate. Below is one example schedule for growing lettuce in a system using 6 channels with 10 planting holes per channel, that will continually yield a 10-plant harvest every week, starting at the 8th week. Note that every week 10 seeds are planted, however you might consider planting 11 or 12 seeds to ensure you have enough to fill the entire channel should some seedlings not perform well.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Week<\/th><th class=\"has-text-align-left\" data-align=\"left\">Actions<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">1<\/td><td class=\"has-text-align-left\" data-align=\"left\">Start 10 seeds germinating (set A)<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">2<\/td><td class=\"has-text-align-left\" data-align=\"left\">Continue growing seeds in nursery tray (set A).<br>Start 10 seeds germinating (set B).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">3<\/td><td class=\"has-text-align-left\" data-align=\"left\">Plant 10 seedlings (set A) in channel 1.<br>Continue growing seeds in nursery tray (set B).<br>Start 10 seeds germinating (set C).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">4<\/td><td class=\"has-text-align-left\" data-align=\"left\">Plant 10 seedlings (set B) in channel 2.<br>Continue growing seeds in nursery tray (set C).<br>Start 10 seeds germinating (set D).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">5<\/td><td class=\"has-text-align-left\" data-align=\"left\">Plant 10 seedlings (set C) in channel 3.<br>Continue growing seeds in nursery tray (set D).<br>Start 10 seeds germinating (set E).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">6<\/td><td class=\"has-text-align-left\" data-align=\"left\">Plant 10 seedlings (set D) in channel 4.<br>Continue growing seeds in nursery tray (set E).<br>Start 10 seeds germinating (set F).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">7<\/td><td class=\"has-text-align-left\" data-align=\"left\">Plant 10 seedlings (set E) in channel 5.<br>Continue growing seeds in nursery tray (set F).<br>Start 10 seeds germinating (set G).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">8<\/td><td class=\"has-text-align-left\" data-align=\"left\">Harvest plants from channel 1.<br>Plant 10 seedlings (set F) in channel 6.<br>Continue growing seeds in nursery tray (set G).<br>Start 10 seeds germinating (set H).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">9<\/td><td class=\"has-text-align-left\" data-align=\"left\">Harvest plants from channel 2.<br>Plant 10 seedlings (set G) in channel 1.<br>Continue growing seeds in nursery tray (set H).<br>Start 10 seeds germinating (set I).<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">&#8230;<\/td><td class=\"has-text-align-left\" data-align=\"left\">Continue this cycle and you will have a harvest of 10 mature lettuce plants every week.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For hydroponic systems, seeds are planted in supporting substrates rather than nutritive substrates like soil. These are typically in the form of small cubes with a hole in the center to plant a seed. Place one or two seeds in each cube&#8217;s hole, then place your substrates in a germination tray. Hydrate the cubes with pure water. Don&#8217;t use the water from the hydroponic system, as the fertilizer concentration will likely be too high and germination may be disrupted or the seedling may become injured or have its growth stunted. If there&#8217;s a significant amount of excess water that drained from the cubes while hydrating them, pour it out from the tray to reduce the risk of microbial growth. Leave only the water in the cubes and a small amount on the bottom of the tray. Place a lid on the tray to retain humidify and place the tray in a warm area or on top of a heating mat. Check periodically that the cubes are still moist and add water as needed.<\/p>\n\n\n\n<p>It will generally take a few days to a week for your plants to germinate, depending on the seed. Once the seeds have germinated, start watering them with a dilute nutrient solution, roughly 1\/4 to 1\/2 the concentration of your hydroponic system (300 &#8211; 500 \u03bcS\/cm), and expose them to light. Grow the seedlings in the nursery tray for a week or two until the first sets of true leaves form. This acclimates the plants to handle the more intense growing conditions of the hydroponic system. Make sure you supply your seedlings with ample light to prevent excessive etiolation (Josse and Halliday 2008). If long, weak stem growth is observed, increase the light intensity. You can also slowly increase the nutrient concentration to acclimate them to a higher concentration prior to transferring to the hydroponic system. Once the seedlings are about 2 to 3 inches tall, break apart the individual cubes and place one cube in each hole of the hydroponic channels.<\/p>\n\n\n\n<p>Planted in this tutorial were the <a rel=\"noreferrer noopener\" href=\"https:\/\/www.johnnyseeds.com\/vegetables\/lettuce\/salanova-lettuce\/salanova-premier-collection-pelleted-lettuce-seed-3073JP.50.html\" target=\"_blank\">Salanova Premier Collection pelleted lettuce seeds<\/a> (red oakleaf, red butter, green oakleaf, and green butter lettuces) and <a rel=\"noreferrer noopener\" href=\"https:\/\/www.johnnyseeds.com\/herbs\/basil\/genovese-basil\/genovese-organic-pelleted-basil-seed-911GP.11.html\" target=\"_blank\">Genovese pelleted basil seeds<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Maturation<\/h3>\n\n\n\n<p>Over the next few weeks, as your plants mature, you may need to adjust nutrient concentration, light intensity, air\/water temperature, vapor pressure deficit, or other parameters. Pay attention to the health of your plants and respond to any irregularities by researching and investigating the symptoms you observe to develop an understanding of the potential causes and to develop corrective measures. It may take several attempts before you develop the skill and knowledge to consistently yield bountiful harvests.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_180012-1-1024x699.jpg\" alt=\"\" class=\"wp-image-2523\" width=\"800\" height=\"544\"\/><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_175954-1-1024x654.jpg\" alt=\"\" class=\"wp-image-2524\" width=\"800\" height=\"510\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_175954-1-1024x654.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_175954-1-300x192.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_175954-1-768x491.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_175954-1-1536x981.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200419_175954-1-2048x1308.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure><\/div>\n\n\n<p>For these lettuce varieties, be cautious of using too much light or too high of a nutrient concentration, as this can cause your plants to grow too fast, resulting in dense center leaf crowding, curled leaf tips, and tip burn. Expect that some degree of tuning will be required to develop a configuration for optimal plant growth in your particular system. I recommend <a rel=\"noreferrer noopener\" aria-label=\"searching the scientific literature (opens in a new tab)\" href=\"https:\/\/scholar.google.com\" target=\"_blank\">searching the scientific literature<\/a> for optimal parameters for your particular crop in order to develop a good base from which to begin tuning. There is already ample literature on hydroponic lettuce cultivation and optimal parameters for nutrients (Gent 2003; Cometti et al. 2013), temperature (Thompson et al. 1998; Gent 2016), and light (Korkmaz et al. 1999; Gent 2014; Zhang et al. 2018), among others.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Harvest<\/h3>\n\n\n\n<p>The lettuces grown in this article will typically be ready to harvest in approximately 4 to 6 weeks after planting, depending on the light intensity, nutrient concentration, and temperature. To harvest, simply pull the plant out of the growth channel. These lettuces are highly perishable, so it&#8217;s advised to harvest as close to the time you&#8217;re going to use them. If storing for later use, place them in a refrigerator at or below 40 \u00b0F. These varieties of lettuce are convenient to prepare because they can be broken into individual leaves by removing the base of the stem from the bottom, either by twisting with your hand or cutting with a small knife.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_141349-1024x740.jpg\" alt=\"\" class=\"wp-image-2529\" width=\"800\" height=\"578\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_141349-1024x740.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_141349-300x217.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_141349-768x555.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_141349-1536x1109.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_141349-2048x1479.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_142026-1024x759.jpg\" alt=\"\" class=\"wp-image-2530\" width=\"800\" height=\"592\" srcset=\"https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_142026-1024x759.jpg 1024w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_142026-300x222.jpg 300w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_142026-768x569.jpg 768w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_142026-1536x1139.jpg 1536w, https:\/\/kylegabriel.com\/projects\/wp-content\/uploads\/sites\/3\/2020\/06\/20200407_142026-2048x1518.jpg 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Future Directions<\/h2>\n\n\n\n<p>There&#8217;s a lot of possible modifications that can be made to improve or expand this system. Here are just a few that came to mind:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Add a <ta linkid=\"2367\" href=\"http:\/\/kylegabriel.com\/projects\/link\/amazon\/atlas-scientific-dissolved-oxygen-kit\">dissolved oxygen sensor<\/ta> to monitor the water dissolved oxygen (DO) concentration or couple it with an air pump and air stone to regulate the amount of DO in the water system.<\/li><li>Add an <ta linkid=\"2368\" href=\"http:\/\/kylegabriel.com\/projects\/link\/amazon\/atlas-scientific-oxidation-reduction-potential-kit\">oxidation-reduction potential sensor<\/ta> to monitor the water oxidation-reduction potential (ORP) or couple it with peristaltic pumps and solutions to regulate ORP.<\/li><li>Add ducting to the lighting fixtures to reduce heat buildup in the grow tent by exhausting it outside the tent.<\/li><li>Add a solenoid valve to automatically open the flow of a fresh water source to the reservoir when the level gets low.<\/li><li>Add an air or water heater to maintain an optimal temperature in cold environments.<\/li><li>Add a dehumidifier or additional exhaust mechanisms to regulate vapor pressure deficit in high humidity environments.<\/li><li>Add a thermal pad with a temperature sensor to regulate a consistent temperature for germinating trays of seeds in a nursery area prior to planting in the channels.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Log In to View My System<\/h2>\n\n\n\n<p>My system was open to guest logins for the first month after this article&#8217;s release, and has now been disabled while I work on my next project. Check back soon for my next article.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>Barbosa GL, Gadelha FDA, Kublik N, Proctor A, Reichelm L, Weissinger E, Wohlleb GM, Halden RU. 2015. <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/www.mdpi.com\/1660-4601\/12\/6\/6879\/pdf\" target=\"_blank\">Comparison of Land, Water, and Energy Requirements of Lettuce Grown Using Hydroponic vs. Conventional Agricultural Methods<\/a>. International Journal of Environmental Research and Public Health 12:6879\u20136891. DOI <a rel=\"noreferrer noopener\" aria-label=\"10.3390\/ijerph120606879 (opens in a new tab)\" href=\"https:\/\/doi.org\/10.3390\/ijerph120606879\" target=\"_blank\">10.3390\/ijerph120606879<\/a><\/li><li>Cometti NN, Bremenkamp DM, Galon K, Hell LR, Zanotelli MF. 2013. <a rel=\"noreferrer noopener\" aria-label=\"Cooling and concentration of nutrient solution in hydroponic lettuce crop (opens in a new tab)\" href=\"http:\/\/www.scielo.br\/pdf\/hb\/v31n2\/18.pdf\" target=\"_blank\">Cooling and concentration of nutrient solution in hydroponic lettuce crop<\/a>. Horticultura Brasileira 31:287\u2013292. DOI <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/doi.org\/10.1590\/S0102-05362013000200018\" target=\"_blank\">10.1590\/S0102-05362013000200018<\/a><\/li><li>Gent MP. 2012. <a rel=\"noreferrer noopener\" aria-label=\"Composition of hydroponic lettuce: effect of time of day, plant size, and season (opens in a new tab)\" href=\"https:\/\/onlinelibrary.wiley.com\/doi\/epdf\/10.1002\/jsfa.4604\" target=\"_blank\">Composition of hydroponic lettuce: effect of time of day, plant size, and season<\/a>. Journal of the Science of Food and Agriculture 92:542\u2013550. DOI <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/doi.org\/10.1002\/jsfa.4604\" target=\"_blank\">10.1002\/jsfa.4604<\/a><\/li><li>Gent MPN. 2014. <a rel=\"noreferrer noopener\" aria-label=\"Effect of Daily Light Integral on Composition of Hydroponic Lettuce (opens in a new tab)\" href=\"https:\/\/journals.ashs.org\/hortsci\/downloadpdf\/journals\/hortsci\/49\/2\/article-p173.xml\" target=\"_blank\">Effect of Daily Light Integral on Composition of Hydroponic Lettuce<\/a>. HortScience 49:173\u2013179. DOI <a rel=\"noreferrer noopener\" target=\"_blank\" href=\"https:\/\/doi.org\/10.21273\/HORTSCI.49.2.173\">10.21273\/HORTSCI.49.2.173<\/a><\/li><li>Gent MPN. 2016. <a rel=\"noreferrer noopener\" aria-label=\"Effect of temperature on composition of hydroponic lettuce (opens in a new tab)\" href=\"https:\/\/www.actahort.org\/books\/1123\/1123_13.htm\" target=\"_blank\">Effect of temperature on composition of hydroponic lettuce<\/a>. Acta Hortic 95\u2013100. DOI <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/doi.org\/10.17660\/ActaHortic.2016.1123.13\" target=\"_blank\">10.17660\/ActaHortic.2016.1123.13<\/a><\/li><li>Gent MPN. 2003. <a rel=\"noreferrer noopener\" aria-label=\"Solution Electrical Conductivity and Ratio of Nitrate to Other Nutrients Affect Accumulation of Nitrate in Hydroponic Lettuce (opens in a new tab)\" href=\"https:\/\/journals.ashs.org\/hortsci\/downloadpdf\/journals\/hortsci\/38\/2\/article-p222.xml\" target=\"_blank\">Solution Electrical Conductivity and Ratio of Nitrate to Other Nutrients Affect Accumulation of Nitrate in Hydroponic Lettuce<\/a>. HortScience 38:222\u2013227. DOI <a rel=\"noreferrer noopener\" href=\"https:\/\/doi.org\/10.21273\/HORTSCI.38.2.222\" target=\"_blank\">10.21273\/HORTSCI.38.2.222<\/a> <\/li><li>Josse E-M, Halliday KJ. 2008. <a rel=\"noreferrer noopener\" aria-label=\"Skotomorphogenesis: The Dark Side of Light Signalling (opens in a new tab)\" href=\"https:\/\/www.cell.com\/fulltext\/S0960-9822(08)01403-6\" target=\"_blank\">Skotomorphogenesis: The Dark Side of Light Signalling<\/a>. Current Biology 18:R1144\u2013R1146. DOI <a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" target=\"_blank\" href=\"https:\/\/doi.org\/10.1016\/j.cub.2008.10.034\">10.1016\/j.cub.2008.10.034<\/a><\/li><li>Korkmaz A, Pill WG, Cobb BB. 1999. <a rel=\"noreferrer noopener\" aria-label=\"Rate and Synchrony of Seed Germination Influence Growth of Hydroponic Lettuce (opens in a new tab)\" href=\"https:\/\/journals.ashs.org\/hortsci\/downloadpdf\/journals\/hortsci\/34\/1\/article-p100.xml\" target=\"_blank\">Rate and Synchrony of Seed Germination Influence Growth of Hydroponic Lettuce<\/a>. HortScience 34:100\u2013103. DOI <a rel=\"noreferrer noopener\" target=\"_blank\" href=\"https:\/\/doi.org\/10.21273\/HORTSCI.34.1.100\">10.21273\/HORTSCI.34.1.100<\/a><\/li><li>Mycostop Research Results. Retrieved March 8, 2020. &lt;<a rel=\"noreferrer noopener\" aria-label=\"http:\/\/www.agbio-inc.com\/mycostop-research-results.html (opens in a new tab)\" href=\"http:\/\/www.agbio-inc.com\/mycostop-research-results.html\" target=\"_blank\">http:\/\/www.agbio-inc.com\/mycostop-research-results.html<\/a>&gt;<\/li><li>Thompson HC, Langhans RW, Both A-J, Albright LD. 1998. <a rel=\"noreferrer noopener\" aria-label=\"Shoot and Root Temperature Effects on Lettuce Growth in a Floating Hydroponic System (opens in a new tab)\" href=\"https:\/\/journals.ashs.org\/jashs\/downloadpdf\/journals\/jashs\/123\/3\/article-p361.xml\" target=\"_blank\">Shoot and Root Temperature Effects on Lettuce Growth in a Floating Hydroponic System<\/a>. Journal of the American Society for Horticultural Science 123:361\u2013364. DOI <a rel=\"noreferrer noopener\" href=\"https:\/\/doi.org\/10.21273\/JASHS.123.3.361\" target=\"_blank\">10.21273\/JASHS.123.3.361<\/a><\/li><li>Zhang X, He D, Niu G, Yan Z, Song J. 2018. <a rel=\"noreferrer noopener\" aria-label=\"Effects of environment lighting on the growth, photosynthesis, and quality of hydroponic lettuce in a plant factory (opens in a new tab)\" href=\"http:\/\/www.ijabe.org\/index.php\/ijabe\/article\/download\/3420\/pdf\" target=\"_blank\">Effects of environment lighting on the growth, photosynthesis, and quality of hydroponic lettuce in a plant factory<\/a>. International Journal of Agricultural and Biological Engineering 11:33\u201340. DOI <a rel=\"noreferrer noopener\" aria-label=\"10.25165\/j.ijabe.20181102.3420 (opens in a new tab)\" href=\"http:\/\/www.ijabe.org\/index.php\/ijabe\/article\/view\/3420\" target=\"_blank\">10.25165\/j.ijabe.20181102.3420<\/a><\/li><\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p style=\"font-size:23px\"><strong>Latest Articles<\/strong><\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<ul class=\"wp-block-latest-posts__list is-grid columns-3 has-dates wp-block-latest-posts\"><li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/kylegabriel.com\/projects\/2021\/09\/mushroom-cultivation-automation.html\">Mushroom Cultivation Automation: From Foraging to Fruiting<\/a><time datetime=\"2021-09-03T06:55:42-05:00\" class=\"wp-block-latest-posts__post-date\">September 3, 2021<\/time><div class=\"wp-block-latest-posts__post-excerpt\">Mushrooms are a unique and often mysterious organism. They&#8217;re not quite plants and not quite animals. As a fungus, mushrooms represent a distinct evolutionary lineage. Fungi grow as a single-cell yeast form (used in beer, wine, and bread making) and multi-cellular, thread-like mycelia that often produce fruiting bodies (mushrooms) and sclerotia (e.g. truffles), and are responsible for the decomposition of the vast majority of dead plant matter. Understanding life cycle of mushroom fungi is a valuable skill if you wish to harness this knowledge for mushroom cultivation.<\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/kylegabriel.com\/projects\/2020\/06\/automated-hydroponic-system-build.html\">Automated Hydroponic System Build<\/a><time datetime=\"2020-06-03T16:32:35-05:00\" class=\"wp-block-latest-posts__post-date\">June 3, 2020<\/time><div class=\"wp-block-latest-posts__post-excerpt\">Hydroponic farming is a method of growing crops without soil, with the main benefits of environmental and nutrient control, water conservation, and reduction of labor. This technique relies on a number of technologies that the principles of automation can be applied in order to improve yield and consistency. In this article and accompanying video, I&#8217;ll show you how to built a hydroponic system with basic components and automate it using the open source software Mycodo running on a Raspberry Pi single board computer.<\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/kylegabriel.com\/projects\/2019\/08\/remote-radiation-monitoring.html\">Remote Radiation Monitoring<\/a><time datetime=\"2019-08-19T16:17:45-05:00\" class=\"wp-block-latest-posts__post-date\">August 19, 2019<\/time><div class=\"wp-block-latest-posts__post-excerpt\">Radiation is the transmission of energy through space in the form of a particle or wave. These can be generated by instruments or\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/kylegabriel.com\/projects\/2019\/08\/remote-radiation-monitoring.html\" rel=\"noopener noreferrer\">Read more<span class=\"screen-reader-text\">: Remote Radiation Monitoring<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/kylegabriel.com\/projects\/2019\/04\/lorawan-tracker-and-mapper.html\">LoRaWAN Tracker and Mapper<\/a><time datetime=\"2019-04-04T00:31:02-05:00\" class=\"wp-block-latest-posts__post-date\">April 4, 2019<\/time><div class=\"wp-block-latest-posts__post-excerpt\">LoRaWAN is a great long-distance, low-power transmission protocol. One of the questions that often comes up after deploying a gateway and nodes is\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/kylegabriel.com\/projects\/2019\/04\/lorawan-tracker-and-mapper.html\" rel=\"noopener noreferrer\">Read more<span class=\"screen-reader-text\">: LoRaWAN Tracker and Mapper<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/kylegabriel.com\/projects\/2019\/03\/outdoor-lorawan-gateway.html\">Outdoor LoRaWAN Gateway<\/a><time datetime=\"2019-03-20T14:12:56-05:00\" class=\"wp-block-latest-posts__post-date\">March 20, 2019<\/time><div class=\"wp-block-latest-posts__post-excerpt\">I&#8217;ve been heavily involved with sensors and remote sensing for many years. Recently, I&#8217;ve become intrigued with remote sensing, and began my exploration\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/kylegabriel.com\/projects\/2019\/03\/outdoor-lorawan-gateway.html\" rel=\"noopener noreferrer\">Read more<span class=\"screen-reader-text\">: Outdoor LoRaWAN Gateway<\/span><\/a><\/div><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/kylegabriel.com\/projects\/2016\/02\/morse-code-translator.html\">Bringing a Vintage Telegraph into the Digital Age<\/a><time datetime=\"2016-02-18T00:48:04-05:00\" class=\"wp-block-latest-posts__post-date\">February 18, 2016<\/time><div class=\"wp-block-latest-posts__post-excerpt\">I recently inherited a key on board (KOB) telegraph that my late grandfather used to practice Morse code with when he was a\u2026 <a class=\"wp-block-latest-posts__read-more\" href=\"https:\/\/kylegabriel.com\/projects\/2016\/02\/morse-code-translator.html\" rel=\"noopener noreferrer\">Read more<span class=\"screen-reader-text\">: Bringing a Vintage Telegraph into the Digital Age<\/span><\/a><\/div><\/li>\n<\/ul>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hydroponic farming is a method of growing crops without soil, with the main benefits of environmental and nutrient control, water conservation, and reduction of labor. This technique relies on a number of technologies that the principles of automation can be applied in order to improve yield and consistency. In this article and accompanying video, I&#8217;ll show you how to built a hydroponic system with basic components and automate it using the open source software Mycodo running on a Raspberry Pi single board computer.<\/p>\n","protected":false},"author":1,"featured_media":2555,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,9,68,26,12],"tags":[],"class_list":["post-1971","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automation","category-cultivation","category-hydroponic","category-mycodo","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/posts\/1971"}],"collection":[{"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/comments?post=1971"}],"version-history":[{"count":0,"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/posts\/1971\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/media\/2555"}],"wp:attachment":[{"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/media?parent=1971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/categories?post=1971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kylegabriel.com\/projects\/wp-json\/wp\/v2\/tags?post=1971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}