كيفية تتبع الموقع مع NodeMCU دون استخدام وحدة GPS اكتب تعليقُا

تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث الحرائق أو غيرها لا سمح الله.

مقدمـــــــة عن المشروع

هل فكرت في الحصول على موقع جهازك دون استخدام أي جهاز GPS ؟ مثير للاهتمام !! نعم ، من الممكن الحصول على إحداثيات الموقع فقط باستخدام لوحة NodeMCU ESP بدون أي أجهزة إضافية .

هنا سنستخدم لوحة ESP12E للحصول على إحداثيات حية لموقعنا . يصبح ذلك ممكنًا بسبب Google Geolocation API . لذلك دعونا نرى كيف تعمل واجهة برمجة تطبيقات الموقع الجغرافي وكيف يمكننا الحصول على الموقع باستخدام هذا .

متطلبات المشروع

  1. NodeMCU ESP board

طريقة العمل والتوصيل

ما هو Google Geolocation API و كيف يعمل ؟

كما نعلم جميعًا أن نظام التشغيل Android للهواتف الذكية مدعوم من Google .

بشكل عام توفر معظم الهواتف خدمة GPS و Wi-Fi في كل وقت ، لذا لا تقوم Google بتتبع موقعنا فحسب ، بل تتعقب أيضًا شبكات Wi-Fi القريبة . على سبيل المثال ، إذا كنت تتجول في الشارع مع تمكين Wi-Fi و GPS حتى يقوم هاتفك بمسح مستمر لشبكات Wi-Fi القريبة وما تفعله Google ، فإنه يحفظ عناوين MAC واسم شبكات Wi-Fi هذه جنبًا إلى جنب مع موقع الهاتف لدينا .

Google-Geolocation-API-Working

بناءً على نقاط قوة الإشارة التي يتلقاها الهاتف ، تقدر Google موقع شبكة Wi-Fi هذه وتحفظ تلك البيانات في قاعدة البيانات . لذلك ، في المرة القادمة ، إذا مر أي شخص عبر شبكات Wi-Fi نفسها ولم يتم تمكين GPS في هاتفه ، فإنه لا يزال بإمكانه الحصول على موقع الهاتف استنادًا إلى موقع شبكة Wi-Fi هذه .

Google-Detecting-Geolocation-using-Smartphone

لذلك سيكون عدد شبكات Wi-Fi القريبة الأكثر دقة هو الموقع . هذه هي الطريقة التي يعمل بها تحديد الموقع الجغرافي بواسطة Google .

الآن ، سوف نستخدم سحر واجهة برمجة تطبيقات تحديد الموقع الجغرافي في لوحة NodeMCU ESP12E ومحاولة الحصول على إحداثيات الموقع . سنستخدم هنا المنفذ التسلسلي من Arduino IDE لرؤية الإحداثيات . بدلاً من ذلك ، يمكنك ربط شاشة OLED مع ESP12-e لعرض البيانات .

الحصول على مفتاح API من Google لتحديد الموقع الجغرافي

لاستخدام خدمة تحديد الموقع الجغرافي من Google ، نحتاج إلى حساب Google ومفتاح API. اتبع الخطوات التالية للحصول على مفتاح API .

الخطوة 1: – انتقل إلى صفحة حساب Google ، وقم بتسجيل الدخول باستخدام حساب Google الخاص بك وانقر فوق مفتاح Get API ، ثم انقر فوق “ابدأ” كما بالصورة أدناه .

Getting-API-key-from-Google-Geolocation

الخطوة 2: – من خلال النقر على “البدء” ، سيتم فتح نافذة جديدة كما هو موضح أدناه .

انقر فوق الخيار Maps and Places for Pick Product ثم انقر فوق “continue“.

Enable-Google-Maps-Platform

الخطوة 3: – أعط اسمًا لمشروعك ، ثم انقر فوق “التالي” .

Setup-New-Project-on-Google-Cloud

الخطوة 4: – الخطوة التالية هي إعداد الفواتير . يجب عليك حفظ تفاصيل بطاقتك المصرفية . على الرغم من أن هذه الخدمة مجانية لمدة عام ، إلا أنها للتأكد من أنك لست روبوتًا . بعد عام ، لن يتم خصم المبلغ من حسابك دون إذنك. لذلك ، فقط املأ التفاصيل والمضي قدما وانقر على التالي .

 

الخطوة 5: – بعد ذلك سوف تحصل على مفتاح API الخاص بك. انسخ هذا المفتاح واحفظ هذا المفتاح على المفكرة. نحتاج هذا المفتاح في الكود الخاص بنا .

API-key-from-Google-Geolocation

نتــــــائج المشروع

قم بتحميل الكود الكامل المعطى أدناه على اللوحة وافتح الشاشة التسلسلية .

