קריאה אנלוגית ב-ESP32 – מדריך מלא

קריאה אנלוגית ב-ESP32

מדריך מקיף – מהבסיס ועד היישום המעשי

בעולם האלקטרוניקה, חיישנים רבים מוציאים מתח אנלוגי משתנה – כלומר ערך שמשתנה באופן רציף בתחום המדידה של הבקר. ברמה לימודית נתייחס בדרך כלל לטווח של עד כ-3.3 וולט, אך בפועל הטווח המדויק תלוי בהגדרת המדידה של ה-ADC. כדי לקרוא ערכים אלו, ה-ESP32 מצויד ב-ADC (ממיר אנלוגי-דיגיטלי) מובנה. במדריך זה נלמד מה זה קריאה אנלוגית, כיצד היא עובדת, ואיך מבצעים אותה בפועל.

📡

מהי קריאה אנלוגית?

קריאה אנלוגית היא קריאה של ערך משתנה – לא רק 0 או 1, אלא ערך משתנה בטווח המדידה של הבקר, בדרך כלל עד כ-3.3 וולט כאשר מגדירים את המדידה בהתאם. בניגוד לקריאה דיגיטלית שיודעת רק לומר "כן" או "לא", הקריאה האנלוגית יודעת לומר מהי הרמה או העוצמה של האות.

🌡️ טמפרטורה💡 עוצמת אור🔊 עוצמת קול💧 רמת לחות☢️ קרינה🌫️ ריכוז גז
💡

כשאתם מסובבים ידית של וולום, או מחזיקים חיישן טמפרטורה – אלו כולם אות אנלוגי. הם לא סתם "דלוק" או "כבוי" – הם נותנים ערך מדויק.

קריאה אנלוגית לעומת דיגיטלית

חיישן אנלוגי

ערכים אפשריים רבים – עד כ-3.3V בהתאם להגדרה

חיישן דיגיטלי

2

רק שתי אפשרויות: 0 (כבוי) או 1 (דלוק)

חיישן אנלוגי מוציא מתח חשמלי משתנה שמשתנה לפי מה שהוא מודד – בתחום המדידה שהוגדר לבקר, בדרך כלל עד כ-3.3V. חיישן דיגיטלי לעומתו אומר רק "כן" או "לא".

ה-ESP32 יכול לקרוא גם חיישנים דיגיטליים וגם חיישנים אנלוגיים. לקריאה אנלוגית הוא משתמש ב-ADC המובנה בו.

🔌

כיצד ה-ESP32 קורא אנלוגי?

ה-ESP32 קורא את המתח שמגיע לרגל האנלוגית ומעביר אותו דרך ADC (Analog to Digital Converter) – רכיב פנימי שממיר את המתח האנלוגי למספר דיגיטלי.

⚠️

שימו לב! ה-ESP32 לא מחזיר לנו ישר את המתח בוולטים – הוא מחזיר מספר בין 0 ל-4095. מדוע 4095? כי ה-ADC הוא בעל רזולוציה של 12 סיביות (2¹²=4096 ערכים).

מתח בכניסה ערך דיגיטלי
~0V 0
~1.65V 2048
~3.3V 4095
💻

הפקודה analogRead

כדי לקרוא קריאה אנלוגית ב-ESP32, משתמשים בפקודה analogRead. הפקודה מקבלת כפרמטר את מספר הרגל שרוצים לקרוא ממנה.

int analogValue = analogRead(34);

// קורא את המתח מרגל 34
// מחזיר מספר בין 0 ל-4095

ℹ️

בפרויקטים לימודיים עם ESP32 נעדיף בדרך כלל להשתמש ברגליים GPIO 34, 35, 36, 39. אלו רגליים לקריאה בלבד (input only), ולכן הן מתאימות מאוד לחיבור חיישנים אנלוגיים. בנוסף קיימות גם GPIO 32 ו-GPIO 33, שיכולות לשמש לקריאה אנלוגית וגם לפלט דיגיטלי.

⚙️

כיצד מתבצעת הקריאה האנלוגית?

  1. חיישן אנלוגי מוציא מתח חשמלי משתנה שמשתנה לפי מה שהוא מודד

  2. המתח מגיע לרגל האנלוגית של ה-ESP32 (לדוגמה GPIO34)

  3. ה-ADC המובנה ממיר את המתח האנלוגי למספר דיגיטלי בין 0 ל-4095

  4. הפקודה analogRead מחזירה לנו את המספר הזה בתוכנית

  5. אנחנו מחליטים לפי המספר מה מצב החיישן ומה לעשות

🧮

כיצד ממירים קריאה למתח?

