1. We are currently experiencing issues with viewing and uploading images, our team is working on the issue.
    Dismiss Notice

Dstroy's first grow journal

Discussion in 'Grow Journals' started by dstroy, Jul 16, 2016.

  1.  
    dstroy

    dstroy Member

    This will be my first grow journal. I have all the parts I need to build a high pressure aeroponics indoor garden.

    It will consist of at least 24 plants (not including seedlings/clones) in two 4x4 tents and a 24 site aeroponic cloner (LPA).

    I will be using 20 (10 per tent) cxb3590 CD bin driven at 1400ma (500w/per tent) dimmed appropriately for flower/veg, and 2ft CFL for the seedlings/clones

    I've built myself a custom greenhouse controller out of an Arduino mega2560, some 120v contactors for the lights and everything else is controlled by regular relays.

    The grow I am planning is going to be perpetual, when one tent is in flower the other will be in veg.

    This is expandable by design, so if I migrate into a larger set of grow rooms all I have to do is add more pumps, accumulators, and buckets.

    So far I have:
    2ft 4 bulb CFL
    24 site cloner
    4x meanwell HLG drivers (two per fixture)
    20x 140mm pin heatsinks that I drilled/tapped for ideal chip lok holders
    20x cxb3590 CD bin
    metal/parts to build the light fixtures (including hangers); I chose 3/4" angle aluminum 1/8" thick; the light fixtures will be 40"x40"
    14000 btu aircon
    72 pint dehumidifier
    2x aquatec CDP 8800 pumps (1/4" inlet/outlet and 160psi bypass pressure)
    2x 4 gallon accumulators
    2x 20gal reservoirs
    various solenoids
    2x cozir CO2/temp/humidity sensors (from co2meters.com, these were expensive)
    2x Arduino mega2560 (one for testing)
    various relays
    4x 120v contactors (one for each LED driver, they are high current capable and much cheaper than solid state relays)
    12x 5gal food safe buckets
    about 200 mister nozzles (I'll only use 2-3 per bucket; they are 3/4gph)
    various fittings in 1/4" and 3/8" size to plumb the high pressure side
    ph and ec meter
    air pump and airstones for each reservoir
    CO2 regulator with flow meter
    2x co2 solenoids

    What I need:
    50lb CO2 bottle
    seeds/clones (wife gets to choose what strains we grow)
    a UPS for the pumps/Arduino in case of power loss

    What I want:
    a GSM shield for the Arduino so it can text me if there is a problem instead of email me but I don't want to spend the time writing the code for this

    spare parts

    nutes: I chose dyna gro, I've used them before to grow food and they're cheaper than cannabis specific? nutrients. and mammoth P. maybe clonex for the clones

    I've got the parts, sensors and code to build PH/nute dosers.
    2x kit from cyberplant on tindie
    4x peristaltic pumps from amazon (12v)
    2x Arduino pro mini
    I'm still working on the code for these

    What my controller does:
    It automatically controls temperature, humidity, spray on/off time, and CO2 enrichment. All functions have hysteresis (wont turn on and off if values are close to setpoints).
    Sends me an email every 5 minutes until I reply if there is a problem.

    It monitors:
    CO2 PPM (1500PPM setpoint nominal)
    humidity
    temperature
    pressure of the line before the solenoid that turns on/off the misters
    nute flowrate while mister is on including ramp up and down

    Nute flow chart:
    Reservoir -> Pump -> Pressure switch -> Check valve -> Accumulator (4gal) -> Recycle solenoid -> Mister solenoid -> Misters -> Recovery

    There is a separate pump/reservoir for each grow area

    Why did I choose high pressure aeroponics? I believe it isn't beyond my skill level and it should be the most efficient use of space. With proper monitoring and daily logging I should be able to increase my yields. It's repeatable.
     
    Gonzalo87 likes this.
  2. I'm glad to see others do their reading when it comes to their first grow. I also am taking care of my first crop this year and although i'm outdoor in the mountains, I pretty much memorized every chapter of the cannabis encyclopedia by Jorge Cervantes, which really helped me, and was eye opening what a science horticulture and botany really are.
     
  3.  
    dstroy

    dstroy Member

    Here are the two pumps with some fittings and inlet strainers attached. The transformers will be located at the top of the board raised up on a section of 2x4 in case there are leaks. No wiring will be located below the highest point of the pumps with the board laid flat. They are 24vac.

    I'm not too concerned there will be leaks, all of my push to connect fittings are secured by a blue c clip to prevent slippage and preliminary pressure testing didn't reveal any leaks.
     

    Attached Files:

  4.  
    dstroy

    dstroy Member

    I had some quiet time today at work and got one of the ph/ec doser controllers most of the way assembled.

    If anyone is curious you can get them from tindie from a seller called cyber plant
     

    Attached Files:

  5.  
    dstroy

    dstroy Member

    I've been wondering how often I will need to cycle my accumulators, I was thinking once a day? I've provisioned each with a bypass solenoid that'll just open up and recycle nutes into the reservoir. I don't have an orp meter but I guess I should get one to run an experiment and see how much the DO decreases in a sealed accumulator after a day.

    Edit: I meant dissolved oxygen meter, sorry I'm tired.
     
    Last edited: Jul 18, 2016
  6.  
    dstroy

    dstroy Member

    Code:
    
    
    #define CZR_HUMIDITYone  0x1000
    
    #define CZR_FILTLEDone  0x0800
    
    #define CZR_RAWLEDone  0x0400
    
    #define CZR_MAXLEDone  0x0200
    
    #define CZR_ZEROPOINTone  0x0100
    
    #define CZR_RAWTEMPone  0x0080
    
    #define CZR_FILTTEMPone  0x0040
    
    #define CZR_FILTLEDSIGNALone 0x0020
    
    #define CZR_RAWLEDSIGNALone  0x0010
    
    #define CZR_SENSTEMPone  0x0008
    
    #define CZR_FILTCO2one  0x0004
    
    #define CZR_RAWCO2one  0x0002
    
    #define CZR_NONEone  0x0001
    
    #define CZR_HTCone  (CZR_HUMIDITYone | CZR_RAWTEMPone | CZR_RAWCO2one)
    
    #define CZR_COMMANDone  0x00
    
    #define CZR_STREAMINGone  0x01
    
    #define CZR_POLLINGone  0x02
    
    #define CZR_HUMIDITYtwo  0x1000
    
    #define CZR_FILTLEDtwo  0x0800
    
    #define CZR_RAWLEDtwo  0x0400
    
    #define CZR_MAXLEDtwo  0x0200
    
    #define CZR_ZEROPOINTtwo  0x0100
    
    #define CZR_RAWTEMPtwo  0x0080
    
    #define CZR_FILTTEMPtwo  0x0040
    
    #define CZR_FILTLEDSIGNALtwo 0x0020
    
    #define CZR_RAWLEDSIGNALtwo  0x0010
    
    #define CZR_SENSTEMPtwo  0x0008
    
    #define CZR_FILTCO2two  0x0004
    
    #define CZR_RAWCO2two  0x0002
    
    #define CZR_NONEtwo  0x0001
    
    #define CZR_HTCtwo  (CZR_HUMIDITYtwo | CZR_RAWTEMPtwo | CZR_RAWCO2two)
    
    #define CZR_COMMANDtwo  0x00
    
    #define CZR_STREAMINGtwo  0x01
    
    #define CZR_POLLINGtwo  0x02
    
    
    
    
    class COZIRone
    
    {
    
      public:
    
      COZIRone(Stream*);
    
      void initone();
    
    
    
    
      float Celsiusone();
    
      float Fahrenheitone();
    
      float Humidityone();
    
      uint32_t CO2one();
    
    
    
    
      uint16_t CalibrateFreshAirone();
    
      void SetDigiFilterone(uint8_t );
    
      uint8_t GetDigiFilterone();
    
      void SetOutputFieldsone(uint16_t );
    
      void GetRecentFieldsone();
    
      void GetVersionSerialone();
    
      void GetConfigurationone();
    
    
    
    
      private:
    
      Stream *serone;
    
      char buffer[64];
    
    
    
    
      void SetOperatingModeone(uint8_t modeone);
    
      void Commandone(const char* );
    
      uint32_t Requestone(const char* );
    
    };
    
    
    
    
    class COZIRtwo
    
    {
    
      public:
    
      COZIRtwo(Stream*);
    
      void inittwo();
    
    
    
    
      float Celsiustwo();
    
      float Fahrenheittwo();
    
      float Humiditytwo();
    
      uint32_t CO2two();
    
    
    
    
      uint16_t CalibrateFreshAirtwo();
    
      void SetDigiFiltertwo(uint8_t );
    
      uint8_t GetDigiFiltertwo();
    
      void SetOutputFieldstwo(uint16_t );
    
      void GetRecentFieldstwo();
    
      void GetVersionSerialtwo();
    
      void GetConfigurationtwo();
    
    
    
    
      private:
    
      Stream *sertwo;
    
      char buffer[64];
    
    
    
    
      void SetOperatingModetwo(uint8_t modeone);
    
      void Commandtwo(const char* );
    
      uint32_t Requesttwo(const char* );
    
    };
    
    
    
    
    COZIRone::COZIRone(Stream * strone)
    
    {
    
      serone = strone;
    
    }
    
    
    
    
    COZIRtwo::COZIRtwo(Stream * strtwo)
    
    {
    
      sertwo = strtwo;
    
    }
    
    
    
    
    void COZIRone::initone()
    
    {
    
      // overide default streaming (takes too much perf
    
      SetOperatingModeone(CZR_POLLINGone);
    
      // delay for initialization
    
    }
    
    
    
    
    void COZIRtwo::inittwo()
    
    {
    
      // overide default streaming (takes too much perf
    
      SetOperatingModetwo(CZR_POLLINGtwo);
    
      // delay for initialization
    
    }
    
    
    
    
    void COZIRone::SetOperatingModeone(uint8_t modeone)
    
    {
    
      sprintf(buffer, "K %u", modeone);
    
      Commandone(buffer);
    
    }
    
    
    
    
    void COZIRtwo::SetOperatingModetwo(uint8_t modetwo)
    
    {
    
      sprintf(buffer, "K %u", modetwo);
    
      Commandtwo(buffer);
    
    }
    
    
    
    
    //polling modeone------------------------------------------------------
    
    float COZIRone::Fahrenheitone()
    
    {
    
      return (Celsiusone() * 1.8) + 32;
    
    }
    
    
    
    
    float COZIRone::Celsiusone()
    
    {
    
      uint16_t rvone = Requestone("T");
    
      float fone = 0.1 * (rvone - 1000.0);
    
      return fone;
    
    }
    
    
    
    
    float COZIRone::Humidityone()
    
    {
    
      return 0.1 * Requestone("H");
    
    }
    
    
    
    
    uint32_t COZIRone::CO2one()
    
    {
    
      return Requestone("Z");
    
    }
    
    
    
    
    //polling modeone------------------------------------------------------
    
    float COZIRtwo::Fahrenheittwo()
    
    {
    
      return (Celsiustwo() * 1.8) + 32;
    
    }
    
    
    
    
    float COZIRtwo::Celsiustwo()
    
    {
    
      uint16_t rvtwo = Requesttwo("T");
    
      float fone = 0.1 * (rvtwo - 1000.0);
    
      return fone;
    
    }
    
    
    
    
    float COZIRtwo::Humiditytwo()
    
    {
    
      return 0.1 * Requesttwo("H");
    
    }
    
    
    
    
    uint32_t COZIRtwo::CO2two()
    
    {
    
      return Requesttwo("Z");
    
    }
    
    
    
    
    //CALIBRATION MODE---------------------------------------------------
    
    uint16_t COZIRone::CalibrateFreshAirone()
    
    {
    
      return Requestone("G");
    
    }
    
    
    
    
    uint16_t COZIRtwo::CalibrateFreshAirtwo()
    
    {
    
      return Requesttwo("G");
    
    }
    
    
    
    
    //SET DIGITAL FILTERING----------------------------------------------
    
    void COZIRone::SetDigiFilterone(uint8_t valueone)
    
    {
    
      sprintf(buffer, "A %u", valueone);
    
      Commandone(buffer);
    
    }
    
    
    
    
    uint8_t COZIRone::GetDigiFilterone()
    
    {
    
      return Requestone("a");
    
    }
    
    void COZIRtwo::SetDigiFiltertwo(uint8_t valuetwo)
    
    {
    
      sprintf(buffer, "A %u", valuetwo);
    
      Commandtwo(buffer);
    
    }
    
    
    
    
    uint8_t COZIRtwo::GetDigiFiltertwo()
    
    {
    
      return Requesttwo("a");
    
    }
    
    
    
    
    //READ SERIAL----------------------------------------------------------
    
    void COZIRone::GetRecentFieldsone()
    
    {
    
      Commandone("Q");
    
    }
    
    
    
    
    void COZIRtwo::GetRecentFieldstwo()
    
    {
    
      Commandtwo("Q");
    
    }
    
    //COMMAND MODE----------------------------------------------------------
    
    void COZIRone::GetVersionSerialone()
    
    {
    
      Commandone("Y");
    
    }
    
    void COZIRone::GetConfigurationone()
    
    {
    
      Commandone("*");
    
    }
    
    
    
    
    void COZIRtwo::GetVersionSerialtwo()
    
    {
    
      Commandtwo("Y");
    
    }
    
    void COZIRtwo::GetConfigurationtwo()
    
    {
    
      Commandtwo("*");
    
    }
    
    //PRIVATEone-------------------------------------------------------------------------------------------------
    
    void COZIRone::Commandone(const char* sone)
    
    {
    
      // TODO
    
      // CZR_Serial.println(s);
    
      serone->print(sone);
    
      serone->print("\r\n");
    
    }
    
    uint32_t COZIRone::Requestone(const char* sone)
    
    {
    
      Commandone(sone);
    
      // empty buffer
    
      buffer[0] = '\0';
    
      // read answer; there may be a 100ms delay!
    
      // TODO: PROPER TIMEOUT CODE.
    
      delay(200);
    
      int idxone = 0;
    
    
    
    
      while (serone->available())
    
      {
    
      buffer[idxone++] = serone->readBytesUntil(0x0A, buffer, 64);
    
      }
    
      buffer[idxone] = '\0';
    
    
    
    
      uint32_t rvone = 0;
    
      switch (buffer[0])
    
      {
    
      case 'T' :
    
      rvone = atoi(&buffer[5]);
    
      if (buffer[4] == 1) rvone += 1000;
    
      // negative values are mapped above 1000..1250 => capture this in Celsius()
    
      break;
    
      default :
    
      rvone = atol(&buffer[2]);
    
      break;
    
      }
    
      return rvone;
    
    }
    
    //PRIVATEtwo------------------------------------------------------------------------------------------------
    
    void COZIRtwo::Commandtwo(const char* stwo)
    
    {
    
      // TODO
    
      // CZR_Serial.println(s);
    
      sertwo->print(stwo);
    
      sertwo->print("\r\n");
    
    }
    
    uint32_t COZIRtwo::Requesttwo(const char* stwo)
    
    {
    
      Commandtwo(stwo);
    
      // empty buffer
    
      buffer[0] = '\0';
    
      // read answer; there may be a 100ms delay!
    
      // TODO: PROPER TIMEOUT CODE.
    
      delay(200);
    
      int idxtwo = 0;
    
      while (sertwo->available())
    
      {
    
      buffer[idxtwo++] = sertwo->readBytesUntil(0x0A, buffer, 64);
    
      }
    
      buffer[idxtwo] = '\0';
    
    
    
    
      uint32_t rvtwo = 0;
    
      switch (buffer[0])
    
      {
    
      case 'T' :
    
      rvtwo = atoi(&buffer[5]);
    
      if (buffer[4] == 1) rvtwo += 1000;
    
      // negative values are mapped above 1000..1250 => capture this in Celsius()
    
      break;
    
      default :
    
      rvtwo = atol(&buffer[2]);
    
      break;
    
      }
    
      return rvtwo;
    
    }

    This is the code to get two COZIR GC-0020 0-2000ppm sensors working on an Arduino mega2560; I'm using two of the hardware serial ports.
     
    Gonzalo87 likes this.
  7.  
    dstroy

    dstroy Member

    It's not too hot out today so I'm going to drag my drill press out and get these lights built!
     
  8.  
    dstroy

    dstroy Member

    So, I never got around to getting started yesterday, but today I'm making progress. These are the middle sections for both lights, now I need to get the side rails drilled and the heatsinks mounted so I can hopefully get them all assembled today.
     

    Attached Files:

  9.  
    dstroy

    dstroy Member

    Got one together, just need to put the other one together now.

    Thanks @Growmau5 for the design.
     

    Attached Files:

    MeGaKiLlErMaN likes this.
  10.  
    dstroy

    dstroy Member

    Got the other light fixture put together, in the process of wiping both down with isopropyl alcohol.

    Feel free to comment
     
  11.  
    dstroy

    dstroy Member

    These are the contactors I'm using for the lights, vent fans, a/c, and dehumidifier.

    That box will house all of the electrical stuff and power supplies for the controller. The Led drivers will be mounted below this box on a piece of 3/4" plywood. I've got some smaller junction boxes to hook up the LEDs to their drivers.

    I'm using regular relays for all of the lower amperage stuff, it looks like the relay boards I bought already have flyback diodes built into them. I'll be adding flyback diodes to all circuits that the contactors are connected to.
     

    Attached Files:

  12.  
    dstroy

    dstroy Member

    Got the contactors mounted, the mounting screws will be sealed on the outside of the box using polysulfide. I used it a lot while I was in the navy to weatherproof bolt heads from saltwater, so I'm comfortable that it'll keep moisture from intruding into the box. The contactor switch wires are 14awg and the conductor side is 10awg chassis grade wiring. There won't be anything above 120vac inside this box.

    I'll be mounting the arduino in a corner of this box. I've got some copper foil that I will be using to isolate the arduino, its power supply, and the 3.3v power supply for the environmental sensors. The environmental (co2, temp, and humidity sensors) from cozir need a relatively noise free 3.3vdc.
     

    Attached Files:

  13.  
    dstroy

    dstroy Member

    Sorry for not updating, I've still got a lot of wiring in my control box to do. When it's all done I'll post some good pics of the inside of it. All the external connections to the led drivers are in marine grade junction boxes with pg cable glands. I'm still working on the junction box for the output side, I had to stop for now because my hands are hurting. But at least I've got everything mounted up except that other junction box.
     

    Attached Files:

  14.  
    dstroy

    dstroy Member

    I had my first "major" setback yesterday. The female connectors that I chose to use for the c14 sockets (120v power) were the correct size at 3/16" had the correct ratings, were UL listed yada yada. I got them all crimped on for ALL of the connectors and pressed them on.... and they weren't secure at all, they just fell off when bumped :O

    I cut one apart, and the core is just copper... they should have been brass so they stay on better.

    I ordered more from mouser, $30 for 100. 50 for 14/16awg and 50 for 10/12awg rated for 600v/high temp fully insulated.

    That was a lot of time wasted, lesson learned.

    Most of the 120v cabling is in its' permanent position. I need to find something to put on the edges of the power supply on the door so it can't chafe any wiring, and something to go around the cable run that crosses over to the door. I need more PG9 cable glands (the smaller ones) to get the wiring for the dimming up into the control box.

    I have to install the 12v/10v/5v power supplies still, I've got the standoffs up in the top of the control box already. I need to drill holes for the network keystones that the environmental sensors plug into. I need to silicone or hot glue all of the connections going into the Arduino so they can't fall out.
     

    Attached Files:

  15.  
    dstroy

    dstroy Member

    I got the proper connectors for the job, almost finished inside the box now. I've been doing some testing to see if the box will need active cooling or not, I've got some small 40mm fans if it needs any airflow.

    I've got a protoboard laid out for the light dimmer circuit. The green and black small gauge wiring hanging down is the +10v supply for the dimmer circuit.

    The external wiring going to the led lighting fixtures is 600v 14/3. It's actually an extension cord that I cut up because I couldn't find a "cheap" option in 14/2.

    I need to run the wiring from the junction boxes up into the control box for the dimmer circuit, still need to secure the pins in the Arduino, I've rang out all of the mains circuits and did testing to make sure they are all safe. All of my mains wiring is from southwire, it's all high temp 600v rated 16ga for relay/contactor switching, and 10ga for transmission.

    One of the tools I needed to complete the job was damaged in transit. I needed the pin removal tool for the molex connectors because I borked a few up and there are two that I installed in the panel that need to be removed before I can wire up all of the solenoids.
     

    Attached Files:

    Gonzalo87 likes this.
  16.  
    dstroy

    dstroy Member

    I've also decided to switch to 20lb co2 bottles. I called around RI, and all the companies I've called have said they'll only fill 50lb if you lease the cylinder from them. Since the wife is going to be needing this forever it will be cheaper for me to just buy two 20lb cylinders. If anyone knows anywhere I can go that'll fill 50lb cylinders in RI that you don't have to lease from the company filling them let me know.
     
  17.  
    MeGaKiLlErMaN

    MeGaKiLlErMaN Well-Known Member

    This looks like a good thread, Ill be watching.
     
  18.  
    dstroy

    dstroy Member

    Getting some thorough testing in. The FADE: 100 is the LED dimmer value. I've got it set up for a 15 minute sunrise/sunset for each photoperiod, I'm not sure if that's good enough or not.

    The control box is pulling 25w according to my killawat, the only load(s) right now are the Arduino, sensors, relays and contactors.

    I programmed the Arduino to shut off CO2 if the vent fan is on.

    serial.png
     
  19.  
    dstroy

    dstroy Member

    Making more progress, control box is all done now. I've got the dimmer circuit wired up, but something is screwy with it. It dims, but not down to 100%. With the multimeter hooked up monitoring it, the current from the driver goes from 1.4A to 1.2A over the 15 minute sunrise/sunset. I've verified that the voltage going to the led driver dimmer is going from 10v to 0v over 15 minutes like I wanted but the current is only dropping 14% so I'm going to have to figure out what the deal is. The documentation for the drivers have a graph that shows current should be going to almost 0 when 0vdc is applied to the led driver dimmer.

    I've decided to use 3/8" tube for the nute line "backbone". I've got all the parts I need for that save for one epacket coming from china with adapters that I need for my solenoids.

    The tube coming from the backbone, going into the bucket and supplying the 3 misters is going to be 1/4" the only other thing that I want/need are some check valves that crack open at 15ish psi so the misters don't dribble. I've got enough valves so that each bucket has its own and can be shut off and moved around without interrupting any of the other buckets.

    The other thing I'm on the fence about is adding some 40mm noctua fans that I have to the control box. Sometimes the vreg on the Arduino gets kind of warm, but it is only supplying power to two relays. I'm just thinking about longevity, I should power those two relays with the 5v power supply that is installed but that terminal block is really full, not as bad as the 120v terminal block, but still really full. Each terminal pair for each block is rated for 10A but more than two connectors on each is sloppy and potentially dangerous.

    The wife has sorta decided on what beans she wants: blueberry and strawberry sour diesel.

    She's not sure yet though, she's been smoking her way through the menu from the dispensary finding out what works best for her. http://greenleafcare.org/

    They only sell clones a couple times a year, it'd be great if the timing lines up so that we can get some from there.
     

    Attached Files:

  20.  
    dstroy

    dstroy Member

    I haven't made any progress on the dimmer circuit, it's on the back burner for now. My thought is that each driver needs its own separate dimmer circuit, no problem I have plenty of resistors and transistors. I just need to build and test.

    I was doing some real world testing on my spray nozzles and have decided that each bucket needs its own solenoid.

    The accumulators need to be cycled several times a day so the nute solution in them doesn't get stagnant. The 4 gallon accumulators empty out after being completely charged in 2 minutes 35 seconds, and it takes 14 minutes to fully recharge them with the bladder pressure at 1 bar. The usable pressure range for me is 80-100 psi, it takes 10 minutes to charge it up to 80psi. That's 3 spray cycles of dribble/large droplets.

    18 sprayers on for a minute (3 nozzles per bucket x 6), which is the entire cycle for an hour (3 seconds on 3 minutes off) uses less than 1/4 gallon of water @ 100psi line pressure.

    I don't think I need 4 gallon accumulators, so I'll be switching them to 2 gallon accumulators and just use the two 4 gallon ones I have for RO systems.

    If I stuck with 4 gallon accumulators with the aquatec cdp 8800s that I have now, I would have to get two 60 psi on demand 1gpm pumps to boost the cycle time. It'd just be cheaper all around at this point to get two gallon accumulators.

    Maybe in the future I'll have so many plants that I'll need the 4 gallon ones but that wont be any time soon.

    Other thoughts: the wife got ahold of some grape ape from the dispensary, does anyone know where I can get some beans? Everywhere I've looked has been sold out or wont ship them to me in RI, She's an MMJ cardholder and I'm her caregiver and also have a card. That stuff smells amazing.
     
    MeGaKiLlErMaN likes this.

Share This Page