Community project

ESP32 Welcome Project

Arduino
Photo of ESP32 Welcome Project
Generated with AI

علی جعفری

Published October 13, 2026

This project builds an automatic water dispenser that detects when a cup is placed nearby and activates a pump to fill it. The HC-SR04 ultrasonic sensor continuously monitors distance, triggering the relay to switch on the 5V water pump when a cup is detected within range, then shutting it off when the cup is removed.

The guide provides a complete wiring diagram showing how to connect the sensor to the Arduino, wire the relay module for pump control, and add protective components (diode and capacitor) to prevent damage from the pump's inductive kickback. Assembly steps, a full parts list, and Arduino firmware are included to get the dispenser running.

Wiring diagram

Wiring diagram for ESP32 Welcome Project

Gather all the parts

QtyComponent
1

HC-SR04

Ultrasonic distance measurement sensor

1

5V Single-Channel Relay Module

A ready-made 5 volt relay board that lets the Arduino safely switch power to the water pump.

1

5V Mini DC Water Pump

A small two-wire 5 volt DC pump that moves water when it receives power.

1

1N4007 Diode

General-purpose silicon rectifier diode in DO-204AL (DO-41) axial through-hole package. Rated 1A average forward current and 1000V peak reverse voltage (VRRM). Forward voltage drop ~0.7V at typical load (up to 1.1V at full 1A). Used here in series with LM7805 Vout for reverse polarity protection: anode to LM7805 output, cathode to 5V rail, resulting in ~4.3V on the output rail. Not suitable for high-frequency switching (reverse recovery ~2µs–30µs); intended for DC or 50/60Hz rectification only.

1

1000 µF 10V Electrolytic Capacitor

A polarized capacitor placed across the pump supply to reduce voltage dips and electrical noise when the motor starts.

1

Regulated 5V 2A DC Power Supply

A regulated five volt supply that provides enough current for the pump without overloading the Arduino USB power.

Assemble it in 6 steps

1. پمپ و منبع تغذیه را آماده کنید

پمپ را داخل آب قرار دهید و شلنگ خروجی را به محل پر کردن لیوان ببرید. دو خروجی منبع ۵ ولتِ رگوله‌شده با توان حداقل ۲ آمپر را مشخص کنید: سیم مثبت و سیم منفی. تا پایان سیم‌کشی، منبع را به برق وصل نکنید.

  • پمپ نباید خشک کار کند؛ قبل از روشن‌کردن، بخش مکش پمپ را در آب قرار دهید.
  • هرگز پمپ ۵ ولت را به آداپتور ۹ یا ۱۲ ولت وصل نکنید؛ ولتاژ بالاتر می‌تواند پمپ را بسوزاند.

2. سنسور تشخیص لیوان را وصل کنید

روی سنسور HC-SR04، پایه VCC را به 5V آردوینو وصل کنید (برق)، پایه GND را به GND آردوینو وصل کنید (زمین)، پایه TRIG را به D7 وصل کنید (فرمان اندازه‌گیری)، و پایه ECHO را به D6 وصل کنید (برگشت اندازه‌گیری). سنسور را بالای محل لیوان رو به پایین ثابت کنید.

  • برای شروع، فاصله سنسور تا لبه بالایی لیوان را حدود ۵ تا ۱۲ سانتی‌متر بگیرید.
  • VCC و GND را جابه‌جا نکنید؛ جابه‌جایی برق می‌تواند سنسور را خراب کند.

3. برد رله را به آردوینو و زمین مشترک وصل کنید

روی ماژول رله، VCC را به مثبت ۵ ولت منبع خارجی وصل کنید (برق رله)، GND را به GND آردوینو و منفی منبع خارجی وصل کنید (زمین مشترک)، و IN را به D8 آردوینو وصل کنید (فرمان روشن و خاموش). آردوینو را برای اجرای کد فقط با USB خودش روشن کنید.

  • زمین مشترک یعنی GND آردوینو و منفی منبع پمپ با یک سیم به هم وصل هستند؛ بدون آن رله ممکن است فرمان را درست نبیند.
  • مثبت ۵ ولت منبع پمپ را به پایه 5V آردوینو وصل نکنید؛ آردوینو را از USB تغذیه کنید و فقط زمین‌ها را مشترک کنید.

4. برق پمپ را از کنتاکت رله عبور دهید

مثبت منبع ۵ ولت را به COM رله وصل کنید (ورودی برق پمپ). پایه NO رله را به سیم مثبت پمپ وصل کنید (برق پمپ فقط هنگام فعال‌شدن رله می‌رسد). سیم منفی پمپ را مستقیم به منفی منبع ۵ ولت وصل کنید (برگشت برق). پایه NC را استفاده نکنید.

  • اگر روی رله COM، NO و NC پیچ دارد، سیم را زیر تیغه فلزی گذاشته و پیچ را محکم کنید.
  • پمپ را به پایه‌های D آردوینو وصل نکنید؛ این پایه‌ها توان روشن‌کردن موتور را ندارند و ممکن است آسیب ببینند.

