Cách theo dõi Vị trí bằng NodeMCU mà không cần sử dụng mô-đun GPS

Cách theo dõi Vị trí bằng NodeMCU mà không cần sử dụng mô-đun GPS

Bạn đã bao giờ nghĩ đến việc có thể theo dõi vị trí của thiết bị mà không cần sử dụng bất kỳ phần cứng GPS nào chưa? Nghe có vẻ thú vị!! Có, có thể lấy tọa độ vị trí chỉ bằng cách sử dụng board NodeMCU ESP mà không cần thêm phần cứng nào. Ở đây chúng tôi sẽ sử dụng board ESP12E để có được tọa độ trực tiếp của vị trí của chúng tôi . Điều này trở nên khả thi vì có API vị trí địa lý của Google . Vì vậy, hãy xem API vị trí địa lý này hoạt động như thế nào và làm thế nào chúng ta có thể có được vị trí bằng cách sử dụng này.

API định vị địa lý của Google hoạt động như thế nào?

Như chúng ta đều biết rằng hệ điều hành Android cho điện thoại thông minh được cung cấp bởi Google. Nói chung, hầu hết các điện thoại đều bật GPS và Wi-Fi mọi lúc, vì vậy Google không chỉ theo dõi vị trí của chúng ta mà còn theo dõi các mạng Wi-Fi gần đó. Ví dụ: nếu bạn đang đi bộ trên đường có bật Wi-Fi và GPS để điện thoại của bạn liên tục quét các mạng Wi-Fi gần đó và những gì Google làm là nó sẽ lưu địa chỉ MAC và tên của các mạng Wi-Fi này cùng với vị trí của điện thoại của chúng ta.

Vì vậy, dựa trên cường độ tín hiệu mà điện thoại nhận được, Google ước tính vị trí của mạng Wi-Fi cụ thể đó và nó lưu dữ liệu đó vào cơ sở dữ liệu. Do đó, lần tới nếu có ai đi qua nới có cùng mạng Wi-Fi đó và không bật GPS trong điện thoại của anh ta, anh ta vẫn có thể nhận được vị trí của điện thoại dựa trên vị trí của mạng Wi-Fi cụ thể đó.

Vì vậy, số lượng mạng Wi-Fi gần đó chính xác hơn sẽ là vị trí. Đây là cách Định vị địa lý của Google.

Bây giờ, chúng tôi sẽ sử dụng định vị API này trong board NodeMCU ESP12E và cố gắng lấy tọa độ vị trí. Ở đây chúng ta sẽ sử dụng màn hình nối tiếp của Arduino IDE để xem các tọa độ. Ngoài ra, bạn có thể giao diện màn hình OLED với ESP12-e để hiển thị dữ liệu.

Lấy key API từ Google Geolocation

Để sử dụng dịch vụ Định vị địa lý của Google, chúng ta cần có tài khoản Google và key API. Thực hiện theo các bước bên dưới để lấy key API.

Bước 1: – Truy cập trang nhà phát triển Google , đăng nhập bằng tài khoản Google của bạn và nhấp vào Get API key và sau đó nhấp vào Get started.

Bước 2: – Bằng cách nhấp vào Get started, một cửa sổ mới sẽ được mở như hình bên dưới.

Nhấp vào tùy chọn Maps Places để chọn Sản phẩm, sau đó nhấp Continue.

Bước 3: – Đặt tên cho dự án của bạn sau đó nhấp vào Next.

Bước 4: – Bước tiếp theo là Set up billing. Bạn phải lưu chi tiết thẻ ngân hàng của bạn. Mặc dù dịch vụ này miễn phí trong một năm, nhưng điều này chỉ để kiểm tra xem bạn không phải là robot. Sau một năm, nó sẽ không khấu trừ số tiền từ tài khoản của bạn mà không có sự cho phép của bạn. Vì vậy, chỉ cần điền các chi tiết và bấm vào next.

Bước 5: – Sau đó, bạn sẽ nhận được key API của mình. Sao chép key này và lưu key này vào notepad. Chúng tôi cần key này trong code của chúng tôi.

Bây giờ, bạn đã sẵn sàng để tiến hành code dự án.

Lập trình NodeMCU để lấy dữ liệu GPS

Ở đây chúng tôi sẽ sử dụng Arduino IDE để lập trình ESP12. Vì vậy, hãy chắc chắn rằng bạn đã tải xuống các tập tin board ESP8266.

Code hoàn chỉnh với Video demo được đưa ra ở cuối dự án.

Đối với phần code, chúng ta cần ba thư viện ESP8266HTTPClient, ArduinoJson, ESP8266WiFi.

Sau đó, khởi tạo các biến nhập tên Wi-Fi, mật khẩu Wi-Fi, key API và khởi tạo các biến khác được sử dụng trong code.

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

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

String key = "your api key";

…

..




double latitude    = 0.0;

double longitude   = 0.0;

double accuracy    = 0.0;

Trong hàm setup , đặt Wi-Fi thành chế độ trạm và ngắt kết nối với AP nếu được kết nối trước đó.

void setup()   {

  Serial.begin(9600);

  Serial.println("Start");

  WiFi.mode(WIFI_STA);

  WiFi.disconnect();

  delay(100);

  Serial.println("Setup done");

…

..

Trong hàm loop , chúng tôi sẽ quét tất cả các mạng Wi-Fi gần đó và trích địa chỉ MAC và cường độ của các mạng này. Sau đó, chúng tôi tạo chuỗi json từ thông tin được trích và gửi nó lên đám mây của Google và đổi lại, chúng tôi nhận được tọa độ  vị trí, tức là vĩ độ, kinh độ và độ chính xác. Độ chính xác sẽ phụ thuộc vào số lượng mạng Wi-fi có sẵn gần đó.

  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\": ");

.....

....

Tải lên toàn bộ code được đưa ra ở cuối bài và mở Serial monitor.

Bạn sẽ thấy tọa độ và độ chính xác của vị trí của bạn như được hiển thị bên dưới.

Bây giờ, hãy mở bản đồ Google trong điện thoại thông minh của bạn và nhập vĩ độ và kinh độ cách nhau bằng dấu phẩy (,). Bạn sẽ thấy vị trí của bạn trên bản đồ như được hiển thị.

Cuối cùng chúng ta đã thấy việc có được vị trí của bất kỳ thiết bị nào dễ dàng như thế nào chỉ bằng cách sử dụng ESP12 linh hoạt mà không cần bất kỳ mô-đun GPS nào.

CODE:

#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);
}

VIDEO demo:

 

 

 

 

 

 

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *