قابلیت OTA روشی برای پروگرام کردن MCU ها از راه دور و بدون اتصال سیمی به کامپیوتر است . در این روش مقداری از حافظه Flash به برنامه OTA اختصاص می یابد و OTA همانند بوت لودر در هنگام دریافت برنامه جدید آن را بایت به بایت بر روی حافظه Flash پروگرام می کند . ماژول های ESP32 از این قابلیت پشتیبانی می کنند . التبه سخت افزار یا پریفرال خاصی برای این کار ندارند اما Espressif قابلیت OTA به صورت نرم افزاری را برای این ماژول ها توسعه داده است به طوریکه API های زیادی برای استفاده از OTA در اختیار کاربران قرار داده است . از دو روش می توان برای برنامه ریزی ESP32 از طریق OTA استفاده کرد . در حالت اول ESP32 به عنوان وب سرور به وایفای متصل شده و کاربر با باز کردن IP ماژول می تواند به پنل برنامه ریزی دست پیدا کند . در حالت دوم IP ماژول را در IDE وارد کرده و همانند یک پورت COM برنامه به IP متصل شده و می تواند ماژول را پروگرام کند .
برای استفاده از قابلیت OTA ابتدا باید برد های ESP32 را در آردوینو IDE نصب کنید . برای این کار از آموزش های قبلی می توانید استفاده کنید .
کد های زیر را بر روی برد خود پروگرام کنید :
#include <WiFi.h> #include <WiFiClient.h> #include <WebServer.h> #include <ESPmDNS.h> #include <Update.h> const char* host = "esp32"; const char* ssid = "در این قسمت اسم وایفای خود را وارد کنید"; const char* password = "در این قسمت رمز وایفای خود را وارد کنید"; WebServer server(80); /* * Login page */ const char* loginIndex = "<form name='loginForm'>" "<table width='20%' bgcolor='A09F9F' align='center'>" "<tr>" "<td colspan=2>" "<center><font size=4><b>ESP32 Login Page</b></font></center>" "<br>" "</td>" "<br>" "<br>" "</tr>" "<td>Username:</td>" "<td><input type='text' size=25 name='userid'><br></td>" "</tr>" "<br>" "<br>" "<tr>" "<td>Password:</td>" "<td><input type='Password' size=25 name='pwd'><br></td>" "<br>" "<br>" "</tr>" "<tr>" "<td><input type='submit' onclick='check(this.form)' value='Login'></td>" "</tr>" "</table>" "</form>" "<script>" "function check(form)" "{" "if(form.userid.value=='admin' && form.pwd.value=='admin')" "{" "window.open('/serverIndex')" "}" "else" "{" " alert('Error Password or Username')/*displays error message*/" "}" "}" "</script>"; /* * Server Index Page */ const char* serverIndex = "<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>" "<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>" "<input type='file' name='update'>" "<input type='submit' value='Update'>" "</form>" "<div id='prg'>progress: 0%</div>" "<script>" "$('form').submit(function(e){" "e.preventDefault();" "var form = $('#upload_form')[0];" "var data = new FormData(form);" " $.ajax({" "url: '/update'," "type: 'POST'," "data: data," "contentType: false," "processData:false," "xhr: function() {" "var xhr = new window.XMLHttpRequest();" "xhr.upload.addEventListener('progress', function(evt) {" "if (evt.lengthComputable) {" "var per = evt.loaded / evt.total;" "$('#prg').html('progress: ' + Math.round(per*100) + '%');" "}" "}, false);" "return xhr;" "}," "success:function(d, s) {" "console.log('success!')" "}," "error: function (a, b, c) {" "}" "});" "});" "</script>"; /* * setup function */ void setup(void) { Serial.begin(115200); // Connect to WiFi network WiFi.begin(ssid, password); Serial.println(""); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); /*use mdns for host name resolution*/ if (!MDNS.begin(host)) { //http://esp32.local Serial.println("Error setting up MDNS responder!"); while (1) { delay(1000); } } Serial.println("mDNS responder started"); /*return index page which is stored in serverIndex */ server.on("/", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", loginIndex); }); server.on("/serverIndex", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", serverIndex); }); /*handling uploading firmware file */ server.on("/update", HTTP_POST, []() { server.sendHeader("Connection", "close"); server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); ESP.restart(); }, []() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { Serial.printf("Update: %s\n", upload.filename.c_str()); if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_WRITE) { /* flashing firmware to ESP*/ if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_END) { if (Update.end(true)) { //true to set the size to the current progress Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); } else { Update.printError(Serial); } } }); server.begin(); } void loop(void) { server.handleClient(); delay(1); }
کد های فوق را بر روی ماژول ESP32 حود آپلود کنید .
سپس وارد محیط Serial monitor شوید . در این قسمت پس از اتصال موفق ESP32 به مودم شما ، IP ماژول نمایش داده می شود :
IP که در محیط ترمینال نشان داده می شود را کپی و آن را در مرورگر خود وارد کند . در این حالت صفحه ای مانند زیر باز می شود :
در هردو قسمت یوزر و رمز admin را وارد کنید و سپس Login را بزنید تا وارد صفحه آپلود شوید :
در این قسمت فایل باینری برنامه خود را انتخاب و با زدن گزینه آپلود آن را بر روی برد خود پروگرام کنید . برای به دست آوردن فایل باینری هر پروژه های می توانید از قسمت Sketch گزینه Export compiled Binary را انتخاب کنید تا فایل باینری پروژه در در پوشه مربوط به برنامه ذخیره شود :