מה נלמד כאן
- אות דיגיטלי מול אנלוגי
- PWM ו-
duty() - הבדל קריטי: הטווח הוא 0-1023, לא 0-255
- לולאת
range()
קצב
נורית נשימה: האור מתגבר ונחלש לאט, כמו נשימה.

בשיעור הקודם הנורית הייתה דולקת או כבויה. עכשיו נשלוט בכמה.
הידע שצריך
1. דיגיטלי מול אנלוגי
אות דיגיטלי יש לו שני מצבים בלבד — כמו led.value(1) או value(0). אין אמצע.

אות אנלוגי משתנה ברציפות. רוב הדברים בעולם כאלה: טמפרטורה, קול, אור.

⚠️ ה-ESP32 לא יודע להוציא מתח רציף. אז איך שולטים בבהירות?
2. PWM
PWM מדמה אות אנלוגי באמצעות אות דיגיטלי: מדליקים ומכבים מהר מאוד, והיחס ביניהם קובע את ההספק בפועל.

| המונח | מה זה |
|---|---|
| מחזור | הזמן בין תחילת פולס לתחילת הבא |
| רוחב פולס | כמה זמן הפין היה גבוה |
| מחזור פעולה | היחס ביניהם |
3. duty() — והמספר שחייבים לזכור

from machine import Pin, PWM
led = PWM(Pin(5))
led.duty(512)
⚠️ הנקודה הכי חשובה בשיעור: ב-MicroPython הטווח הוא 0 עד 1023, ולא 0 עד 255.
ב-Arduino
analogWriteמקבלת 0-255. כאןduty()מקבלת 0-1023 — כי היא חושפת את הרזולוציה האמיתית של ה-ESP32, 10 ביט.אם אתם ממירים קוד מ-Arduino — זו הטעות הראשונה שתעשו.
| הערך | מחזור פעולה | התוצאה |
|---|---|---|
duty(0) |
0% | כבוי |
duty(256) |
25% | חלש |
duty(512) |
50% | חצי |
duty(1023) |
100% | מלא |
4. הבהירות והפיזיקה

לפי חוק אוהם (U=IR), כשההתנגדות קבועה — מתח גבוה יותר נותן זרם גדול יותר. PWM לא משנה את המתח באמת, אלא את הזמן שבו הוא מופעל. הנורית "רואה" ממוצע.
5. range() במקום for של C
for brightness in range(0, 1024):
led.duty(brightness)
time.sleep_ms(1)
range(0, 1024) מייצר את המספרים 0 עד 1023 — הגבול העליון לא נכלל. זו פייתון רגילה לחלוטין.
לספירה לאחור:
for brightness in range(1023, -1, -1):
שלושת הפרמטרים: מאיפה, עד איפה (לא כולל), בכמה לקפוץ. -1 כצעד = יורדים.
השוו ל-Arduino: שם היה
for (int i = 0; i <= 255; i++)עם שלושה ביטויים ונקודה-פסיק. כאן שורה אחת קריאה. זה היתרון של פייתון.
הניסוי
המטרה: הנורית מתבהרת ונחלשת בהדרגה.
רשימת רכיבים
| הרכיב | כמות |
|---|---|
| לוח ESP32 | 1 |
| לוח ניסוי 400 נקודות | 1 |
| נורית LED | 1 |
| נגד 220Ω | 1 |
אותו חיבור כמו בשיעור הקודם.
התרשים החשמלי

החיבור

הקוד
from machine import Pin, PWM
import time
LED_PIN = 5
led = PWM(Pin(LED_PIN)) # אובייקט PWM על הפין
while True:
# התבהרות
for brightness in range(0, 1024):
led.duty(brightness)
time.sleep_ms(1)
# היחלשות
for brightness in range(1023, -1, -1):
led.duty(brightness)
time.sleep_ms(1)
שימו לב ל-sleep_ms — מילי-שניות. time.sleep(0.001) היה עושה אותו דבר, אבל sleep_ms קריא יותר ומדויק יותר.
מה אמור לקרות

נסו בעצמכם
- שנו ל-
sleep_ms(5). מה קרה לקצב? - שנו את
rangeל-range(0, 256). הנורית מגיעה לבהירות מלאה? למה לא? - קפצו בצעדים של 5:
range(0, 1024, 5). מה השתנה? - הגבילו לטווח 200-800. איך זה נראה?
- ב-Shell: צרו
led = PWM(Pin(5))והקלידוled.duty(300). שליטה חיה בבהירות.


