חוזה 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 שניות.
שחקן חוזה
שיטה
נתיב
{}
אין לוח. src/lib/protocol.js מריץ את אותם כללי ולידציה.
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 רשת בלופ.