معرفی کلی برد توسعه ESP32 – D1 R32:
این برد توسعه یکی از برد توسعه های خانواده ESP32 می باشد و با الگو برداری از برد دوست داشتنی Arduino Uno طراحی شده است .در شکل زیر می توانید نگاه دقیق تری داشته باشید. همانطورکه حدس زدید تقریبا تمامی شیلد های آردینو را می توانیم روی این برد توسعه قدرتمند سوار کنیم و تعداد پایه های ورودی و خروجی آن تقریبا یکسان است.
شرح کلی این پروژه:
در این آموزش می خواهیم از مهم ترین قابلیت این برد یعنی وای فای و دستورات HTTP استفاده کنیم و یک فایل JSON را که از یک وبسایت دریافت می کنیم را دیکود (رمز گشایی) کنیم و سپس یکی از داده های رمزگشایی شده آن را در حافظه دائمی SPIFFS ذخیره کنیم.
SPIFFS:
SPIFFSقابلیتی است که امکان استفاده از بخش هایی از حافظه Flash متصل به ESP32 را به صورت یک حافظه خارجی فراهم می سازد . در واقع در این روش شما می توانید از حجم اختصاص داده شده به SPIFFSجهت ذخیره فایل های مختلف همچون عکس ، فایل های HTML و… استفاده کنید .
JSON:
جیسون معادل اختصاری عبارت JavaScript Object Notation به معنی «نمادگذاری اشیا در جاوا اسکریپت» است. جیسون یک قالب استاندارد باز است که امکان تبادل دادهها در وب با استفاده از جفتهای خصوصیت-کلید را ممکن ساخته است. به صورت خلاصه: بهینه ترین روش دریافت و ارسال اطلاعات به صورت متن در فضای اینترنت و اینترنت اشیا که استفاده می کنیم.
شکل ظاهری جیسون:
JSON Example
{
“employee”: {
“name”: “sonoo”,
“salary”: 56000,
“married”: true
}
}
حال برای انجام یک تست پروژه به یک وبسایت نیاز داریم که یک فایل جیسون را از آن دریافت کنیم که من از وبسایت dummyjson.com استفاده کردم.
حال می توانیم که کتابخانه ها و هدر های مورد نیاز این کد را بررسی کنیم که می توانید تمامی این فایل هارا همراه کد پروژه در آخر این پست دانلود کنید.
فایل هدر که باید اضافه کنید | SPIFFS-functions |
کتابخانه که باید نصب کنید | ArduinoJson |
کتابخانه که به صورت پیشفرض موجود است | WiFi |
کتابخانه که به صورت پیشفرض موجود است |
WiFiMulti
|
کتابخانه که به صورت پیشفرض موجود است |
HTTPClient
|
فایل هدر SPIFFS متعلق به وبسایت imax-co.com است |
بررسی بخش های مهم کد:
Before Setup
می توانیم تنظیم کنیم که آیا فایل سیستم در صورت به مشکل خوردن فرمت شود یا نه.
Setup
wifiMulti.addAP(“Modem1” , “12345678”);
wifiMulti.addAP(“Modem2” , “12345678”);
wifiMulti.addAP(“Modem3” , “12345678”);
if(wifiMulti.run() == WL_CONNECTED) {
Serial.println(“WiFi connected”);
}
else if(wifiMulti.run() != WL_CONNECTED) {
Serial.println(“WiFi not connected!”);
delay(1000);
}
در این بخش ما ابتدا سه آدرس و پسورد مودم را به برد می دهیم.
سپس برد می تواند یکی از این روتر های تعریف شده را انتخاب کرده و متصل گردد.
می توانیم وضعیت متصل بودن را ار طریق پورت سریال چک کنیم.
Setup
if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) {
Serial.println(“SPIFFS Mount Failed”);
return;
}
توسط این دستورات می توانیم فایل سیستم خود را راه اندازی کنیم که در صورت خطا کد اجرا نمی شود.
Setup
Serial.println(FSlistDir(“/”, 0));
Serial.println(FSreadFile(“/Title.txt”)) ;
ابتدا تمامی فایل های موجود در فایل سیستم را پرینت می کنیم.
سپس فایل مورد نظر را که یک متغیر در آن وجود دارد را پرینت می کنیم.
Loop
StaticJsonDocument<200> doc;
این دستور مربوط به جیسون می شود که حدود 200 بایت را به پردازش اختصاص می دهد که برای این پروژه کافیست.
Loop
HTTPClient client;
int Rnd = random(0 , 150);
String Url = “https://dummyjson.com/todos/” ;
Url = Url + Rnd ;
ابتدا یک کلاینت را راه اندازی می کنیم.
سپس یک عدد رندوم میان 0 و 150 انتخاب می کنیم و به آخر دستور GET خود متصل می کنیم.با اینکار می توانیم دیتا های مختلفی را از این وبسایت دریافت کنیم.
Loop
client.begin(Url);
int httpcode = client.GET();
if(httpcode > 0){
String payload = client.getString() ;
Serial.println(“/nStatus Code : ” + String(httpcode)) ;
Serial.println(payload);
در این بخش کلاینت خود را اجرا می کنیم و در صورت موفقیت جوابی را که دریافت کردیم.
را نمایش می دهیم و آماده رمز گشایی می شویم.
Loop
DeserializationError error = deserializeJson(doc , payload ) ;
if(error)
Serial.println(“Error In Json”) ;
else{
Serial.println(“Json Decoded Soccses”) ;
..
…..
…
}
این بخش می تواند جیسون را به راحتی آماده خواندن کند و در صورت ارور به ما نمایش می دهد.
Loop
int UserId = doc[“userId”] ;
int Id = doc[“id”] ;
String Title = doc[“todo”] ;
String Status = doc[“completed”] ;
Serial.println(UserId) ;
Serial.println(Id) ;
Serial.println(Title) ;
Serial.println(Status) ;
Serial.println(“—-“) ;
این بخش به راحتی دیتا های مارا داخل متغیر قرار می دهد و سپس نمایش می دهد.
Loop
FSwriteFile(“/Title.txt”, Title);
یک فایل جدید با فرمت تکست ایجاد کردیم و مقدار یکی از متغیر هارا داخل آن می ریزیم.
نکته:اگر فایل از قبل موجود باشد فایل قبلی کاملا پاک می شود.
Loop
Finish = true ;
برنامه فقط یکبار در صورت موفقیت انجام می شود وگرنه تکرار شده و دوباره تلاش می کند.
Loop
client.end() ;
بستن کلاینت HTTP و تمام.
منابع:
imax-co.com
https://www.javatpoint.com/json-example
https://github.com/espressif/arduino-esp32