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

בשיעור הזה נבנה קובייה אלקטרונית: לוחצים על כפתור, ומספר בין 1 ל-6 מופיע על התצוגה.
הידע שצריך
1. שלושת שלבי הקובייה
1. הדק — השחקן לוחץ ומתחיל "הטלה" 2. הגרלה — הלוח מייצר מספר שלם אקראי בין 1 ל-6 3. תצוגה — התוצאה מוצגת על תצוגת המקטעים
2. מספרים אקראיים — והאמת עליהם
מספרים אקראיים מייצרים ערכים בלתי צפויים בטווח נתון. משתמשים בהם להטלת קובייה, להגרלות, לאירועים אקראיים במשחקים ולהתנהגות של רובוטים.
אבל יש כאן סוד שחשוב להבין:
⚠️ מחשב לא יודע לייצר אקראיות אמיתית. מה שהוא מייצר הוא סדרה שנראית אקראית — תוצאה של חישוב מתמטי. אלה נקראים מספרים פסאודו-אקראיים.
3. זרע האקראיות
נקודת ההתחלה של הסדרה נקבעת על ידי מספר שנקרא זרע (seed).
וכאן הבעיה: אם הזרע זהה בכל הפעלה — הסדרה תהיה זהה בכל פעם. תפעילו את הקובייה שלוש פעמים, ותקבלו בדיוק את אותם מספרים בדיוק באותו סדר. קובייה כזו חסרת ערך.
הפתרון — ובו הרעיון היפה של השיעור
randomSeed(analogRead(34));
קוראים פין אנלוגי שלא מחובר לכלום.
פין צף כזה קולט רעש חשמלי אקראי מהסביבה — בדיוק אותו "זבל" שבשיעור 4 היה בעיה שהיינו צריכים לפתור עם Pull-Up. כאן הזבל הזה הוא בדיוק מה שאנחנו רוצים. הוא שונה בכל הפעלה, ולכן הסדרה שונה בכל הפעלה.
אותה תופעה פיזיקלית — פעם בעיה, פעם פתרון. זה שווה לעצור עליו רגע.
4. התבנית
void setup() {
randomSeed(analogRead(pin)); // פין שלא מחובר
}
void loop() {
int randNum = random(min, max); // מספר בין min ל-max-1
}
⚠️
random(1, 7)מחזירה 1 עד 6, לא 1 עד 7. הגבול העליון לא נכלל. זו טעות נפוצה מאוד — לקובייה צריךrandom(1, 7).
הניסוי
המטרה: לחיצה מגרילה מספר בין 1 ל-6 ומציגה אותו.
רשימת רכיבים
| הרכיב | כמות |
|---|---|
| לוח ESP32 | 1 |
| לוח ניסוי 400 נקודות | 1 |
| תצוגת שבעה מקטעים | 1 |
| לחצן | 1 |
| נגד 220Ω | 8 |
| נגד 10kΩ | 1 |
התרשים החשמלי

החיבור

הקוד
int pin_a = 5; int pin_b = 16; int pin_c = 17; int pin_d = 18;
int pin_e = 19; int pin_f = 23; int pin_g = 12; int pin_dp = 13;
int pin_array[8] = {pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, pin_dp};
int number_array[][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0} // 9
};
#define BUTTON_PIN 14
int currentNumber = 0;
void display_number(int num) {
if (num < 0 || num > 9) return; // הגנה מפני ערך לא חוקי
for (int i = 0; i < 8; i++) {
digitalWrite(pin_array[i], number_array[num][i]);
}
}
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(pin_array[i], OUTPUT);
digitalWrite(pin_array[i], 0);
}
pinMode(BUTTON_PIN, INPUT);
randomSeed(analogRead(34)); // זרע מרעש של פין לא מחובר
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) {
delay(200); // ריטוט
while (digitalRead(BUTTON_PIN) == LOW); // המתנה לשחרור
currentNumber = random(1, 7); // 1 עד 6
display_number(currentNumber);
}
}
שימו לב לשורת ההגנה:
if (num < 0 || num > 9) return;
אם מישהו יקרא לפונקציה עם 15, היא תצא בשקט במקום לגשת למקום לא קיים במערך. זו הגנה שכדאי לכתוב בכל פונקציה שמקבלת אינדקס.
מה אמור לקרות

נסו בעצמכם
- הסירו את
randomSeedוהפעילו מחדש כמה פעמים. אותם מספרים? עכשיו הבנתם למה הוא שם. - הוסיפו אנימציית הטלה: ספרות מתחלפות מהר לחצי שנייה לפני שהתוצאה נעצרת.
- בנו שתי קוביות עם תצוגת ארבע הספרות.
- הוסיפו זמזם שמצפצף בכל הטלה.
- ספרו 100 הטלות ובדקו: כמה פעמים יצא כל מספר? מתחלק אחיד?