5. دیود و خازن محافظ را کنار پمپ وصل کنید

دیود 1N4007 را موازی با پمپ وصل کنید: سر خط‌دار دیود را به مثبت پمپ، یعنی سیمی که از NO رله می‌آید، وصل کنید (محافظ جرقه موتور) و سر بدون خط را به منفی پمپ وصل کنید (برگشت). خازن 1000 میکروفاراد را نیز موازی منبع پمپ وصل کنید: پایه بلندترِ مثبت به 5V+ منبع و پایه نواردارِ منفی به GND منبع.

  • دیود باید دقیقاً نزدیک دو سیم پمپ باشد تا نویز موتور کمتر وارد مدار شود.
  • نوار روی بدنه دیود باید سمت مثبت پمپ باشد؛ برعکس‌زدن آن هنگام روشن‌شدن رله اتصال کوتاه ایجاد می‌کند. پایه نواردار خازن هم باید به منفی وصل شود؛ برعکس‌زدن خازن می‌تواند باعث داغ‌شدن یا خرابی آن شود.

6. روشن‌کردن و امتحان‌کردن دستگاه

ابتدا آردوینو را با کابل USB وصل کنید، سپس در Schematik دکمه Deploy را بزنید. بعد منبع ۵ ولت پمپ را روشن کنید. یک لیوان را ۲ تا ۱۲ سانتی‌متر زیر سنسور بگیرید؛ رله باید وصل شود و پمپ تا زمانی که لیوان آنجاست آب بدهد.

  • اگر با نزدیک‌شدن لیوان پمپ خاموش شد و با برداشتن آن روشن شد، در کد مقدار RELAY_ACTIVE_LOW را از true به false تغییر دهید.
  • همه اتصال‌ها را پیش از روشن‌کردن بررسی کنید و آب را از آردوینو، رله و اتصالات دور نگه دارید؛ آب روی بردها می‌تواند اتصال کوتاه و خرابی ایجاد کند.

Review all connections

1. Connections between "ultrasonic_1" and "Arduino"

Functionultrasonic_1Arduino
powerVCC5V
groundGNDGND
digitalTRIGGPIO 7
digitalECHOGPIO 6

2. Connections between "relay_1" and "Arduino"

Functionrelay_1Arduino
powerVCC → Regulated 5V 2A DC Power Supply 5V+EXT
groundGNDGND
digitalINGPIO 8
powerCOM → Regulated 5V 2A DC Power Supply 5V+EXT
powerNO → 5V Mini DC Water Pump PUMP+EXT

3. Connections between "pump_1" and "Arduino"

Functionpump_1Arduino
groundPUMP- → Regulated 5V 2A DC Power Supply GNDEXT

4. Connections between "diode_1" and "Arduino"

Functiondiode_1Arduino
powerCathode → 5V Mini DC Water Pump PUMP+EXT
powerAnode → 5V Mini DC Water Pump PUMP-EXT

5. Connections between "capacitor_1" and "Arduino"

Functioncapacitor_1Arduino
power+ → Regulated 5V 2A DC Power Supply 5V+EXT
ground- → Regulated 5V 2A DC Power Supply GNDEXT

6. Connections between "supply_1" and "Arduino"

Functionsupply_1Arduino
groundGNDGND

Deploy the firmware

#include <Arduino.h>

const byte TRIG_PIN = 7;
const byte ECHO_PIN = 6;
const byte RELAY_PIN = 8;

// Most single-channel relay modules are active LOW. If yours turns on at the
// wrong level, change this value to false.
const bool RELAY_ACTIVE_LOW = true;

const unsigned long MEASURE_INTERVAL_MS = 70;
const unsigned long LOST_CUP_DELAY_MS = 250;
const unsigned int CUP_DISTANCE_CM = 12;

unsigned long lastMeasureMs = 0;
unsigned long lastCupSeenMs = 0;
bool pumpOn = false;

void setPump(bool on) {
  pumpOn = on;
  if (RELAY_ACTIVE_LOW) {
    digitalWrite(RELAY_PIN, on ? LOW : HIGH);
  } else {
    digitalWrite(RELAY_PIN, on ? HIGH : LOW);
  }
}

unsigned int readDistanceCm() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(3);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  unsigned long echoTimeUs = pulseIn(ECHO_PIN, HIGH, 25000UL);
  if (echoTimeUs == 0) {
    return 0;
  }

  return (unsigned int)(echoTimeUs / 58UL);
}

void setup() {
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(RELAY_PIN, OUTPUT);

  setPump(false);  // Keep the pump off during startup.
}

void loop() {
  unsigned long now = millis();

  if (now - lastMeasureMs >= MEASURE_INTERVAL_MS) {
    lastMeasureMs = now;
    unsigned int distanceCm = readDistanceCm();

    if (distanceCm >= 2 && distanceCm <= CUP_DISTANCE_CM) {
      lastCupSeenMs = now;
      if (!pumpOn) {
        setPump(true);
      }
    }
  }

  if (pumpOn && now - lastCupSeenMs > LOST_CUP_DELAY_MS) {
    setPump(false);
  }
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik