Community project
ESP32 Welcome Project
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

Gather all the parts
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"
2. Connections between "relay_1" and "Arduino"
3. Connections between "pump_1" and "Arduino"
4. Connections between "diode_1" and "Arduino"
5. Connections between "capacitor_1" and "Arduino"
6. Connections between "supply_1" and "Arduino"
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.




