├── .gitattributes
├── 3D
├── Assem.SLDASM
├── Assem_Cover_full.SLDASM
├── Battom.STL
├── Cover.STL
├── Cover_full_Part.SLDPRT
├── Housing_battom.SLDPRT
├── Pump_Holder_Down.SLDPRT
├── Pump_Holder_UP.SLDPRT
└── Pumps_Holder.STL
├── Config
├── ESPHome
│ ├── arial.ttf
│ └── droplet.yaml
└── Home Assistant
│ ├── VerticalStackCardConfiguration.txt
│ └── desiredmoisturelevel.yaml
├── Gerber
├── Droplet_Expansion_BOM.xlsx
├── Droplet_Expansion_Board.zip
├── Droplet_Main_Board.zip
├── Droplet_Main_Board_BOM.csv
└── Droplet_Schematic.jpg
├── LICENSE
├── README.md
├── Water_Pump_JSB1523008.pdf
└── img
├── ExpaBoard.JPG
├── HASensors.JPG
├── Housing.JPG
├── Housing1.JPG
├── droplet.jpg
├── dropletfull.JPEG
└── prog_header.jpg
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/3D/Assem.SLDASM:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Assem.SLDASM
--------------------------------------------------------------------------------
/3D/Assem_Cover_full.SLDASM:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Assem_Cover_full.SLDASM
--------------------------------------------------------------------------------
/3D/Battom.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Battom.STL
--------------------------------------------------------------------------------
/3D/Cover.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Cover.STL
--------------------------------------------------------------------------------
/3D/Cover_full_Part.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Cover_full_Part.SLDPRT
--------------------------------------------------------------------------------
/3D/Housing_battom.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Housing_battom.SLDPRT
--------------------------------------------------------------------------------
/3D/Pump_Holder_Down.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Pump_Holder_Down.SLDPRT
--------------------------------------------------------------------------------
/3D/Pump_Holder_UP.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Pump_Holder_UP.SLDPRT
--------------------------------------------------------------------------------
/3D/Pumps_Holder.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/3D/Pumps_Holder.STL
--------------------------------------------------------------------------------
/Config/ESPHome/arial.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Config/ESPHome/arial.ttf
--------------------------------------------------------------------------------
/Config/ESPHome/droplet.yaml:
--------------------------------------------------------------------------------
1 | substitutions:
2 | name: droplet
3 |
4 | esphome:
5 | name: ${name}
6 | name_add_mac_suffix: true
7 | project:
8 | name: pricelesstoolkit.droplet
9 | version: "1.0"
10 |
11 | on_boot:
12 | priority: -100
13 | then:
14 | - lambda: id(oled).turn_off();
15 |
16 | esp32:
17 | board: esp32dev
18 |
19 | dashboard_import:
20 | package_import_url: github://PricelessToolkit/Droplet/Config/ESPHome/droplet.yaml@main
21 | import_full_config: true
22 |
23 |
24 | # Enable logging
25 | logger:
26 |
27 | ota:
28 | - platform: esphome
29 | password: bfec11234xsfea57e1b5d3b985cfe06c
30 |
31 | wifi:
32 | ssid: !secret wifi_ssid
33 | password: !secret wifi_password
34 | fast_connect: true
35 | # domain: .lab.lan # if you have custom domain not .local
36 |
37 | # Enable fallback hotspot (captive portal) in case wifi connection fails
38 | ap:
39 | ssid: ${name} Fallback Hotspot
40 | password: password
41 |
42 | captive_portal:
43 |
44 | one_wire: #https://esphome.io/components/one_wire
45 | - platform: gpio
46 | pin: GPIO25
47 |
48 | i2c: # i2c Pins
49 | sda: 21
50 | scl: 22
51 | scan: true
52 |
53 | mcp23017: # Expansion Board https://esphome.io/components/mcp230xx.html
54 | - id: mcp23017_hub
55 | address: 0x20
56 |
57 | font: # Fonts for Display
58 | - file: arial.ttf
59 | id: font1
60 | size: 8
61 | - file: arial.ttf
62 | id: font2
63 | size: 10
64 | - file: arial.ttf
65 | id: font3
66 | size: 14
67 |
68 | display: # More info https://esphome.io/components/display/ssd1306.html?highlight=1306
69 | - platform: ssd1306_i2c
70 | id: oled
71 | model: SSD1306 128x64
72 | address: 0x3C # Oled Display Address
73 | lambda: |-
74 | it.printf(2, 0, id(font2), TextAlign::TOP_LEFT, "DROPLET");
75 | it.printf(61, 0, id(font2) ,"%.1f", id(dbm).state);
76 | it.line(0, 12, 98, 12);
77 | it.line(98, 0, 98, 64);
78 | it.printf(102, 0, id(font2) ,"%.1f", id(Soil1).state);
79 | it.printf(102, 12, id(font2) ,"%.1f", id(Soil2).state);
80 | it.printf(102, 24, id(font2) ,"%.1f", id(Soil3).state);
81 | it.printf(102, 36, id(font2) ,"%.1f", id(Soil4).state);
82 | it.printf(102, 48, id(font2) ,"%.1f", id(Soil5).state);
83 | # it.printf(5, 15, id(font3) ,"%.1f°C", id(intergratedtmp).state);
84 | # it.printf(5, 30, id(font3) ,"%.1fH", id(dhthumidity).state);
85 | # it.printf(5, 45, id(font3) ,"%.1fP", id(pressure).state);
86 |
87 |
88 | # Integrated BUZZER # If you using pin23 for something else, delete this and remove jumper 1
89 |
90 | rtttl:
91 | output: rtttl_out
92 | on_finished_playback:
93 | - logger.log: Song ended!
94 |
95 | api:
96 | services:
97 | - service: play_rtttl
98 | variables:
99 | song_str: string
100 | then:
101 | - rtttl.play:
102 | rtttl: !lambda 'return song_str;'
103 |
104 | # https://esphome.io/components/rtttl.html
105 | # In the developer tools. E.g. for calling rtttl.play select the service droplet_play_rtttl and in service data enter siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e or scale_up:d=32,o=5,b=100:c,c#,d#,e,f#,g#,a#,b
106 |
107 |
108 | sensor:
109 | # MOISTUR LEVEL SENSORS # https://esphome.io/components/sensor/adc.html?highlight=adc
110 | - platform: adc
111 | pin: 34
112 | id: Soil1
113 | name: ${name} SoilM Sens 1
114 | icon: mdi:water-percent
115 | update_interval: 2s
116 | unit_of_measurement: '%'
117 | attenuation: 12db
118 | filters:
119 | - calibrate_linear:
120 | - 2.520 -> 0.00 # Calibrate Min in dry soil
121 | - 0.99 -> 100.00 # Calibrate MAX in 100% wet soil
122 | - lambda: |
123 | if (x < 0) return 0;
124 | else if (x > 100) return 100;
125 | else return (x);
126 | accuracy_decimals: 0
127 |
128 | - platform: adc
129 | pin: 35
130 | id: Soil2
131 | name: ${name} SoilM Sens 2
132 | icon: mdi:water-percent
133 | update_interval: 2s
134 | unit_of_measurement: '%'
135 | attenuation: 12db
136 | filters:
137 | - calibrate_linear:
138 | - 2.520 -> 0.00 # Calibrate Min in dry soil
139 | - 0.99 -> 100.00 # Calibrate MAX in 100% wet soil
140 | - lambda: |
141 | if (x < 0) return 0;
142 | else if (x > 100) return 100;
143 | else return (x);
144 | accuracy_decimals: 0
145 |
146 | - platform: adc
147 | pin: 32
148 | id: Soil3
149 | name: ${name} SoilM Sens 3
150 | icon: mdi:water-percent
151 | update_interval: 2s
152 | unit_of_measurement: '%'
153 | attenuation: 12db
154 | filters:
155 | - calibrate_linear:
156 | - 2.520 -> 0.00 # Calibrate Min in dry soil
157 | - 0.99 -> 100.00 # Calibrate MAX in 100% wet soil
158 | - lambda: |
159 | if (x < 0) return 0;
160 | else if (x > 100) return 100;
161 | else return (x);
162 | accuracy_decimals: 0
163 |
164 | - platform: adc
165 | pin: 33
166 | id: Soil4
167 | name: ${name} SoilM Sens 4
168 | icon: mdi:water-percent
169 | update_interval: 2s
170 | unit_of_measurement: '%'
171 | attenuation: 12db
172 | filters:
173 | - calibrate_linear:
174 | - 2.520 -> 0.00 # Calibrate Min in dry soil
175 | - 0.99 -> 100.00 # Calibrate MAX in 100% wet soil
176 | - lambda: |
177 | if (x < 0) return 0;
178 | else if (x > 100) return 100;
179 | else return (x);
180 | accuracy_decimals: 0
181 |
182 | - platform: adc
183 | pin: 39
184 | id: Soil5
185 | name: ${name} SoilM Sens 5
186 | icon: mdi:water-percent
187 | update_interval: 2s
188 | unit_of_measurement: '%'
189 | attenuation: 12db
190 | filters:
191 | - calibrate_linear:
192 | - 2.520 -> 0.00 # Calibrate Min in dry soil
193 | - 0.99 -> 100.00 # Calibrate MAX in 100% wet soil
194 | - lambda: |
195 | if (x < 0) return 0;
196 | else if (x > 100) return 100;
197 | else return (x);
198 | accuracy_decimals: 0
199 |
200 | # HOME ASSISTANT DESIRED MOISTURE LEVELS # https://esphome.io/components/sensor/homeassistant.html
201 | - platform: homeassistant
202 | name: Desired Moisture level 1
203 | id: desired_mois_value_1
204 | internal: true
205 | entity_id: input_number.moisture_level_for_pump1
206 |
207 | - platform: homeassistant
208 | name: Desired Moisture level 2
209 | id: desired_mois_value_2
210 | internal: true
211 | entity_id: input_number.moisture_level_for_pump2
212 |
213 | - platform: homeassistant
214 | name: Desired Moisture level 3
215 | id: desired_mois_value_3
216 | internal: true
217 | entity_id: input_number.moisture_level_for_pump3
218 |
219 | - platform: homeassistant
220 | name: Desired Moisture level 4
221 | id: desired_mois_value_4
222 | internal: true
223 | entity_id: input_number.moisture_level_for_pump4
224 |
225 | - platform: homeassistant
226 | name: Desired Moisture level 5
227 | id: desired_mois_value_5
228 | internal: true
229 | entity_id: input_number.moisture_level_for_pump5
230 |
231 | # KEEPS MOISTURE LEVEL # Comment out or delete these 5 sensors "Comparison Sens 1,2,3,4,5" if you want to automate the Soil Moisture level with Home Assistant "Automation".
232 | - platform: template
233 | name: Comparison Sens1
234 | internal: true
235 | update_interval: 2s # Seconds to pump water then stops pumping and starts comparing sensors data, if needed it will pump again
236 | lambda: |-
237 | if (id(Soil1).state < id(desired_mois_value_1).state) {
238 | id(pump1).toggle();
239 | } else {
240 | id(pump1).turn_off();
241 | }
242 | return {};
243 |
244 | - platform: template
245 | name: Comparison Sens2
246 | internal: true
247 | update_interval: 2s # Seconds to pump water then stops pumping and starts comparing sensors data, if needed it will pump again
248 | lambda: |-
249 | if (id(Soil2).state < id(desired_mois_value_2).state) {
250 | id(pump2).toggle();
251 | } else {
252 | id(pump2).turn_off();
253 | }
254 | return {};
255 |
256 | - platform: template
257 | name: Comparison Sens3
258 | internal: true
259 | update_interval: 2s # Seconds to pump water then stops pumping and starts comparing sensors data, if needed it will pump again
260 | lambda: |-
261 | if (id(Soil3).state < id(desired_mois_value_3).state) {
262 | id(pump3).toggle();
263 | } else {
264 | id(pump3).turn_off();
265 | }
266 | return {};
267 |
268 | - platform: template
269 | name: Comparison Sens4
270 | internal: true
271 | update_interval: 2s # Seconds to pump water then stops pumping and starts comparing sensors data, if needed it will pump again
272 | lambda: |-
273 | if (id(Soil4).state < id(desired_mois_value_4).state) {
274 | id(pump4).toggle();
275 | } else {
276 | id(pump4).turn_off();
277 | }
278 | return {};
279 |
280 | - platform: template
281 | name: Comparison Sens5
282 | internal: true
283 | update_interval: 2s # Seconds to pump water then stops pumping and starts comparing sensors data, if needed it will pump again
284 | lambda: |-
285 | if (id(Soil5).state < id(desired_mois_value_5).state) {
286 | id(pump5).toggle();
287 | } else {
288 | id(pump5).turn_off();
289 | }
290 | return {};
291 |
292 | # DHT TMP and HUMIDITY SENSOR # https://esphome.io/components/sensor/dht.html Delet if not used
293 | #- platform: dht
294 | # pin: 5
295 | # temperature:
296 | # name: "${name} DHT Temperature"
297 | # id: "dhttemperature"
298 | # humidity:
299 | # name: "${name} DHT Humidity"
300 | # id: "dhthumidity"
301 | # update_interval: 5s
302 |
303 | # DISTANCE SENSOR # # You can measure the height of the plant and plot the growth reight # https://esphome.io/components/sensor/vl53l0x.html?highlight=vl53l0 Delet if not used
304 | #- platform: vl53l0x
305 | # name: "${name} VL53L0x Distance"
306 | # id: "distance"
307 | # address: 0x29
308 | # update_interval: 2s
309 | # long_range: true
310 |
311 | # BMP280 TMP and HUMIDITY SENSOR # https://esphome.io/components/sensor/bmp280.html?highlight=bmp280 Delet if not used
312 | #- platform: bmp280_i2c
313 | # temperature:
314 | # name: "${name} bmp280 Temperature"
315 | # oversampling: 16x
316 | # pressure:
317 | # name: "${name} bmp280 Pressure"
318 | # id: "pressure"
319 | # address: 0x76
320 | # update_interval: 5s
321 |
322 | # https://esphome.io/components/sensor/dallas_temp.html
323 | #- platform: dallas_temp
324 | # address: 0x6e3c......
325 | # name: "${name} Integrated TMP"
326 | # id: "intergratedtmp"
327 |
328 |
329 | # WIFI #
330 | - platform: wifi_signal
331 | name: ${name} WiFi Signal Sensor
332 | id: dbm
333 | update_interval: 5s
334 |
335 | # Uptime sensor #
336 | - platform: uptime
337 | name: ${name} Uptime
338 | update_interval: 3600s
339 |
340 |
341 | switch:
342 |
343 | # PUMPS GPIOs # https://esphome.io/components/switch/gpio.html?highlight=switch
344 | - platform: gpio
345 | pin: 13
346 | id: pump1
347 | name: ${name} Pump 1
348 | icon: mdi:water-pump
349 | restore_mode: ALWAYS_OFF
350 |
351 | - platform: gpio
352 | pin: 4
353 | id: pump2
354 | name: ${name} Pump 2
355 | icon: mdi:water-pump
356 | restore_mode: ALWAYS_OFF
357 |
358 | - platform: gpio
359 | pin: 16
360 | id: pump3
361 | name: ${name} Pump 3
362 | icon: mdi:water-pump
363 | restore_mode: ALWAYS_OFF
364 |
365 | - platform: gpio
366 | pin: 17
367 | id: pump4
368 | name: ${name} Pump 4
369 | icon: mdi:water-pump
370 | restore_mode: ALWAYS_OFF
371 |
372 | - platform: gpio
373 | pin: 18
374 | id: pump5
375 | name: ${name} Pump 5
376 | icon: mdi:water-pump
377 | restore_mode: ALWAYS_OFF
378 |
379 | # MCP230017 FOR EXPANSION BOARD # Uncomment when using expansion board https://esphome.io/components/mcp230xx.html
380 | - platform: gpio
381 | name: '${name} MCP23017 Pin #0'
382 | restore_mode: ALWAYS_OFF
383 | pin:
384 | mcp23xxx: mcp23017_hub
385 | # Use pin number 0
386 | number: 0
387 | mode:
388 | output: true
389 | inverted: true
390 |
391 | - platform: gpio
392 | name: '${name} MCP23017 Pin #1'
393 | restore_mode: ALWAYS_OFF
394 | pin:
395 | mcp23xxx: mcp23017_hub
396 | # Use pin number 0
397 | number: 1
398 | mode:
399 | output: true
400 | inverted: true
401 |
402 | - platform: gpio
403 | name: '${name} MCP23017 Pin #2'
404 | restore_mode: ALWAYS_OFF
405 | pin:
406 | mcp23xxx: mcp23017_hub
407 | # Use pin number 0
408 | number: 2
409 | mode:
410 | output: true
411 | inverted: true
412 |
413 | - platform: gpio
414 | name: '${name} MCP23017 Pin #3'
415 | restore_mode: ALWAYS_OFF
416 | pin:
417 | mcp23xxx: mcp23017_hub
418 | # Use pin number 0
419 | number: 3
420 | mode:
421 | output: true
422 | inverted: true
423 |
424 | - platform: gpio
425 | name: '${name} MCP23017 Pin #4'
426 | restore_mode: ALWAYS_OFF
427 | pin:
428 | mcp23xxx: mcp23017_hub
429 | # Use pin number 0
430 | number: 4
431 | mode:
432 | output: true
433 | inverted: true
434 |
435 | - platform: gpio
436 | name: '${name} MCP23017 Pin #5'
437 | restore_mode: ALWAYS_OFF
438 | pin:
439 | mcp23xxx: mcp23017_hub
440 | # Use pin number 0
441 | number: 5
442 | mode:
443 | output: true
444 | inverted: true
445 |
446 | - platform: gpio
447 | name: '${name} MCP23017 Pin #6'
448 | restore_mode: ALWAYS_OFF
449 | pin:
450 | mcp23xxx: mcp23017_hub
451 | # Use pin number 0
452 | number: 6
453 | mode:
454 | output: true
455 | inverted: true
456 |
457 | - platform: gpio
458 | name: '${name} MCP23017 Pin #7'
459 | restore_mode: ALWAYS_OFF
460 | pin:
461 | mcp23xxx: mcp23017_hub
462 | # Use pin number 0
463 | number: 7
464 | mode:
465 | output: true
466 | inverted: true
467 |
468 | - platform: gpio
469 | name: '${name} MCP23017 Pin #8'
470 | restore_mode: ALWAYS_OFF
471 | pin:
472 | mcp23xxx: mcp23017_hub
473 | # Use pin number 0
474 | number: 8
475 | mode:
476 | output: true
477 | inverted: true
478 |
479 | - platform: gpio
480 | name: '${name} MCP23017 Pin #9'
481 | restore_mode: ALWAYS_OFF
482 | pin:
483 | mcp23xxx: mcp23017_hub
484 | # Use pin number 0
485 | number: 9
486 | mode:
487 | output: true
488 | inverted: true
489 |
490 | - platform: gpio
491 | name: '${name} MCP23017 Pin #10'
492 | restore_mode: ALWAYS_OFF
493 | pin:
494 | mcp23xxx: mcp23017_hub
495 | # Use pin number 0
496 | number: 10
497 | mode:
498 | output: true
499 | inverted: true
500 |
501 | - platform: gpio
502 | name: '${name} MCP23017 Pin #11'
503 | restore_mode: ALWAYS_OFF
504 | pin:
505 | mcp23xxx: mcp23017_hub
506 | # Use pin number 0
507 | number: 11
508 | mode:
509 | output: true
510 | inverted: true
511 |
512 | - platform: gpio
513 | name: '${name} MCP23017 Pin #12'
514 | restore_mode: ALWAYS_OFF
515 | pin:
516 | mcp23xxx: mcp23017_hub
517 | # Use pin number 0
518 | number: 12
519 | mode:
520 | output: true
521 | inverted: true
522 |
523 | - platform: gpio
524 | name: '${name} MCP23017 Pin #13'
525 | restore_mode: ALWAYS_OFF
526 | pin:
527 | mcp23xxx: mcp23017_hub
528 | # Use pin number 0
529 | number: 13
530 | mode:
531 | output: true
532 | inverted: true
533 |
534 | - platform: gpio
535 | name: '${name} MCP23017 Pin #14'
536 | restore_mode: ALWAYS_OFF
537 | pin:
538 | mcp23xxx: mcp23017_hub
539 | # Use pin number 0
540 | number: 14
541 | mode:
542 | output: true
543 | inverted: true
544 |
545 | - platform: gpio
546 | name: '${name} MCP23017 Pin #15'
547 | restore_mode: ALWAYS_OFF
548 | pin:
549 | mcp23xxx: mcp23017_hub
550 | # Use pin number 0
551 | number: 15
552 | mode:
553 | output: true
554 | inverted: true
555 |
556 | - platform: restart
557 | name: ${name} Restart
558 |
559 | output:
560 |
561 | # Integrated BUZZER # If you using pin23 for something else, delete this and remove jumper 1 https://esphome.io/components/output/ledc.html?highlight=buzzer
562 | - platform: ledc
563 | pin: GPIO23
564 | id: rtttl_out
565 |
566 | binary_sensor:
567 |
568 | # BUTTON SHORT and LONG PRES AVALIABLE IN HOME ASSISTANT # https://esphome.io/components/binary_sensor/index.html?highlight=binary_sensor
569 | - platform: gpio
570 | name: ${name} Button
571 | pin:
572 | number: 36
573 | # Short press activates OLED for 20s
574 | on_click:
575 | - min_length: 10ms
576 | max_length: 350ms
577 | then:
578 | - lambda: id(oled).turn_on();
579 | - delay: 20s
580 | - lambda: id(oled).turn_off();
581 | # Long press Do whatever you want
582 | - min_length: 500ms
583 | max_length: 1500ms
584 | then:
585 | # - switch.turn_on: relay_1
586 |
587 | # Status (connection) sensor#
588 | - platform: status
589 | name: ${name} Status
590 |
--------------------------------------------------------------------------------
/Config/Home Assistant/VerticalStackCardConfiguration.txt:
--------------------------------------------------------------------------------
1 | type: vertical-stack
2 | cards:
3 | - type: horizontal-stack
4 | cards:
5 | - type: vertical-stack
6 | cards:
7 | - type: entities
8 | entities:
9 | - input_number.moisture_level_for_pump1
10 | - type: sensor
11 | entity: sensor.droplet_soilm_sens_1
12 | graph: line
13 | - type: vertical-stack
14 | cards:
15 | - type: entities
16 | entities:
17 | - input_number.moisture_level_for_pump2
18 | - type: sensor
19 | entity: sensor.droplet_soilm_sens_2
20 | graph: line
21 | - type: horizontal-stack
22 | cards:
23 | - type: vertical-stack
24 | cards:
25 | - type: entities
26 | entities:
27 | - input_number.moisture_level_for_pump3
28 | - type: sensor
29 | entity: sensor.droplet_soilm_sens_3
30 | graph: line
31 | - type: vertical-stack
32 | cards:
33 | - type: entities
34 | entities:
35 | - entity: input_number.moisture_level_for_pump4
36 | - type: sensor
37 | entity: sensor.droplet_soilm_sens_4
38 | graph: line
39 | - type: entities
40 | entities:
41 | - input_number.moisture_level_for_pump5
42 | - type: sensor
43 | entity: sensor.droplet_soilm_sens_5
44 | graph: line
45 |
--------------------------------------------------------------------------------
/Config/Home Assistant/desiredmoisturelevel.yaml:
--------------------------------------------------------------------------------
1 | input_number:
2 | moisture_level_for_pump1:
3 | name: Desired Moisture level 1
4 | unit_of_measurement: "%"
5 | min: 0
6 | max: 90
7 | step: 1
8 | mode: box
9 |
10 | moisture_level_for_pump2:
11 | name: Desired Moisture level 2
12 | unit_of_measurement: "%"
13 | min: 0
14 | max: 90
15 | step: 1
16 | mode: box
17 |
18 | moisture_level_for_pump3:
19 | name: Desired Moisture level 3
20 | unit_of_measurement: "%"
21 | min: 0
22 | max: 90
23 | step: 1
24 | mode: box
25 |
26 | moisture_level_for_pump4:
27 | name: Desired Moisture level 4
28 | unit_of_measurement: "%"
29 | min: 0
30 | max: 90
31 | step: 1
32 | mode: box
33 |
34 | moisture_level_for_pump5:
35 | name: Desired Moisture level 5
36 | unit_of_measurement: "%"
37 | min: 0
38 | max: 90
39 | step: 1
40 | mode: box
--------------------------------------------------------------------------------
/Gerber/Droplet_Expansion_BOM.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Gerber/Droplet_Expansion_BOM.xlsx
--------------------------------------------------------------------------------
/Gerber/Droplet_Expansion_Board.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Gerber/Droplet_Expansion_Board.zip
--------------------------------------------------------------------------------
/Gerber/Droplet_Main_Board.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Gerber/Droplet_Main_Board.zip
--------------------------------------------------------------------------------
/Gerber/Droplet_Main_Board_BOM.csv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Gerber/Droplet_Main_Board_BOM.csv
--------------------------------------------------------------------------------
/Gerber/Droplet_Schematic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Gerber/Droplet_Schematic.jpg
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2022, PricelessToolkit
4 |
5 | Redistribution and use in source and binary forms, with or without
6 | modification, are permitted provided that the following conditions are met:
7 |
8 | 1. Redistributions of source code must retain the above copyright notice, this
9 | list of conditions and the following disclaimer.
10 |
11 | 2. Redistributions in binary form must reproduce the above copyright notice,
12 | this list of conditions and the following disclaimer in the documentation
13 | and/or other materials provided with the distribution.
14 |
15 | 3. Neither the name of the copyright holder nor the names of its
16 | contributors may be used to endorse or promote products derived from
17 | this software without specific prior written permission.
18 |
19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 🤗 Please consider subscribing to my [YouTube channel](https://www.youtube.com/@PricelessToolkit/videos)
2 | Your subscription goes a long way in backing my work.
3 |
4 |
5 | [](https://ko-fi.com/U6U2QLAF8)
6 |
7 | # Droplet
8 | ALL-IN-ONE Irrigation and monitoring system for ESPHome and Home Assistant.
9 | * Youtube How-To https://youtu.be/mCXTqONmpZk
10 | * Shop https://www.pricelesstoolkit.com
11 |
12 |
13 |
14 | 
15 |
16 |
17 |
18 | ### Main Board
19 |
20 |
21 | 
22 |
23 |
24 | 1. 5x Micro Pump outputs "5v"
25 | 2. 5x Soil Moisture sensor inputs "Data-5v-GND" 'Data line pulled down with 1M ohm resistor' ( Data line MAX 3.3v !!!!! )
26 | 3. Onboard Temperature sensor "DS18B20" https://esphome.io/components/sensor/dallas.html
27 | 4. Onboard Buzzer "Buzzer port can be free up with jumper" https://esphome.io/components/rtttl.html?highlight=buzzer
28 | 5. Breakout pins for connecting "i2c OLED Display" https://esphome.io/components/display/ssd1306.html?highlight=display
29 | 6. 5x Buttons for manual Pumps controll
30 | 7. 1x Button "Short press" for wake-up Oled "Long press" for general purpose. "2x Binary sensors available for HA"
31 | 8. All pumps outputs and moisture sensor inputs have fuses
32 | 9. Pins Which can be used "GPIO 19,5,26,2,15,27,14,12" and "1xi2c GPIO 21,22" "1xUART" "GPIO25 External port for DS18B20 TMP Sensor!!"
33 |
34 | ### Expansion Board v3
35 |
36 |
37 | 
38 |
39 |
40 | 1. 1x JST 10pin connector Outputs for 8 Relays "MCP23017" Expander https://esphome.io/components/mcp230xx.html
41 | 2. 1x 8 Pin Header "MCP23017" Expander https://esphome.io/components/mcp230xx.html
42 | 3. 2x XH 4pin i2c (V, GPIO 21, GPIO 22 GND)
43 | 4. 7x XH 3pin GPIO 19,5,26,2,15,27,14
44 | 5. 1x XH 3pin for "DS18B20 TMP Sensors" (3.3v, GPIO 25, GND)
45 | 6. 1x 1pin Header GPIO23 connected to buzzer. Buzzer port can be free up, "remove jumper JP"
46 |
47 |
48 |
49 | ## What sensors Droplet support ?
50 | ### Droplet support "Almost all sensors supported by ESPHome" https://esphome.io/index.html
51 |
52 | I connected and tested at the same time.
53 | * 5x Pump
54 | * 5x Moisture Sensor V2,
55 | * 2x "DS18B20" Temperature,
56 | * 1x BMP280 Temperature and Pressure,
57 | * 1x VL53L0x Distance Sensor,
58 | * 1x DHT Temperature and Humidity,
59 | * 8x Relays.
60 |
61 |
62 |
63 | 
64 |
65 |
66 | ## First time setup
67 |
68 | ### WIFI Captive Portal
69 |
70 | The captive portal component in ESPHome is a fallback mechanism for when connecting to the configured WiFi fails.
71 | After 1 minute of unsuccessful WiFi connection attempts, the ESP will start a WiFi hotspot with the credentials
72 | ```
73 | SSID: "Droplet Fallback Hotspot"
74 | password: "password"
75 | ```
76 |
77 | When you connect to the fallback network, the web interface should open automatically (see also login to network notifications).
78 | If that does not work, you can also navigate to http://192.168.4.1/ manually in your browser.
79 | In this web interface, you can manually override the WiFi settings of the device.
80 | Additionally, you can upload a new firmware file to your node without having to use a USB cable for uploads.
81 |
82 |
83 |
84 |
85 | ### Reflashing via USB-UART adapter
86 |
87 | First, you need to create in the ESPhome new device using the Droplet Config file "don't forget to change it to your needs" then compile it and download the ".bin" file. To upload it to the Droplet, we also need "ESPHome Flasher" software
88 |
89 | * Connect your USB-UART adapter to the Droplet Mainboard "GND, 3.3V, TX, RX"
90 | *
91 | 
92 |
93 | * Push the "PROG" button on the Droplet Mainboard "Don't release it"
94 | * Plug the USB-UART adapter to the PC.
95 | * Upload firmware via ESPHome Flasher.
96 | * Release the "PROG" button.
97 |
98 |
99 |
100 |
101 | ## Setting the onboard DS18b20 temperature sensor
102 |
103 | First of all we need to find out the address of the Onboard temperature sensor.
104 | For example with this configuration: "which is already in the default config"
105 |
106 | ```yaml
107 | one_wire: #https://esphome.io/components/one_wire
108 | - platform: gpio
109 | pin: GPIO25
110 | ```
111 |
112 | In the log output (ensure the log level is set to at least debug), you’ll see something like this.
113 |
114 |
115 |
116 |
117 |
118 | With the temperature sensor address identified in the log, we can now enable the Display component by uncomenting this line.
119 |
120 | ```yaml
121 | it.printf(5, 15, id(font3) ,"%.1f°C", id(intergratedtmp).state);
122 | ```
123 |
124 | It should look like this in the full configuration.
125 |
126 | ```yaml
127 | display: # More info https://esphome.io/components/display/ssd1306.html?highlight=1306
128 | - platform: ssd1306_i2c
129 | id: oled
130 | model: SSD1306 128x64
131 | address: 0x3C # Oled Display Address
132 | lambda: |-
133 | it.printf(2, 0, id(font2), TextAlign::TOP_LEFT, "DROPLET");
134 | it.printf(61, 0, id(font2) ,"%.1f", id(dbm).state);
135 | it.line(0, 12, 98, 12);
136 | it.line(98, 0, 98, 64);
137 | it.printf(102, 0, id(font2) ,"%.1f", id(Soil1).state);
138 | it.printf(102, 12, id(font2) ,"%.1f", id(Soil2).state);
139 | it.printf(102, 24, id(font2) ,"%.1f", id(Soil3).state);
140 | it.printf(102, 36, id(font2) ,"%.1f", id(Soil4).state);
141 | it.printf(102, 48, id(font2) ,"%.1f", id(Soil5).state);
142 | it.printf(5, 15, id(font3) ,"%.1f°C", id(intergratedtmp).state);
143 | # it.printf(5, 30, id(font3) ,"%.1fH", id(dhthumidity).state);
144 | # it.printf(5, 45, id(font3) ,"%.1fP", id(pressure).state);
145 |
146 | ```
147 |
148 | Now, uncomment the integrated temperature sensor configuration and add the address.
149 |
150 | ```yaml
151 | - platform: dallas_temp
152 | address: 0x6e3c......
153 | name: "${name} Integrated TMP"
154 | id: "intergratedtmp"
155 | ```
156 | After adding it to the configuration, reinstall the firmware once more.
157 |
158 |
159 | ## Part List
160 | > [!NOTE]
161 | > !!! Sellers often change the type of pump, so the link may not be relevant. !!!
162 | > The correct pump connector pitch is 2.54 mm.
163 |
164 | * Power adapter 5v 2-3.5Ah Connector DC-005 2.0 - https://s.click.aliexpress.com/e/_DEsuOdV
165 | * Oled Display - https://s.click.aliexpress.com/e/_DlkmoXv
166 | * Water Pump "Model B JSB1523" 5V "Connector pitch 2.54mm" - https://s.click.aliexpress.com/e/_ok8vbDj
167 | * Water Pump Datasheet - https://github.com/PricelessToolkit/Droplet/blob/main/Water_Pump_JSB1523008.pdf
168 | * Silicone tube "inner diameters 3 and 4mm" - https://s.click.aliexpress.com/e/_DBnM9qL
169 | * Heat Set Insert M3 X D4.6 X L4.5 - https://s.click.aliexpress.com/e/_9xbSZC
170 | * Capacitive Soil Moisture Sensor "lottery may be working or defective" - https://s.click.aliexpress.com/e/_9Qz84W
171 | * Cables with connectors for sensors and relays "pin pitch XH 2.54MM" - https://s.click.aliexpress.com/e/_DDpn7iB
172 | * 3D Case "For those who live in France" you can order here - https://www.facebook.com/Upin3d
173 | * Cable for soil moisture sensor https://s.click.aliexpress.com/e/_DDGNx5h
174 |
--------------------------------------------------------------------------------
/Water_Pump_JSB1523008.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/Water_Pump_JSB1523008.pdf
--------------------------------------------------------------------------------
/img/ExpaBoard.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/ExpaBoard.JPG
--------------------------------------------------------------------------------
/img/HASensors.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/HASensors.JPG
--------------------------------------------------------------------------------
/img/Housing.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/Housing.JPG
--------------------------------------------------------------------------------
/img/Housing1.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/Housing1.JPG
--------------------------------------------------------------------------------
/img/droplet.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/droplet.jpg
--------------------------------------------------------------------------------
/img/dropletfull.JPEG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/dropletfull.JPEG
--------------------------------------------------------------------------------
/img/prog_header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PricelessToolkit/Droplet/d0702b32611947b0581321197b8147835f824470/img/prog_header.jpg
--------------------------------------------------------------------------------