سترى إحداثيات ودقة موقعك كما هو موضح أدناه.

Getting-Location-with-NodeMCU-without-using-GPS-module

الآن ، افتح خرائط Google في هاتفك الذكي وأدخل خطوط الطول والعرض مفصولة بفاصلة (،) . سترى موقعك على الخريطة كما هو موضح .

Tracking-Location-with-NodeMCU

لذلك فقد رأينا مدى سهولة الحصول على الموقع الحالي لأي أجهزة فقط عن طريق استخدام ESP12 متعدد الاستخدامات دون الحاجة إلى أي وحدة GPS .

تنبيه : في حال لم تكن متأكد من قدرتك على تنفيذ خطوات المشروع يرجى استشارة شخص متخصص في هذا المجال.

الكـــــــــود البرمجي

لتحميل الكود البرمجي اضغط هنا
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include "ESP8266WiFi.h"

char ssid[] = "********";         // your network SSID name
char pass[] = "********";          // your network password

//Credentials for Google GeoLocation API...

const char* Host = "www.googleapis.com";
String thisPage = "/geolocation/v1/geolocate?key=";
String key = "your api key";

int status = WL_IDLE_STATUS;
String jsonString = "{\n";

double latitude    = 0.0;
double longitude   = 0.0;
double accuracy    = 0.0;
int more_text = 1;    // set to 1 for more debug output

void setup()   {
  Serial.begin(9600);
  Serial.println("Start");
 
 // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println("Setup done");
  
// We start by connecting to a WiFi network
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(".");

}

void loop() {

  char bssid[6];
  DynamicJsonBuffer jsonBuffer;
  Serial.println("scan start");
  
// WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0)
    Serial.println("no networks found");
  else
  {
    Serial.print(n);
    Serial.println(" networks found...");

    if (more_text) {
      Serial.println("\"wifiAccessPoints\": [");
      for (int i = 0; i < n; ++i)
      {
        Serial.println("{");
        Serial.print("\"macAddress\" : \"");
        Serial.print(WiFi.BSSIDstr(i));
        Serial.println("\",");
        Serial.print("\"signalStrength\": ");
        Serial.println(WiFi.RSSI(i));
        if (i < n - 1)
        {
          Serial.println("},");
        }
        else
        {
          Serial.println("}");
        }
      }
      Serial.println("]");
      Serial.println("}");
    }
    Serial.println(" ");
  }

// now build the jsonString...
  jsonString = "{\n";
  jsonString += "\"homeMobileCountryCode\": 234,\n"; // this is a real UK MCC
  jsonString += "\"homeMobileNetworkCode\": 27,\n";  // and a real UK MNC
  jsonString += "\"radioType\": \"gsm\",\n";         // for gsm
  jsonString += "\"carrier\": \"Vodafone\",\n";      // associated with Vodafone
  jsonString += "\"wifiAccessPoints\": [\n";
  for (int j = 0; j < n; ++j)
  {
    jsonString += "{\n";
    jsonString += "\"macAddress\" : \"";
    jsonString += (WiFi.BSSIDstr(j));
    jsonString += "\",\n";
    jsonString += "\"signalStrength\": ";
    jsonString += WiFi.RSSI(j);
    jsonString += "\n";
    if (j < n - 1)
    {
      jsonString += "},\n";
    }
    else
    {
      jsonString += "}\n";
    }
  }
  jsonString += ("]\n");
  jsonString += ("}\n");

  //-------------------------------------------------------------------- Serial.println("");

  //Connect to the client and make the api call

  WiFiClientSecure client;
  Serial.print("Requesting URL: ");
  Serial.println("https://" + (String)Host + thisPage + key);
  Serial.println(" ");
  if (client.connect(Host, 443)) {
    Serial.println("Connected");
    client.println("POST " + thisPage + key + " HTTP/1.1");
    client.println("Host: " + (String)Host);
    client.println("Connection: close");
    client.println("Content-Type: application/json");
    client.println("User-Agent: Arduino/1.0");
    client.print("Content-Length: ");
    client.println(jsonString.length());
    client.println();
    client.print(jsonString);
    delay(500);
  }

  //Read and parse all the lines of the reply from server
  while (client.available()) {
    String line = client.readStringUntil('\r');
    if (more_text) {
      Serial.print(line);
    }
    JsonObject& root = jsonBuffer.parseObject(line);
    if (root.success()) {
      latitude    = root["location"]["lat"];
      longitude   = root["location"]["lng"];
      accuracy   = root["accuracy"];
    }
  }

  Serial.println("closing connection");
  Serial.println();
  client.stop();

  Serial.print("Latitude = ");
  Serial.println(latitude, 6);
  Serial.print("Longitude = ");
  Serial.println(longitude, 6);
  Serial.print("Accuracy = ");
  Serial.println(accuracy);
}

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *