Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@adam-james-v
Last active February 12, 2021 17:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adam-james-v/0924514d7f8921df28ba78dd9d34e11f to your computer and use it in GitHub Desktop.
Save adam-james-v/0924514d7f8921df28ba78dd9d34e11f to your computer and use it in GitHub Desktop.
Design File for a DIY hydroponics system. This uses clojure and scad-clj to compile an OpenSCAD script.
;; code related to https://youtu.be/EU0_I-1ROok
(ns hydro.design
(:require [clojure.string :as st]
[scad-clj.model :refer :all]
[scad-clj.scad :refer [write-scad]]))
(def parameters
{:tube-p {:l 34
:id 5
:t 0.1875
:hs 4.75}
:cap-p {:t 0.2
:h 2}
:basket-p {:tr 1.45
:br 1.1
:h 2.25
:t 0.1}
:stand-p {:w 1.25
:h 3.5
:l 12}})
(defn place-at
[pts & block]
(for [pt pts] (->> block (translate pt))))
(def PI Math/PI)
(fn! 50)
(defn pipe-xs
[id t]
(let [or (+ (/ id 2) t)]
(difference
(circle or)
#_(circle (- or t)))))
(defn main-tube
[{:keys [tube-p basket-p]}]
(let [{:keys [l id t hs]} tube-p
n-holes (int (/ (- l 4) hs))
hole-offset (/ (- l (* hs (dec n-holes))) 2)
hd (Math/ceil (* 2 (:tr basket-p)))
holes (for [x (map #(* hs %) (take n-holes (range)))]
(->> (cylinder (/ hd 2) id)
(translate [(+ x hole-offset) 0 (/ id 2)])))]
(color
[0.8 0.8 0.8 1]
(difference
(->> (pipe-xs id t)
(extrude-linear {:height l :center false})
(rotate [0 (* PI 0.5) 0]))
holes))))
(defn cap
[id t h]
(let [ir (/ id 2)]
(->> [ [0 0] [ir 0] [ir (- t h)]
[(+ ir t) (- t h)] [(+ ir t) t] [0 t] ]
polygon
(extrude-rotate)
(#(difference % (cylinder 0.375 (* 2 t))))
(color [0.75 0.75 0.85 1]))))
(defn caps
[{:keys [cap-p tube-p]}]
(let [{:keys [t h]} cap-p
cap-d (+ (:id tube-p) (* 2 (:t tube-p)))]
(list
(->> (cap cap-d t h)
(rotate [0 (* PI 1.5) 0]))
(->> (cap cap-d t h)
(rotate [0 (* PI 0.5) 0])
(translate [(:l tube-p) 0 0])))))
(defn stand
[{:keys [w h l]}]
(color
[0.5 0.35 0.35 1]
(difference
(->> (cube w h l)
(rotate [(* PI 0.5) 0 0])
(translate [0 0 (/ h 2)]))
(->> (cube 3 3 3)
(rotate [(* PI 0.25) 0 0])
(translate [0 0 h])))))
(defn stands
[{:keys [tube-p stand-p cap-p]}]
(let [offset (* 2 (:h cap-p))]
(place-at [ [offset 0 0] [(- (:l tube-p) offset) 0 0] ]
(stand stand-p))))
(defn basket
[{:keys [tr br h t]}]
(->> [ [0 0] [br 0]
[tr (- h t)] [(+ tr (* 1.5 t)) (- h t)]
[(+ tr (* 1.5 t)) h] [(- tr (* 1.1 t)) h]
[(- br (* 1.1 t)) t] [0 t] ]
polygon
extrude-rotate
(translate [0 0 (- t h)])
(color [0.3 0.3 0.3 1])))
(defn baskets
[{:keys [tube-p basket-p]}]
(let [{:keys [l hs]} tube-p
n (int (/ (- l 4) hs))
offset (/ (- l (* hs (dec n))) 2)
voffset (+ (/ (:id tube-p) 2) (:t tube-p))]
(place-at
(map #(vector (+ offset (* hs %)) 0 voffset) (take n (range)))
(basket basket-p))))
(defn assembly
[{:keys [tube-p cap-p basket-p stand-p] :as p}]
(let [d (+ (:id tube-p) (* 2 (:t tube-p)))
h (+ (/ d 2) (- (:h stand-p) (* 0.275 d)))]
(list
(map #(translate [0 0 h] %)
(concat [(main-tube p)]
(caps p)
(baskets p)))
(stands p))))
(spit "design.scad" (write-scad (assembly parameters))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment