סיכום
תוכן עניינים
- 1 קריאה אנלוגית ב-ESP32
- 1.1 מהי קריאה אנלוגית?
- 1.2 קריאה אנלוגית לעומת דיגיטלית
- 1.3 כיצד ה-ESP32 קורא אנלוגי?
- 1.4 הפקודה analogRead
- 1.5 כיצד מתבצעת הקריאה האנלוגית?
- 1.6 כיצד ממירים קריאה למתח?
- 1.7 מה עושים עם הערך שחישבנו?
- 1.8 📋 סיכום – מה שלמדנו
- 1.9 רזולוציה של ADC – מה זה אומר בפועל?
- 1.10 הגדרת טווח מדידה – Attenuation
- 1.11 ADC1 לעומת ADC2 ב-ESP32
- 1.12 מפת פינים – GPIO לקריאה אנלוגית
- 1.13 דוגמה מעשית: חיישן אור (LDR)
- 1.14 מחלק מתח – Voltage Divider
- 1.15 שאלות ותשובות – סיכום
- 1.16 🧠 בוחן – קריאה אנלוגית ב-ESP32
מדריך מקיף לקריאה אנלוגית ב-ESP32 בעזרת ADC מובנה. נלמד מה זה analogRead, איך ה-ADC ממיר מתח למספר בין 0 ל-4095, אילו רגליים מתאימות לקריאה אנלוגית, ואיך לחשב חזרה למתח בוולטים. מתאים למתחילים ומתקדמים בעולם המיקרו-בקרים ו-IoT.
קריאה אנלוגית ב-ESP32
מדריך מקיף – מהבסיס ועד היישום המעשי
בעולם האלקטרוניקה, חיישנים רבים מוציאים מתח אנלוגי משתנה – כלומר ערך שמשתנה באופן רציף בתחום המדידה של הבקר. ברמה לימודית נתייחס בדרך כלל לטווח של עד כ-3.3 וולט, אך בפועל הטווח המדויק תלוי בהגדרת המדידה של ה-ADC. כדי לקרוא ערכים אלו, ה-ESP32 מצויד ב-ADC (ממיר אנלוגי-דיגיטלי) מובנה. במדריך זה נלמד מה זה קריאה אנלוגית, כיצד היא עובדת, ואיך מבצעים אותה בפועל.
מהי קריאה אנלוגית?
קריאה אנלוגית היא קריאה של ערך משתנה – לא רק 0 או 1, אלא ערך משתנה בטווח המדידה של הבקר, בדרך כלל עד כ-3.3 וולט כאשר מגדירים את המדידה בהתאם. בניגוד לקריאה דיגיטלית שיודעת רק לומר "כן" או "לא", הקריאה האנלוגית יודעת לומר מהי הרמה או העוצמה של האות.
כשאתם מסובבים ידית של וולום, או מחזיקים חיישן טמפרטורה – אלו כולם אות אנלוגי. הם לא סתם "דלוק" או "כבוי" – הם נותנים ערך מדויק.
קריאה אנלוגית לעומת דיגיטלית
חיישן אנלוגי
ערכים אפשריים רבים – עד כ-3.3V בהתאם להגדרה
חיישן דיגיטלי
רק שתי אפשרויות: 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, שיכולות לשמש לקריאה אנלוגית וגם לפלט דיגיטלי.
כיצד מתבצעת הקריאה האנלוגית?
-
חיישן אנלוגי מוציא מתח חשמלי משתנה שמשתנה לפי מה שהוא מודד
-
המתח מגיע לרגל האנלוגית של ה-ESP32 (לדוגמה GPIO34)
-
ה-ADC המובנה ממיר את המתח האנלוגי למספר דיגיטלי בין 0 ל-4095
-
הפקודה analogRead מחזירה לנו את המספר הזה בתוכנית
-
אנחנו מחליטים לפי המספר מה מצב החיישן ומה לעשות
כיצד ממירים קריאה למתח?
אם רוצים לחשב בקירוב מה המתח שהגיע לרגל האנלוגית, משתמשים בנוסחה הלימודית הבאה:
דוגמה: אם הקריאה היא 2048, אז: (2048 ÷ 4095) × 3.3 ≈ 1.65 וולט. חשוב לזכור שזהו חישוב מקורב, ובמדידות מדויקות יותר יש להתחשב בכיול, ברעש ובטווח המדידה שהוגדר.
מה עושים עם הערך שחישבנו?
אחרי שהמרנו את הקריאה האנלוגית למתח, אפשר להשתמש בו כדי להבין את מצב החיישן:
מתח גבוה = הרבה אור
מתח גבוה = ריכוז גבוה
מתח גבוה = קרינה חזקה
המתח משתנה לפי לחות
📋 סיכום – מה שלמדנו
כל מה שצריך לזכור על קריאה אנלוגית ב-ESP32:
קריאה אנלוגית היא קריאה של ערך משתנה, ולא רק 0 או 1
החיישן מוציא מתח חשמלי משתנה לפי מה שהוא מודד
ה-ESP32 קורא בעזרת הפקודה analogRead
ה-ADC ממיר למספר בין 0 ל-4095
אפשר להמיר חזרה למתח בעזרת הנוסחה
לפי הערך קובעים את מצב החיישן
רזולוציה של ADC – מה זה אומר בפועל?
ה-ESP32 משתמש ב-ADC בעל רזולוציה של 12 סיביות. המשמעות היא שהערך הדיגיטלי יכול לקבל 4096 אפשרויות שונות (2¹² = 4096), כלומר מ-0 עד 4095. ככל שיש יותר סיביות – כך יש יותר מדרגות מדידה, אך חשוב לדעת שהדיוק בפועל תלוי גם ברעש חשמלי, בכיול, באיכות החיישן וביציבות ספק הכוח.
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 הוא חלק מהמתח הכולל.
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 הוא בעל רזולוציה 12 סיביות. במחשב, 12 סיביות יכולות לייצג 2¹² = 4096 ערכים שונים (מ-0 עד 4095). זה לא מספר שרירותי – זה נובע ישירות ממבנה החומרה הבינארית. ADC של Arduino UNO הוא 10 סיביות ולכן מחזיר עד 1023.
ה-ESP32 משתף את ה-ADC2 עם מודול ה-WiFi. כאשר WiFi פעיל, ADC2 עלול להיות לא זמין לקריאה אנלוגית תקינה. התוצאה יכולה להיות קריאות שגויות, קפיצות ערך או כשל בקריאה. לכן בפרויקטים עם רשת נעדיף להשתמש ב-GPIO 32-39 השייכים ל-ADC1.
הנוסחה הלימודית: מתח (V) = (ערך_ADC / 4095) × 3.3. למשל: קריאה של 2048 → (2048/4095) × 3.3 ≈ 1.65V. חשוב לדעת: החישוב מקורב, ויש להגדיר 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 שאלות אמריקאיות | בחרו תשובה, לחצו בדוק תשובה, ואז עברו לשאלה הבאה
אלקטרוניקה ומחשבים – יצחק, ברקת ושוהם כהן אתר מגמת אלקטרוניקה ומחשבים