חוזה HTTP / Serial

הקושחה מעלה WebServer(80) אחרי ניסיון WiFi של 10 שניות. הארגומנטים הם query/form של Arduino (server.arg), לא גוף JSON. אם הרשת נכשלת — המצב האוטומטי המקומי ממשיך. זה לא SDK ולא ענן.

חמישה נתיבים

שיטהנתיבארגומנטכישלון
GET /status — אין. מחזיר snapshot חי
POST /set-angle deg חסר → missing deg; לא-מספר → invalid deg
POST /set-panel type חסר → missing type; מחוץ ל־0..2 → invalid panel type. מצמיד את היעד לגבול החדש — תנועה באמצע לא מתבטלת
POST /set-mode auto חייב המחרוזת "0" או "1"
POST /stop — אין. עצירת חירום: autoMode = false ואז stepper.stop() — האטה עד עצירה
set-panel?type=foo נכשל ב־400. בעבר String::toInt() של Arduino החזיר 0 — OLED, המכסה הרחב ביותר — עם 200. עכשיו type נפרס ב־strtol עם צריכה מלאה, כמו deg: רווח לבן מוביל וסימן מתקבלים, 1.9 / 2abc / 2 נדחים. המשחק למטה מדגים.

set-angle מכבה אוטו (autoMode = false) ואז קורא moveToAngle, שמצמיד ל־±PANEL_LIMITS[panel]. תשובת 200 אומרת «הפקודה התקבלה», לא «המסך ב־99°».

deg עובר דרך strtof של newlib, לא דרך regex עשרוני: רווח לבן מוביל (%0A12 → 12°) ו־hex (0x10 → 16°) מתקבלים; 1e39 גולש מ־float של 32 ביט ונדחה כ־invalid deg. המראה ב־JS משקף את זה, לא מייפה.

stop לא מנתק זרם: AccelStepper::stop() מחשב יעד חדש בסוף רמפת ההאטה, והסלילים ממשיכים להחזיק. אוטו כבוי אחרת הלולאה הייתה חוזרת לנוע תוך 2 שניות.

שחקן חוזה

שיטה

נתיב

GET /statusבקשה (query string, כמו הלוח)
—קוד תשובה
{}

אין לוח. src/lib/protocol.js מריץ את אותם כללי ולידציה.

0.00°זווית — אין כאן לולאת תנועה, אז היא זזה רק ב־/stop
0.00°יעד — מה ש־/status ידווח
אוטומטימצב
LED (2)פאנל

PUT על נתיב רשום מקבל כאן 405 — זו ההכרעה של src/lib/protocol.js. הלוח רושם רק HTTP_GET/HTTP_POST ונופל ל־onNotFound, אז הוא היה עונה 404 גם ל־PUT. כל שיטה שגויה אחרת היא 404 בשני הצדדים, ובלי שינוי מצב.

גוף /status

{
  "angle":   4.32,
  "target":  7.92,
  "auto":    true,
  "panel":   2,
  "lux_top": 412.0,
  "lux_bot": 77.3
}

panel הוא enum: 0 OLED, 1 QLED, 2 LED. lux_* הם הקריאה החיה מ־BH1750 — קריאה כושלת (ערך שלילי מהספרייה) יוצאת כ־null, לא כ־lux. אין שדה WiFi, אין הומינג, אין מומנט.

angle ו־target שניהם צעדים חלקי STEPS_PER_DEGREE (1000 צעדים לסיבוב, 0.36° לצעד): set-angle?deg=8 הופך ל־22 צעדים ומדווח 7.92. כשהתנועה נגמרת angle == target בדיוק — זו הדרך של הלקוח לדעת שהזרוע הגיעה.

Serial 115200

הקושחה מדפיסה ב־setup() שורת WiFi אחת, ולפניה שורה לכל BH1750 ש־begin() שלו נכשל. לא לוג בקרה, לא קריאות lux.

Serial.begin(115200);

// רק אם חיישן לא עונה על ה־I²C (אחרת כלום):
BH1750 top not found at 0x23
BH1750 bot not found at 0x5C

// אחרי WiFi.begin + לולאת 10 שניות:
IP: 192.168.1.42
// או:
WiFi timeout — continuing in local auto mode

מה קורה בלי רשת

server.begin() עדיין נקרא. בלי קישור, הלקוח לא מגיע לנתיבים. loop() ממשיך: stepper.run() + calcOptimalAngle כל 2 שניות אם autoMode. ניתוק WiFi אחרי החיבור לא מדפיס שוב — אין watchdog רשת בלופ.