פעולות בסיסיות על מודול wifi ESP8266 מבית Arduino

פעולות בסיסיות על מודול wifi ESP8266 מבית Arduino

פעולות בסיסיות על מודול wifi ESP8266 מבית Arduino

כאשר אספרסיף השיקה את המודולים הראשונים בשוק wifi עם המשולב ESP8266 ו - הקושחה כדי לטפל בזה באמצעות פקודות AT, מה שאנחנו המשתמשים היינו מעוניינים בו היה לשלב את זה במכלולים איתם מיקרו-בקרים והבעיות הצטמצמו להכרת החושך (לשעבר). טבלת פקודות ESP8266 AT, צרכי האכלה או עדכון קושחה של ESP8266.

תוכן עניינים

    ואז הגיעו במהירות אלטרנטיבות לתכנת את ESP8266 ויישומי מודול wifi בפורמטים שונים מאוד שהעלו חששות אחרים: איזה מודול wifi ESP8266 לבחור בהתאם לטווח של האנטנות השונות (כולל חיצוניות) או השילוב הפיזי של המודולים החדשים הללו במכלולים שלנו.

    ודאי, בשל כל השינויים הללו, ייתכן שלא הושם דגש על ההיבטים הבסיסיים ביותר, הניהול הבסיסי ביותר של מודול wifi ESP8266. למרות ש polarity.es אתה יכול למצוא מידע על השימוש ב- ESP8266 ויש כמה יישומים שנועדו להסביר בצורה כללית את פעולת ה- מודול wifi ESP8266 שימוש בפקודות AT, במיוחד במאמר בנושא ספרייה כדי לבצע שאילתות HTTP מ-Arduino עם מודול ה-WiFi ESP8266, התרשמות הקוראים מצביעות על כך שיהיה שימושי להוסיף עוד מידע בסיסי כדי לעזור למשתמשים ב- ESP8266 לבצע את היישום שלהם.

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

    שלוט במודול wifi ESP8266 מהמחשב דרך היציאה הטורית

    מתוך צלחת Arduino ומשתמש שלך IDE אפשר לפקח על פעולתו של א מודול wifi ESP8266, שלח את פקודות ESP8266 AT וראה את התשובה אבל הרבה יותר נוח לעשות את זה ממחשב עם אפליקציה מסוג טרמינל.

    שימוש ב- CuteCom כדי לבדוק את מודול ה- wifi ESP8266 דרך היציאה הטורית

    תלוי באיזה לוח Arduino בשימוש, ייתכן שתהיה זמינה רק יציאת חומרה טורית אחת, מה שמוסיף קצת אי נוחות לשליחה וקבלה. שינוי מהירות התקשורת הרבה יותר נוח באפליקציית תקשורת טורית ממחשב ומחלק מלוחות אם. Arduino (ובנסיבות מסוימות) אינם תומכים היטב במהירויות הגבוהות יותר של תקשורת טורית, במיוחד 115200 באוד, שהיא מהירות ברירת המחדל של הגרסאות האחרונות של הקושחה.

    על באיזו תוכנית להשתמש כדי לנטר את ESP8266 באמצעות היציאה הטורית, יש הרבה לבחירה לפי צרכים והעדפות; לאחרונה אני משתמש יותר בקלאסיקה CuteCom (זה שבצילום המסך למעלה) כי זה מאוד נוח לי לחזור על מסוימות ESP8266 מודול wifi AT הזמנות בבדיקת פרויקטים.

    כבר ניתנו כאן כמה המלצות על תוכנות שמתפקדות כקונסולה טורית; למשל, כשמדברים על PuTTY לשליטה בהתקני UART טוריים מהמחשב. מרקבנוסף להיותו יישום מצוין, הוא זמין עבור רוב מערכות ההפעלה שולחניות. יתר על כן, כמו מרק יכול לשמש כדי לפעול כמסוף עם היציאה הטורית והן משפחת פרוטוקולי אינטרנט (TCP/IP), כולל אלה שפועלים TLS, הופך לכלי נפוץ שיותר ממחזיר את הזמן (המועט) המושקע בהגדרתו והתרגלות לשימוש בו.

    שימוש ב- PuTTY כדי לבדוק את מודול ה- wifi ESP8266 דרך היציאה הטורית

    בנוסף לתוכנת תקשורת טורית, לחיבור מודול wifi ESP8266 לנמל USB מחשב גם דורש ממיר USB לסדרות TTL. כמו במקרה של תוכנה, ישנן מספר גרסאות, שמהן הן משמשות רק להמרת הפורט USB על יציאה טורית TTL (שניתן להשיג מיורו אחד) לאלו שיכולים לחקות פרוטוקולים שונים (כגון SPI o I2C).

    בדיוק כמו תוכנית שמתפקדת כמסוף טורי, החומרה לתקשורת עם המחשב באמצעותה USB עם מעגל לוגי (לא רק ESP8266) יהווה כלי נפוץ בעבודתו של מפתח אפליקציות בשליטה מיקרו, כדאי שיהיה בארגז הכלים כמה שיותר מהר ולעבוד איתו מודול wifi ESP8266 זו הזדמנות מצוינת לקבל אחד.

    חומרה לתקשורת טורית USB UART לניטור מודול wifi ESP8266

    הממיר USB a UART TTL זה יכול לשמש גם כדי לנטר את ההתנהגות של מעגל שמשתמש ב- ESP8266, לשם כך, היציאות שברצונך לנטר מחוברות בסדרה לכניסת הנתונים (RX) של הממיר באמצעות דיודה מהירה (ה 1N4148, למשל) ונגד (2K2, למשל) במקביל זה לזה. הגדרה כזו עובדת כמו סניפר טורי של חומרה.

    דוגמה Sniffer עבור ESP8266 מחובר ל-Arduino באמצעות ממיר USB UART TTL

    למרות שהרחרח בתמונה למעלה הוא בהחלט בסיסי (בין היתר אין לו חיץ) מספיקה כדי לפקח על פעולת הרכבה עם Arduino ו - ESP8266.

    הסרת הסניפר מהסכמה הקודמת, ה- סכימה המראה כיצד לחבר א מודול wifi ESP8266 לצלחת Arduino. בנוסף להזנתו ב-3V3, יש לחבר את פין האיפוס ופין ההפעלה של המשולב ברמה גבוהה (Enable). כמובן שפין ה-RX של אחד חייב להתחבר ל-TX של השני.

    כדי לפשט את התרשים הקודם, צלחת יוצגה Arduino מופעל ב-3V3 ועבורו יש להניח שהמתח ביציאה הטורית הוא גם 3V3. אם אתה משתמש ב- a מיקרו-בקר עם רמת אות שונה ביציאה הטורית (בדרך כלל 5 V) יהיה צורך, כדי לא לפגוע ב ESP8266, תשתמש ב ממיר רמות כמו אלה בתרשימים למטה. מעגל זה נמצא לעתים קרובות ביישומי מודולים מסחריים רבים מהמדף.

    ממיר רמת אותות 5V ל-3V3 עבור ESP8266 WiFi Module ו-Arduino

    עדכון קושחה ESP8266

    לאס פקודות ESP8266 AT, סיומו, מהירות ברירת המחדל של המודול... תלויים בגרסת ה- קושחה ESP8266. עדיף לוודא שתהיה לך אותה גרסה בכל המודולים, ואם אפשר, שזו הגרסה העדכנית ביותר.

    למרבה הצער, רוב ה דגמי מודול wifi ESP8266 יש להם רק 4Mbit, כך שלא ניתן להתקין עליהם את הגרסה העדכנית ביותר. הגרסה האחרונה (רשמית) של קושחה שניתן להתקין עליה מודולי wifi ESP8266 עם 4 Mbit (הרוב) הוא 0.9.4 הכולל את גרסה 0.2 של פקודות ESP8266 AT.

    לסיכום, כדי לעדכן את הקושחה אתה צריך:

    1. הורד את גרסת הקושחה המתאימה. הגרסה האחרונה (רשמית) עבור מודול עם 4 Mbit של זיכרון, נמצא בתיקיית Espressif ב-github. בתוך ה אתר אספרסיף אתה יכול להוריד את הגרסה העדכנית ביותר של הקושחה, אבל חשוב מאוד לוודא שהמודול עליו הוא מותקן מכיל מספיק זיכרון.

    2. הורד את הגרסה העדכנית ביותר של כלי התקנת הקושחה. המועדף עלי הוא esptool אשר כתוב ב פיתון, אז זה עובד בכל פלטפורמה. בנוסף להורדה, ניתן להתקין אותו גם עם pip install esptool (o pip2 o python -m pip…). כמובן, אספרסיף הוא גם מציע כלי משלו אך זמין כעת רק עבור Windows.

    3. הכן קבצים שהורדו; פתח אותם בתיקייה נגישה ובמידת הצורך, הפוך את הכלי לבר-הפעלה esptool, במקרה שלי, מאז גנו / לינוקס, עם chmod +x esptool

    4. חבר את המודול למחשב באמצעות ממיר USB UART TTL שעובד ב-3V3 או השתמש בממיר רמה אם הוא עובד ב-5 V. בנוסף להספק, תצטרך לחבר TX ל-RX של הממיר USB UART TTL, RX ל-TX, GPIO0 ברמה נמוכה (GND) ואולי GPIO2 ברמה גבוהה (בבדיקות שלי זה עבד גם בחיבור שלו ברמה נמוכה וגם בניתוק). אם למודול יש חיבור GPIO15 פנוי (כפי שקורה ב-ESP-12) יש לחבר אותו לרמה נמוכה. RESET, שבדרך כלל יהיה ברמה גבוהה במהלך הפעולה, ניתן להשאיר לא מחובר או לחבר לרמה גבוהה באמצעות נגד (10K, למשל), שכן לפני תחילת ההקלטה ייתכן שיהיה צורך לאפס את המכשיר על ידי חיבורו לרמה נמוכה.
      על ידי הפעלת המודול הוא יהיה זמין לעדכון אבל, אם מוצגת שגיאת חיבור, יהיה צורך לאפס אותה חיבור RESET ברמה נמוכה לרגע ולאחר מכן השארתו באוויר (ללא חיבור) לתהליך העדכון.
      למודול יש שיא צריכת חצי אמפר (עד 600 mA, לפי חלק מהמשתמשים) לכן חשוב להשתמש בספק כוח המסוגל לתמוך בצריכה זו, במיוחד לעדכון קושחה.

      חיבור מודול wifi ESP8266 ESP-01 ל-USB UART TTL עדכון קושחה

    5. הפעל את הכלי כדי לעדכן את הקושחה. במקרה שלי, שמרתי את מסמכי הכלי והקושחה בשלב 3 באותה תיקיה, אז אני רץ מהמסוף:
      cd ~/Datos/firmwareESP8266 (שנה לתיקיה המכילה את הכלי והקושחה)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud קובע את המהירות של ESP8266 (115200 באוד במקרה שלי) ו --port היציאה הטורית שאליה הוא מתחבר (במקרה שלי, חיקוי, ה-USB הראשון). המסמכים השונים המרכיבים את הקושחה הולכים מאחור write_flash לפני הכתובת, כאשר מסמך user1.bin מכיל את מטען העדכון.

      wifi ESP8266 עדכון קושחה esptool קונסול לכידת

    שלח פקודות למודול wifi ESP8266

    כדי לשלוט ב ESP8266 ממחשב שנצטרך להתחיל איתו הגדר את האפליקציה שעבורו יספיק ① לבחור את היציאה אליה מחובר הממיר USB UART TTL, משהו כמו /dev/USB0 ב-GNU/Linux ודומיו או משהו כזה COM6 ב-Windows, ② בחר את המהירות שבה ESP8266, כנראה 115200 באוד, ③ הגדר 8 סיביות נתונים פלוס סיבית עצירה אחת, ללא זוגיות או לחיצת יד, ו④ קבע את סוף השורה, בהתאם ל- הקושחה, כמעט תמיד CR+LF.

    הגדר את CuteCom לנטר מודול wifi של ESP8266 באמצעות ממיר USB UART TTL

    הגדר את PuTTY לניטור מודול wifi ESP8266 עם ממיר USB UART TTL

    ברגע שהאפליקציה מוגדרת (או, במידת הצורך, מאוחסנת ונבחרה), היא כן לפתוח את החיבור ("פתח מכשיר" ו"פתוח", בהתאמה, בצילומי המסך של הדוגמאות למעלה עם CuteCom y מרק) ואתה יכול להתחיל לשלוח הזמנות ל ESP8266.

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

    הדרך של enviar הזמנות AT al מודול wifi ESP8266 מן Arduino פשוט מאוד: ① הגדר תקשורת עם Serial.begin(115200); (או Serial1, Serial2... בלוחות עם מספר יציאות טוריות של חומרה) ו② לשלוח את הפקודות באמצעות הפורמט Serial.print(orden+"\r\n");

    הדוגמה למעלה מראה כיצד לשלוח את ESP8266 מודול wifi AT הזמנות מן Arduino. במקרה זה הוא מומחש AT+CWJAP, המשמש לחיבור לנקודת גישה. פקודה זו משתמשת כארגומנטים במזהה נקודת הגישה (SSID) והמפתח, שניהם במרכאות, כך שהם הופכים לאובייקט Srtring וסגור אותם במרכאות באמצעות קוד הבריחה (\"). כדי להשלים את ההזמנה, השתמש \r\n שמתאים ל CR y LF.

    לזכור שהיציאה הטורית לא תמיד מזוהה איתה Serial (בצלחות מסוימות זה יכול להיות Serial1, Serial2…) אובייקט היציאה בו נעשה שימוש הוגדר על ידי הקצאתו למאקרו PUERTO_SERIE. זיהוי סוג הלוח המשמש יכול להוסיף מעט אינטליגנציה לבחירת היציאה הטורית; בהמשך נעבור על איך אתה יכול לברר את סוג Arduino. שאר ההגדרות הן ההגדרות הרגילות המאפשרות לך "לשמו" את הערכים הקבועים כדי להימנע מלחזור עליהם (ולעשות טעויות) ולהקל על שינוים.

    הדוגמה לעיל אמורה לחבר את מודול wifi ESP8266 לנקודת הגישה המצוינת אך האם היא כבר הייתה מחוברת לפני כן? החיבור עבד? כדי לדעת זאת, עלינו "להקשיב" למה ESP8266

    קבל נתונים ממודול wifi ESP8266

    על ידי חיבור הנתונים סניפר שהוסבר לעיל למחשב תוכל לראות מה Arduino שלח ל ESP8266 והתגובה שלו. לקריאה מתוך Arduino ולעבד את המידע שבו יהיה צורך לזהות איתו Serial.available() אם הגיעו נתונים, ואם כן טען אותם Serial.read(). הדוגמה הבאה מראה כיצד לקרוא את התגובה מ AT+CWJAP?, שידווח אם יש חיבור לנקודת גישה כלשהי.

    כמו בצלחת ארדונו אונו (ובאחרים) פתיחת הצג הטורי מאפסת את התוכנית, ניתן להשתמש בה כדי לראות במסוף הטורי Arduino המידע שאתה שולח אליו ESP8266 כפי שמראה צילום המסך של התמונה למטה.

    קבל נתונים ממודול wifi ESP8266 מבית Arduino. דוגמה בסיסית

    נתח את התגובה שנשלחה על ידי מודול wifi ESP8266

    כבר ראינו איך לקרוא את המידע שמגיע Arduino מה ESP8266. הבעיה שאתה צריך להתמודד איתה היא שאתה לא יודע מתי זה יתחיל להגיע, כמה זמן ייקח להגיע, מה אורך זה... ולא מאוד יעיל לחכות לתגובה מה- ESP8266 מתקבל מבלי לתת ל מיקרו-בקר לבצע משימות אחרות בינתיים.

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

    חפש טקסט במידע שהתקבל מה-ESP8266

    כדי לחפש את הטקסט שמגיע מה ESP8266 אתה יכול השווה כל מכתב שהתקבל לאחת התואמת להודעה שאתה מחפש. יהיה צורך להשתמש במונה (או מצביע) המצביע על האות שיש להשוות; אם הדמות שמגיעה מה ESP8266 זהה לזה הנבדק בהודעה, המונה מתקדם, אם הוא שונה הוא מאותחל.

    כדי לדעת שהסוף הגיע, יש לעיין בתו הבא של ההודעה שחיפשת, שיהיה אפס (\0) או שאורך ההודעה מאוחסן כדי, על ידי השוואתה למונה, לדעת אם ההשוואה הסתיימה ולכן מודול wifi ESP8266 שלח את ההודעה המבוקשת.

    הדוגמה הבאה משתמשת בפקודה AT+CWLAP שתחזיר רשימה של נקודות גישה ובתוכם מחפשים אחת בשם "wifi polaridad.es". למרות שבחרנו לוודא שהתו האחרון הוא אפס, שכן חיץ היא מאחסנת רק את הטקסט המחפש ואורכו ידוע, ניתן היה גם לבדוק אם התקבלו מספר כזה של מכתבים נכונים. עם לד מחובר לפין 2 מדווח שהטקסט הצפוי נמצא.

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

    אם אתה עובד עם צלחת ארדואינו לאונרדו אתה יכול להשתמש באותה שיטה כדי לעצור את התוכנית ולהמתין לקונסולה (היציאה הטורית המשויכת ל Serial) זמין.

    חפש טקסטים שונים בתגובת ESP8266

    הקוד בדוגמה הקודמת משמש לחיפוש טקסט במידע שנשלח על ידי ESP8266 אך התגובה עשויה לכלול מידע שונה בהתאם לפעולה. נניח, כדי להתחיל עם מקרה פשוט בדוגמה הבאה, שהטקסט שנשלח על ידי ה MCU ESP8266 es OK כאשר הפעולה מבוצעת כהלכה ו ERROR אחרת, כמו בהזמנה AT+CWJAP?, אשר משמש כדי לוודא אם ה מודול wifi ESP8266 כבר מחובר לנקודת גישה.

    יישום חדש זה של אותה שיטה, המחפש התאמה עם מספר הודעות אפשריות, מאפשר לך לבחור בין פעולות שונות בהתאם לתגובה המתקבלת מה- ESP8266, פשוט הפעל את לד תוֹאֵם.

    הגבל את הזמן שלוקח לקבל תשובה

    עד כה לא ניתנה התייחסות לנושא רלוונטי: ה זמן המתנה מרבי (פסק זמן) לפני שקלול פעולה נכשל. אם מסיבה כלשהי הקשר עם מודול wifi ESP8266, המודול עם נקודת הגישה, נקודת הגישה עם האינטרנט או, למשל, שרת היפותטי אינו זמין, התוכנית עשויה להיחסם בנקודה אחת בהמתנה ללא הגבלת זמן, כך שתצטרך לנסח תגובה לנסיבות כאלה. ניתן להגדיר את זמן ההמתנה המקסימלי עבור האפליקציה כולה, בדרך כלל הוא יהיה "נדיב" יותר במקרה כזה, או שניתן לתכנת זמני המתנה בודדים עבור כל פעולה.

    כדי לבדוק שעבר (לפחות) מרווח זמן מסוים בדרך כלל מופחת ה"זמן" של הרגע שבו מתחיל החשבון מה"זמן" הנוכחי ומוודא שההפרש גדול מהגבול הרצוי. "זמן" זה לא חייב להיות זמן אמת, הוא בדרך כלל מתאים למרווח שחלף מאז ה- MCU להתחיל לספור זמן; זה לא משפיע על התוכנית שכן מה שמעניין הוא הזמן שחלף ולא הזמן המוחלט.

    בדרך כלל, כדי לבדוק אם חלף מרווח מסוים, נעשה שימוש בביטוי מהסוג:

    משתנה milisegundos_al_empezar מכיל את הערך של millis() של רגע מסוים בביצוע ממנו הוא מתוזמן, ולכן אין זה יוצא דופן ששמו מתייחס למילה "כרונומטר". המשתנה intervalo_de_tiempo מכיל את המספר המרבי של אלפיות השנייה שהופך את הביטוי הקודם לאמית, כלומר, הוא מייצג את פסק הזמן; בדרך כלל מדובר בקבוע (או מאקרו) וכמו במקרה הקודם, המילה "TIMEOUT" מופיעה לרוב בשמה. אם אתה עובד עם מרווחים קצרים מאוד אתה יכול להשתמש micros() במקום millis() (מיקרו-שניות במקום מילי-שניות) למרות שזה הרבה פחות נפוץ והרבה פחות מדויק.

    מספר שלם ארוך ב Arduino (unsigned long) תופסת 4 בתים (32 סיביות), כך שהערך הגדול ביותר שהוא יכול לייצג הוא 4294967295 (2 בחזקת 32 מינוס אחד, כי הוא מתחיל באפס). על צלחת Arduino בזמן הפעלה רציפה מונה האלפיות השניות יתאפס (יחזור לאפס) בערך כל 50 יום. בעת חיסור עם סוגי נתונים ללא סימנים, אותה התנהגות משוחזרת (היפוך המונה), כך שניתן לשלוט על הזמן הקצוב ללא הגבלת זמן.

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

    בצע פעולה מורכבת המוגדרת על ידי פקודות AT מרובות

    לקבל התייחסות לדוגמה של מטרת האפליקציה שמנצלת את מודול wifi ESP8266, נניח שכן לאחסן מידע במסד נתונים שאליו ניתן לגשת באמצעות שירות אינטרנט כדי לעקוב אחר הטמפרטורה. הקוד הבא קורא חיישן המחובר לכניסה אנלוגית בכל מרווח זמן מסוים, מחשב את הערך הממוצע ולאחר מרווח זמן ארוך יותר שולח אותו לשרת האינטרנט (סגנון IOT) דרך א עתירה HTTP (פרסם, קבל...).

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

    הפעולות המרכיבות את המשימה שיש לבצע לשליחת הטמפרטורה יהיו:

    • אפס את מודול ה- wifi
    • התנתק מנקודת הגישה הנוכחית (במקרה שקיים חיבור ברירת מחדל)
    • הגדר את ההגדרות. לדוגמא, ההנחה היא שיש להגדיר את מצב החיבור (פשוט) ואת התפקיד בתקשורת Wi-Fi (תחנה).
    • התחבר לנקודת גישה
    • ודא שהחיבור תקין (למעשה, זו נקודת הכניסה) אם אין חיבור, התחל את התהליך מההתחלה
    • התחבר לשרת
    • שלח את הבקשה HTTP עם הנתונים שיש לאחסן

    סדר הפעולות לא חייב להיות בדיוק כזה (למרות שהפעולה כן) וכל שלב עשוי לדרוש כמה פקודות ESP8266 ATלדוגמה, התצורה הרשומה לעיל תצטרך שניים: AT+CIPMUX=0 y AT+CWMODE=1.

    מבנה נתונים לייצוג פעולות ב-ESP8266

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

    בדוגמאות הקודמות, בוצע חיפוש בהודעה בתוך התגובה של ה- ESP8266 וזה התפרש כהצלחה או טעות. בנוסף לקבלה (וניתוח) של כל הטקסט שהתקבל, כדי לקבל מינימום גנרי, רצוי לדאוג גם להשלמת ההודעה או, במילים אחרות, לזמינות של מודול wifi ESP8266 לקבל הזמנות חדשות. בדרך זו, השינוי למצב שנוכל לקרוא לו, למשל, "wifi זמין", יכול להיות קבלת שם נקודת הגישה וקבלת הטקסט ERROR או הטקסט OK פירושו שה ESP8266 סיימת את התגובה וכעת תוכל לשלוח את התגובה הבאה פקודת AT ל-ESP8266.

    הקוד למעלה משתמש בוקטור (operacion) כדי לאחסן את הטקסט של הפעולות העוקבות היוצרות את המשימה השלמה. נעשה שימוש במערך דו מימדי (mensaje) עם שלוש התגובות המנותחות. כפי שהוסבר לעיל, יש צורך לחפש את ההודעות המייצגות את סוף התגובה בנוסף להודעה המייצגת תגובה נכונה או לא נכונה. לא לכל הפעולות יהיה אותו מספר של תשובות אפשריות; כאשר יש פחות תגובות, ניתן להשתמש בהודעה ריקה שצורכת את המספר הקטן ביותר האפשרי של מחזורים בניתוח שלה (למרות זאת, זו לא הדרך האופטימלית ביותר). באופן הגיוני, יהיה צורך שמספר התגובות המינימלי המבוקש (שלוש בדוגמה) יכלול את כל אפשרויות ההפעלה, גם אם לא כולן אפשריות.

    כשמדברים על התשובות האפשריות, כבר ניתן לראות שדוגמה זו אינה שימושית במיוחד עבור קבלת נתונים בפורמט שרירותי מ- מודול wifi ESP8266, אבל העניין הוא שבהקשר של שימוש עם מיקרו-בקרים זה לא רגיל; הדבר הנפוץ ביותר הוא לשלוח נתונים שנאספו על ידי החיישנים שהם חיברו ו/או לקבל מידע על מה לעשות עם המפעילים שהוא שולט. מידע בעל ערך רב, שניתן לחזות אותו היטב.

    במבנה הנתונים הקודם, בדיוק כפי שזה נעשה כדי לבטא את התגובות האפשריות המנותחות, נעשה שימוש גם במטריצה ​​דו מימדית לקביעת הפעולה שיש לבצע בכל מקרה (siguiente_operacion). באופן ספציפי, בחרנו להגיב לשלושה סוגים של הודעות: ① טקסט שרירותי (LITERAL) כדי לוודא אם יש חיבור לנקודת הגישה ל-Wi-Fi ולשרת, ② טקסט לזיהוי שגיאות בתהליך (FALLO) ו③ טקסט המציין שהפעולה הושלמה בהצלחה (ACIERTO).

    לבסוף, ישנם שני וקטורים נוספים כדי להגדיר את זמן ההמתנה המקסימלי לפני הוויתור (timeout) וציין (configuracion) אם הפעולה מסתיימת ללא המתנה לתגובה (ESPERAR_RESPUESTA) והודעות המציינות את סיום התקשורת. וקטור אחרון זה, כדי להמחיש דוגמה כיצד ניתן לשמור זיכרון, עובד עם סיביות של בת תצורה כדי לציין את המצבים השונים.

    הראשון פקודות ESP8266 AT של מבנה הנתונים תמיד צפו לתגובה, שיכולה להיות הודעת ההצלחה או השגיאה. כאשר מתרחשת שגיאה, המודול מופעל מחדש והוא מתחיל שוב ואם ההודעה מציינת שהפעולה נכונה, הוא עובר לפעולה הבאה.

    כאשר אתה מתחבר לשרת, הדפוס משתנה. במקרה זה יש צורך ① לשלוח את אורך חבילת הנתונים שיש להעביר ו② לחבר את הבקשה HTTP עם טקסט קבוע בתוספת הערך (של הטמפרטורה) שנשלח לאחסון בשרת. הכנת הנתונים הללו מתבצעת בכל משלוח ויש צורך לחלקו לשניים (להודיע ​​על האורך) או לשלושה (שלח את הבקשה HTTP) ביום הזמנת ESP8266 AT. רק אחרון החלקים שאליהם מחולק הפעולה ימתין לתגובה.

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

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

    כמו בנקודות שונות בקוד תישלח פעולה (כשמגיע הזמן לשלוח את הטמפרטורה הממוצעת, אם עובר זמן ההמתנה של פעולה, כשהפעולה הנוכחית מסתיימת בהצלחה...) אבל איך לעשות זאת הוקם ברחבי העולם, הוא הוגדר מאקרו ENVIAR_OPERACION המקבץ את השלבים הכרוכים בשילוח.

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

    באופן הגיוני, ניתן לבצע מספר פעולות אופטימיזציה בקוד הקודם, אך מכיוון שזוהי דוגמה כדי להבין כיצד ESP8266 באופן גנרי, כדאי להתמקד רק בכמה היבטים, הראשון הוא מבנה הנתונים. נראה שהדבר ההגיוני הוא השתמש במבנה נתונים של שפת תכנות (struct) כדי לייצג את המידע המעובד: ה פקודות ESP8266 AT והמסרים שמנתחים.

    השתמש במבנה (struct) לאחסן את הנתונים במקום מערכי הדוגמה (בהתבסס עליהם) הוא טריוויאלי, ולמרות שזה עשוי לגרום לקוד אלגנטי יותר, זה לא מרמז על שיפור כלשהו בתוצאה. האלטרנטיבה האמיתית שמציבה השימוש ב struct הוא ליישם, כפי שמוסבר להלן, אורכים משתנים במבנים המכילים נתונים "פנימיים". שאליהם מתייחסים. בדרך זו, למשל, לא יהיה צורך שלפעולה תהיה מספר קבוע של תגובות לניתוח.

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

    בשורה של אופטימיזציה של הקוד, מעניין לזכור שבתוכנה מסוג זה, המשתמשת בכמות גדולה של טקסט, יכול לחסוך מקום בזיכרון SRAM אחסון מחרוזות טקסט בזיכרון התוכנה (פלאש) עם המאקרו F(). בצילומי המסך הבאים ניתן לראות את התוכנות השונות ואת הפצת הזיכרון הדינמית עם שימוש רגיל בטקסט ושימוש במאקרו F().

    דוגמה לקוד ארדואינו באמצעות טקסט המאוחסן בזיכרון התוכנית (פלאש)
    דוגמה לקוד Arduino באמצעות טקסט ב-SRAM

    ביחס לפעולות המבוצעות על פי המידע המגיע מה מודול wifi ESP8266, כחלופה לבדיקת ההודעה מהקוד וביצוע כזה או אחר לפי הנקלט, ניתן לאחסן במבנה נתונים זה מצביעים על פונקציות שמבצעות כל משימה במקום מחווני מצב (דגלים) שמתריעים על מצב מסוים שהאפליקציה אחראית לניהול, למשל, בתוך הלולאה הראשית.

    להלן דוגמה למבנים לאחסון הנתונים של הבקשות ל- ESP8266 (סוג הנתונים operacion_esp8266) והתגובות שלהם (סוג הנתונים respuesta_esp8266).

    בתור המבנה שמייצג את הפעולה (הנתונים שנשלחים ל- מודול wifi ESP8266) מתייחס למבנה שבו מוגדרות התגובות, ומבנה התגובות למבנה הפעולות, יש צורך להכריז תחילה על שניהם, על ידי הגדרת סוג הנתונים החדש ולאחר מכן הגדרת תוכנו.

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

    כפי שנאמר קודם, חלופה נוספת, להחליף או להשלים מחוון מצב, תהיה לאחסן פונקציה במבנה ההתייחסות (מצביע) שייקרא עם מפגש עם טקסט מסוים בתגובה של מודול wifi ESP8266.

    בדוגמה הקודמת, הוא התווסף למבנה הנתונים המשמש לעיבוד התגובה מה- מודול wifi ESP8266 מצביע לפונקציה (אמורה) שמחזירה נתונים מסוג float (יכול להיות הערך המשוקלל של קריאה אנלוגית) ושאליו מסופקים שני בתים כארגומנטים (שניים unsigned char שיכול להיות הפין שממנו נקרא הקלט האנלוגי וזה שמפעיל את ה-ENABLE של משולב היפותטי).

    בפיתוח עבור MCU, בניגוד למה שקורה בסגנון הפיתוח של מערכות גדולות יותר, זה לא כל כך נדיר להשתמש במשתנים גלובליים בעת הגדרת ההתנהגות (הגלובלית) של האפליקציה השולטת בהרכבה, כך שלא יהיה נדיר במיוחד למצוא סוג זה של הגדרות כפונקציות ללא פרמטרים ושאינן מחזירות ערכים, משהו כמו void (*accion)();

    אם אתה עובד עם דרך זו של ייצוג הנתונים, באמצעות struct של נתונים באורך משתנה, יהיה צורך להקצות באופן דינמי זיכרון עם malloc() (o new(), אם נעשה שימוש באובייקטים), שישתמש בכמות הזיכרון שהוקצה כפרמטר ויחזיר מצביע לתחילת אזור הזיכרון השמור. עם sizeof() על הסוג המאוחסן, כפול מספר האלמנטים שבהם נעשה שימוש, אתה יכול לקבל את כמות הזיכרון הדרושה. דוגמה עם ובלי שימוש בו ניתן לראות בצילומי המסך למטה. malloc(); היזהר עם הזיכרון המשמש את התוכנית במקרה הראשון, עליך לטעון את הספרייה המכילה פונקציה זו.

    דוגמה להקצאת זיכרון עם malloc ב- Arduino

    דוגמה להקצאת טקסט ללא malloc ב- Arduino

    אם הפעולות על מודול wifi ESP8266 ישתנה במהלך ביצוע התוכנית, יהיה צורך לפנות את הזיכרון שלא נעשה בו שימוש free() (o delete(), במקרה של היותם חפצים). למרות שסביר לצפות שהמהדר (GCC) יבצע אופטימיזציה של התוכנית כדי להימנע מחלוקת זיכרון, ודאי שהביצועים לא יהיו אופטימליים כמו עבודה עם זיכרון שהוקצה סטטית.

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

    מכיוון שבדוגמה זו משתמשים בו רק פעם אחת (כל הבקשה מתבצעת בחבילה אחת), זה לא נראה שימושי במיוחד, אבל באופן כללי, ייתכן שיהיה צורך לבצע מספר שליחה באותה פעולה, כולל מקרים בהם הם חייבים ישודרו כמויות משמעותיות של נתונים שיש לפצל כדי למנוע הצפת הזיכרון של ESP8266.

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

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

    1 תגובה

    משתמש הערות
    ดูบอลสด

    אין ספק שיש הרבה מה לברר על הנושא הזה. אני אוהב את כל הנקודות שהעלית

    לפרסם תגובה

    אולי פספסת