אם רוצים לחשב בקירוב מה המתח שהגיע לרגל האנלוגית, משתמשים בנוסחה הלימודית הבאה:

מתח=קריאה אנלוגית4095×3.3

דוגמה: אם הקריאה היא 2048, אז: (2048 ÷ 4095) × 3.3 ≈ 1.65 וולט. חשוב לזכור שזהו חישוב מקורב, ובמדידות מדויקות יותר יש להתחשב בכיול, ברעש ובטווח המדידה שהוגדר.

🎯

מה עושים עם הערך שחישבנו?

אחרי שהמרנו את הקריאה האנלוגית למתח, אפשר להשתמש בו כדי להבין את מצב החיישן:

☀️ חיישן אור

מתח גבוה = הרבה אור

🌫️ חיישן גז

מתח גבוה = ריכוז גבוה

☢️ חיישן קרינה

מתח גבוה = קרינה חזקה

💧 חיישן לחות

המתח משתנה לפי לחות

📋 סיכום – מה שלמדנו

כל מה שצריך לזכור על קריאה אנלוגית ב-ESP32:

📡

קריאה אנלוגית היא קריאה של ערך משתנה, ולא רק 0 או 1

🔌

החיישן מוציא מתח חשמלי משתנה לפי מה שהוא מודד

💻

ה-ESP32 קורא בעזרת הפקודה analogRead

🔢

ה-ADC ממיר למספר בין 0 ל-4095

🧮

אפשר להמיר חזרה למתח בעזרת הנוסחה

🎯

לפי הערך קובעים את מצב החיישן

🔬

רזולוציה של ADC – מה זה אומר בפועל?

ה-ESP32 משתמש ב-ADC בעל רזולוציה של 12 סיביות. המשמעות היא שהערך הדיגיטלי יכול לקבל 4096 אפשרויות שונות (2¹² = 4096), כלומר מ-0 עד 4095. ככל שיש יותר סיביות – כך יש יותר מדרגות מדידה, אך חשוב לדעת שהדיוק בפועל תלוי גם ברעש חשמלי, בכיול, באיכות החיישן וביציבות ספק הכוח.

B11
B10
B9
B8
B7
B6
B5
B4
B3
B2
B1
B0

12 סיביות = 4096 ערכים אפשריים (0 עד 4095)

רזולוציה (סיביות) ערכים אפשריים גודל מדרגה תאורטי שימוש נפוץ
8 סיביות 256 ~12.9 mV חיישנים ומערכות פשוטות
10 סיביות 1,024 ~3.2 mV Arduino UNO/Nano
12 סיביות 4,096 ~0.8 mV ESP32, STM32
16 סיביות 65,536 ~0.05 mV מדידות מדעיות, אודיו
💡

ב-ESP32 בפועל: ~0.8 mV הוא גודל מדרגה תאורטי בלבד כאשר מחשבים 3.3V חלקי 4096. זה לא אומר שכל מדידה תהיה מדויקת ברמה של פחות ממילי-וולט, משום שבפועל קיימים רעש, סטיות וכיול לא מושלם. לכן בפרויקטים אמיתיים נשתמש גם בממוצע קריאות ובבדיקת ספים.

📊

הגדרת טווח מדידה – Attenuation

ב-ESP32 ניתן לשנות את טווח המתח שה-ADC יכול למדוד, בעזרת הגדרת Attenuation (הנחתה). ברירת המחדל היא 0dB, שמתאימה למדידת מתחים נמוכים יחסית. כאשר רוצים למדוד מתחים גבוהים יותר, עד אזור של כ-3.3V, נגדיר הנחתה גבוהה יותר. הטווחים בטבלה הם טווחים לימודיים מקורבים, והערכים המדויקים עשויים להשתנות מעט בין לוחות ובין הגדרות.

הגדרה טווח מדידה מקורב פקודה
ADC_ATTEN_0db עד בערך 1.1V analogSetAttenuation(ADC_0db)
ADC_ATTEN_2_5db עד בערך 1.5V analogSetAttenuation(ADC_2_5db)
ADC_ATTEN_6db עד בערך 2.2V analogSetAttenuation(ADC_6db)
ADC_ATTEN_11db עד אזור של כ-3.3V analogSetAttenuation(ADC_11db)
// הגדרת טווח מדידה רחב, עד אזור של כ-3.3V
void setup() {
analogSetAttenuation(ADC_11db); // טווח מדידה רחב
Serial.begin(115200);
}

void loop() {
int val = analogRead(34);
Serial.println(val);
delay(100);
}

⚠️

