├── .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 | [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](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 | ![DROPLETFull](https://raw.githubusercontent.com/PricelessToolkit/Droplet/main/img/dropletfull.JPEG) 15 | 16 | 17 | 18 | ### Main Board 19 | 20 | 21 | ![DROPLET](https://raw.githubusercontent.com/PricelessToolkit/Droplet/main/img/droplet.jpg) 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 | ![ExpBoard](https://raw.githubusercontent.com/PricelessToolkit/Droplet/main/img/ExpaBoard.JPG) 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 | ![HA](https://raw.githubusercontent.com/PricelessToolkit/Droplet/main/img/HASensors.JPG) 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 | ![HA](https://raw.githubusercontent.com/PricelessToolkit/Droplet/main/img/prog_header.jpg) 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 --------------------------------------------------------------------------------