Skocz do zawartości

Projekt arduino GPS


nowix1999

Pomocna odpowiedź

Witam, tworzę aplikację webową, na którą przesyłane będą współrzędne pozyskane z modułu GPS vk2828u7g5lf podłączonego do arduino model: WiFi Shield Arduino ESP8266 WEMOS D1 UNO R3. Tworzę program w arduino IDE lecz mam problem z wgraniem go na płytkę. Stworzyłem przykładowy program, który ma sprawdzić czy wszystko działa i podczas wgrywania wyskakuje taki błąd: A fatal esptool.py error occurred: Failed to connect to ESP8266: Timed out waiting for packet header. Board, który mam wybrany to NodeMCU 1.0 ESP 12-E. Na zdjęciu kod programu. Czy ktoś mógłby pomóc to ogarnąć? Pozdrawiam.

arduino kod.png

Link do komentarza
Share on other sites

1 godzinę temu, nowix1999 napisał:

o arduino model: WiFi Shield Arduino ESP8266 WEMOS D1 UNO R3

@nowix1999 witam na forum 🙂 Z nazwy wnioskuję, że to jest sam shield, który powinien być podłączony do jakiegoś Arduino. 

 

1 godzinę temu, nowix1999 napisał:

Board, który mam wybrany to NodeMCU 1.0 ESP 12-E

Czy z takiej płytki faktycznie korzystasz?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

https://starter-kit.nettigo.pl/2016/03/razu-gps-logger-zbudowano-czyli-arduino-gps/ 
Skorzystałem z tego poradnika, podłączyłem jak na schemacie, przesłałem ten przykładowy program i nadal nic się nie pojawia w konsoli. Na module świeci się zielona dioda co znaczy że odbiera on współrzędne.

 

Edytowano przez nowix1999
Link do komentarza
Share on other sites

Usuń tego if ze sprawdzaniem GPS_INVALID_AGE i na początek po prostu wysyłaj co sekundę odczytany lat i lon. Na komplikowanie logiki będziesz miał czas, jak ogarniesz podstawowe rzeczy.

Szczerze mówiąc, pierwszy raz widzę GPS_INVALID _AGE...

Link do komentarza
Share on other sites

E... zaraz... popatrzyłem na zdjęcie kodu (wciórności, nienawidzę jak ktoś nie potrafi używać ctrl-c/ctrl-v). Masz podpięte coś do pinów 10 i 11? Jeśli to ESP8266 to nie ma prawa działać.

Do poczytania: https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/

A w ogóle to SoftwareSerial raczej cienko działa na ESP... chyba że ostatnio coś poprawili?

Link do komentarza
Share on other sites

Softseriala używa się, jak się ma za mało problemów 🙂

Przecież 8266 ma dwa sprzętowe UARTy (no dobra, półtora) do użycia.

I tak w większości przypadków z gps tylko czyta się dane a na konsolę tylko wysyła. Więc jeden sprzętowy UART w zupełności wystarczy do jednego i drugiego.

Link do komentarza
Share on other sites

A w ogóle przy dwóch uartach nie bawiłbym się w protezy typu SoftwareSerial tylko wrzuciłbym tam ESP32 - pięć złotych droższy ale ma wszystko co trzeba. Poza tym nawet gdyby ten SoftwareSerial działał na 8266 nie byłbym pewien co się stanie po włączeniu WiFi. 

Link do komentarza
Share on other sites

Udało się odczytać współrzędne takim kodem. Kolejnym krokiem jest przesłanie tych danych do aplikacji webowej odpalonej na localhoscie odpalonym w xampp. Czy takie coś jest możliwe? Z wifi połączenie uzyskuję ale z serwerem już nie, na razie próbuję z takim kodem. W kodzie aplikacji webowej zastosowałem taki js. Z góry dziękuję za pomoc.

var socket = new WebSocket("ws://localhost:80");

// Obsługa otwarcia połączenia WebSocket
socket.onopen = function () {
    console.log("Połączenie WebSocket zostało nawiązane.");
};

// Obsługa zamknięcia połączenia WebSocket
socket.onclose = function () {
    console.log("Połączenie WebSocket zostało zamknięte.");
};

// Obsługa otrzymania wiadomości od serwera WebSocket
socket.onmessage = function (event) {
    var data = JSON.parse(event.data);
    if (data.latitude && data.longitude) {
        displayCoordinates(data.latitude, data.longitude);
    }
};

// Wyświetlanie przesyłanych współrzędnych
function displayCoordinates(latitude, longitude) {
    var latitudeElement = document.getElementById("latitude");
    var longitudeElement = document.getElementById("longitude");

    latitudeElement.textContent = "Szerokość: " + latitude;
    longitudeElement.textContent = "Długość: " + longitude;
}
#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;                    // Obiekt TinyGPS do obsługi danych GPS
SoftwareSerial ss(4, 3);        // Obiekt SoftwareSerial do komunikacji z modułem GPS

void setup()
{
  Serial.begin(115200);         // Inicjalizacja komunikacji szeregowej
  ss.begin(9600);               // Inicjalizacja komunikacji szeregowej z modułem GPS
}

void loop()
{
  float flat, flon;             // Zmienne do przechowywania szerokości i długości geograficznej
  unsigned long age;
  
  gps.f_get_position(&flat, &flon, &age);    // Pobranie aktualnej pozycji geograficznej
  Serial.print("Szerokość: ");
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);    // Wyświetlenie szerokości geograficznej
  Serial.print("Długość: ");
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);    // Wyświetlenie długości geograficznej
  print_date(gps);             // Wyświetlenie daty i czasu
  
  Serial.println();
  
  smartdelay(1000);             // Oczekiwanie przez określony czas
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());    // Odczyt i dekodowanie danych GPS
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    while (len-- > 1)
      Serial.print('*');        // Jeśli wartość jest nieprawidłowa, wyświetlaj gwiazdkę
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);    // Wyświetlanie wartości z określoną precyzją
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); 
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');        // Dopasowanie do określonej długości pola
  }
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);    // Dekodowanie daty i czasu
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");    // Jeśli data jest nieprawidłowa, wyświetlaj gwiazdki
  else
  {
    char sz[32];
    sprintf(sz,"%02d/%02d/%02d %02d:%02d:%02d ",
            month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  smartdelay(0);
}
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

TinyGPS gps;
SoftwareSerial ss(4, 3);

const char* ssid = "a";
const char* password = "b";
const char* serverAddress = "localhost";
const int serverPort = 80;

void setup()
{
  Serial.begin(115200);
  ss.begin(9600);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

}

void loop()
{
  float flat, flon;
  unsigned long age;
  
  gps.f_get_position(&flat, &flon, &age);

  // Przesyłanie danych do aplikacji webowej
  sendCoordinates(flat, flon);

  Serial.print("Szerokość: ");
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  Serial.print("Długość: ");
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_date(gps);

  Serial.println();

  smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); 
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i = flen; i < len; ++i)
      Serial.print(' ');
  }
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
            month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  smartdelay(0);
}

void sendCoordinates(float latitude, float longitude)
{
  if (WiFi.status() == WL_CONNECTED)
  {
    WiFiClient client;
    
    if (client.connect(serverAddress, serverPort))
    {
      String request = String("GET /?lat=") + latitude + String("&lon=") + longitude + String(" HTTP/1.1\r\n") +
                       String("Host: ") + serverAddress + String("\r\n") +
                       String("Connection: close\r\n\r\n");
                       
      client.print(request);
      
      Serial.println("Sending coordinates to server:");
      Serial.print(request);
      
      // Odczytaj odpowiedź serwera, jeśli jest dostępna
      while (client.connected() && !client.available()) {}
      
      while (client.available())
      {
        String response = client.readStringUntil('\r');
        Serial.print("Server response: ");
        Serial.println(response);
      }
      
      client.stop();
    }
    else
    {
      Serial.println("Error connecting to server");
    }
  }
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.