חשוב! אם לא נגדיר Attenuation מתאים, ה-ADC עלול להגיע מהר לרוויה ולהחזיר קריאות קרובות למקסימום, גם כאשר המתח ממשיך לעלות. זו טעות נפוצה של מתחילים!

⚡ בעיה נפוצה: רעש (Noise) בקריאה האנלוגית

קריאה אנלוגית ב-ESP32 אינה יציבה לחלוטין. גם אם המתח לא משתנה, הקריאות עשויות להשתנות ב-±10-50 ערכים. הסיבות: רעש חשמלי, חימום הרכיב, WiFi פעיל ועוד. הפתרון – ממוצע של מספר קריאות:

// ממוצע של 10 קריאות לקבלת ערך יציב
int readStable(int pin) {
long sum = 0;
for (int i = 0; i < 10; i++) {
sum += analogRead(pin);
delay(2);
}
return sum / 10;
}

void loop() {
int stableVal = readStable(34);
float voltage = (stableVal / 4095.0) * 3.3;
Serial.print("Voltage: ");
Serial.println(voltage);
}

🔀

ADC1 לעומת ADC2 ב-ESP32

ל-ESP32 יש שני בלוקים של ADC. הבדל חשוב מאוד:

ADC1 ✅

GPIO 32, 33, 34, 35, 36, 37, 38, 39

עובד תמיד – גם כשה-WiFi פעיל

ADC2 ⚠️

GPIO 0, 2, 4, 12, 13, 14, 15, 25, 26, 27

עלול לא לעבוד תקין כשה-WiFi פעיל!

⚠️

כלל זהב: בפרויקטים עם WiFi או Bluetooth נעדיף להשתמש ב-ADC1, במיוחד GPIO 34, 35, 36, 39. ADC2 משותף עם מודול ה-WiFi ולכן עלול להחזיר קריאות לא תקינות כשהאינטרנט פעיל.

📍

מפת פינים – GPIO לקריאה אנלוגית

GPIO ADC כיוון הערות
GPIO 32 ADC1_CH4 קלט/פלט ניתן גם לכתיבה דיגיטלית
GPIO 33 ADC1_CH5 קלט/פלט ניתן גם לכתיבה דיגיטלית
GPIO 34 ADC1_CH6 קלט בלבד ⭐ מומלץ – input only
GPIO 35 ADC1_CH7 קלט בלבד ⭐ מומלץ – input only
GPIO 36 (VP) ADC1_CH0 קלט בלבד ⭐ מומלץ – input only
GPIO 39 (VN) ADC1_CH3 קלט בלבד ⭐ מומלץ – input only

הפינים המומלצים ביותר לקריאה אנלוגית: GPIO 34, 35, 36, 39 – הם input only ולכן לא ניתן לחבר אותם בטעות כפלט, מה שמגן על הרכיב.

☀️

דוגמה מעשית: חיישן אור (LDR)

חיישן LDR (Light Dependent Resistor) משנה את ההתנגדות שלו לפי כמות האור. בחיבור עם נגד (Voltage Divider), נקבל מתח משתנה שניתן לקרוא עם analogRead.

📐 חיבור (Voltage Divider):

3.3V → LDR → GPIO34
GPIO34 → נגד 10kΩ → GND

void setup() {
Serial.begin(115200);
analogSetAttenuation(ADC_11db);
}

void loop() {
int ldrVal = analogRead(34);
float voltage = (ldrVal / 4095.0) * 3.3;

Serial.print("ADC: "); Serial.print(ldrVal);
Serial.print(" | Voltage: "); Serial.print(voltage);
Serial.println("V");

if (ldrVal > 3000) {
Serial.println("☀️ אור חזק");
} else if (ldrVal > 1500) {
Serial.println("🌤 אור בינוני");
} else {
Serial.println("🌙 חושך");
}
delay(500);
}

מחלק מתח – Voltage Divider

טכניקה בסיסית באלקטרוניקה: שני נגדים בטור מחלקים את המתח. המתח שנקרא ב-GPIO הוא חלק מהמתח הכולל.

Vout=

R2
R1 + R2

×Vin

📌 דוגמה

R1=10kΩ, R2=10kΩ, Vin=5V
Vout = (10/20) × 5 = 2.5V

🎯 שימוש נפוץ

מדידת מתח גבוה יותר מטווח הכניסה של ה-ESP32, למשל 5V או 12V, לאחר התאמה בטוחה בעזרת נגדים

🚨

לעולם אל תחברו מתח גבוה מ-3.3V ישירות לפין ה-GPIO של ה-ESP32! זה עלול לשרוף את הרכיב. כאשר מודדים מתח גבוה יותר, משתמשים במחלק מתח מתאים.

שאלות ותשובות – סיכום

לחץ על כל שאלה כדי לראות את התשובה:

מה ההבדל בין קריאה אנלוגית לדיגיטלית?

קריאה דיגיטלית יכולה לקרוא רק שני מצבים: HIGH (1) או LOW (0). קריאה אנלוגית מסוגלת לקרוא רמות שונות של מתח בתחום המדידה שהוגדר, ולהמיר אותן למספר בין 0 ל-4095. למשל: חיישן טמפרטורה מוציא מתח משתנה – רק קריאה אנלוגית תוכל לעזור לנו להבין את רמת המדידה, ולא רק אם יש או אין אות.

למה ה-ADC של ESP32 מחזיר מספרים עד 4095 ולא עד 100 או 1000?

ה-ADC הוא בעל רזולוציה 12 סיביות. במחשב, 12 סיביות יכולות לייצג 2¹² = 4096 ערכים שונים (מ-0 עד 4095). זה לא מספר שרירותי – זה נובע ישירות ממבנה החומרה הבינארית. ADC של Arduino UNO הוא 10 סיביות ולכן מחזיר עד 1023.

מדוע לא כדאי להשתמש ב-ADC2 כשה-WiFi פעיל?

ה-ESP32 משתף את ה-ADC2 עם מודול ה-WiFi. כאשר WiFi פעיל, ADC2 עלול להיות לא זמין לקריאה אנלוגית תקינה. התוצאה יכולה להיות קריאות שגויות, קפיצות ערך או כשל בקריאה. לכן בפרויקטים עם רשת נעדיף להשתמש ב-GPIO 32-39 השייכים ל-ADC1.

איך ממירים קריאת ADC חזרה לוולטים?

הנוסחה הלימודית: מתח (V) = (ערך_ADC / 4095) × 3.3. למשל: קריאה של 2048 → (2048/4095) × 3.3 ≈ 1.65V. חשוב לדעת: החישוב מקורב, ויש להגדיר Attenuation מתאים כדי שטווח המדידה יתאים למתח שמחברים.

מה זה Attenuation ולמה צריך אותו?

Attenuation (הנחתה) קובע את טווח המתח שה-ADC מסוגל למדוד. ברירת המחדל (0dB) מתאימה למתחים נמוכים יחסית. כאשר רוצים למדוד מתחים גבוהים יותר, עד אזור של כ-3.3V, נגדיר ADC_11db. הפקודה שנכתוב היא:
analogSetAttenuation(ADC_11db)
בלי הגדרה מתאימה, הקריאה עלולה להגיע מהר למקסימום ולא לשקף נכון את השינוי במתח.

למה הקריאות האנלוגיות "קופצות" כל הזמן?

הקריאות האנלוגיות ב-ESP32 מושפעות מרעש חשמלי (Noise) הנובע מ: פעילות WiFi/BT, חימום הרכיב, ספק כוח לא יציב, ורעש מהסביבה. הפתרון: לקחת ממוצע של 10-20 קריאות רצופות, להוסיף קבל 100nF בין ה-GPIO ל-GND, ולהשתמש ב-GPIO 34/35/36/39 שהם input-only ולכן נקיים יותר.

מה זה מחלק מתח ולמה הוא חשוב?

מחלק מתח הוא מעגל של שני נגדים בטור שמחלקים את המתח. אם יש לנו מתח של 5V ואנחנו רוצים למדוד אותו עם ESP32, נבחר ערכי נגדים שיורידו את המתח לטווח בטוח, עד 3.3V לכל היותר. לדוגמה, R1=10kΩ ו-R2=20kΩ יתנו בקירוב: Vout = (20/30) × 5 = 3.33V. בפועל כדאי להשאיר מרווח ביטחון ולבחור ערכים שיתנו מעט פחות מ-3.3V.

🧠 בוחן – קריאה אנלוגית ב-ESP32

10 שאלות אמריקאיות | בחרו תשובה, לחצו בדוק תשובה, ואז עברו לשאלה הבאה


בכל לחיצה על רענן בוחן, סדר השאלות וסדר התשובות מתערבבים מחדש.
שאלה 1 מתוך 10

אולי יעניין אותך גם...

הצעה לפתרון מבחן השלמה אלקטרוניקה 2026 סמל שאלון 771101 הנדסאים

הצעה לפתרון מבחן השלמה 771101 – 2026

הצעה לפתרון מלא מבחן השלמה בהנדסת אלקטרוניקה ומחשבים (771101) - אביב 2025. כולל הסברים מפורטים, נוסחאות ופתרונות שלב אחר שלב.

error: © תוכן זה שמור באמצעות זכויות יוצרים, אין אפשרות לבצע העתקה. ©