Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Ta seria Smart Buoy przedstawia naszą (ambitną) próbę zbudowania naukowej boi, która może dokonywać znaczących pomiarów morza przy użyciu gotowych produktów. To jest samouczek drugi z czterech – upewnij się, że jesteś na bieżąco, a jeśli potrzebujesz szybkiego wprowadzenia do projektu, zapoznaj się z naszym podsumowaniem.
Część 1: Wykonywanie pomiarów fal i temperatury
W tym samouczku pokażemy, jak uzyskać dane GPS, zapisać je na karcie SD i wysłać gdzieś za pomocą radia.
Zrobiliśmy to, abyśmy mogli śledzić położenie naszej morskiej boi. Radio oznacza, że możemy oglądać go zdalnie, a karta SD oznacza, że jeśli coś się zepsuje i pójdzie na wędrówkę, możemy pobrać dane zebrane podczas nieplanowanej wycieczki - jeśli kiedykolwiek uda nam się je odzyskać!
Kieszonkowe dzieci
Moduł GPS - Amazon
Moduł karty SD - Amazon
Karta SD - Amazon
2 X moduły radiowe (NRF24L01+) - Amazon
2 X Arduino - Amazonka
Krok 1: Pobieranie danych GPS
Inteligentna boja wykonuje pomiary z czujnika, gdy znajduje się na morzu, w tym lokalizację GPS i datę. Spójrz na schemat, który pokazuje, jak ustawiliśmy obwód. Moduł GPS komunikuje się przez połączenie szeregowe, więc do komunikacji z nim wykorzystujemy bibliotekę szeregową oprogramowania Arduino, a także niewielką bibliotekę GPS. Te biblioteki sprawiają, że wszystko jest bardzo proste. Przejdźmy przez kod…
#włączać
#include // Obiekt TinyGPS++ TinyGPSPlus gps; // Połączenie szeregowe z urządzeniem GPS SoftwareSerial ss(4, 3); struct dataStruct{ podwójna szerokość geograficzna; podwójna długość geograficzna; niepodpisana długa data; niepodpisany długi czas; } dane gps; void setup(){ Serial.begin(115200); ss.początek(9600); } void loop(){ while (ss.available() > 0){ if (gps.encode(ss.read())){ getInfo(); printResults(); } } } void getInfo(){ if (gps.location.isValid()){ gpsData.latitude = gps.location.lat(); gpsData.longitude = gps.location.lng(); } else{ Serial.println("Nieprawidłowa lokalizacja"); } if (gps.date.isValid()){ gpsData.date = gps.date.value(); } else{ Serial.println("Nieprawidłowa data"); } if (gps.time.isValid()){ gpsData.time = gps.time.value(); } else{ Serial.println("Nieprawidłowy czas"); } } void printResults(){ Serial.print("Lokalizacja: "); Serial.print(gpsData.latitude, 6); Serial.print(", "); Serial.print(gpsData.longitude, 6); Serial.print(" Data: "); Serial.print(gpsData.data); Serial.print(" Czas: "); Serial.print(gpsData.time); Serial.println(); }
(Sprawdź wideo dla tego kodu na
Krok 2: Wysyłanie danych GPS przez radio
Załóżmy, że boja znajduje się w morzu i wykonuje pomiary, ale chcemy zobaczyć dane bez zamoczenia stóp lub wynoszenia boi na brzeg. Aby uzyskać pomiary zdalnie, używamy modułu radiowego podłączonego do Arduino po obu stronach komunikacji. W przyszłości Arduino po stronie odbiornika zastąpimy malinowym pi. Radio działa podobnie z obydwoma tymi interfejsami, więc ich zamiana jest dość prosta.
Moduł radiowy komunikuje się za pomocą SPI, co wymaga kilku połączeń więcej niż I2C, ale nadal jest bardzo łatwy w użyciu ze względu na bibliotekę NRF24. Wykorzystując moduł GPS do pomiarów czujnika, przekazujemy jego dane z jednego Arduino do drugiego. Podłączamy moduł GPS i radiowy do Arduino, a z drugiej strony Arduino z modułem radiowym - spójrz na schemat.
Nadajnik
#włączać
#include #include #include #include TinyGPSPlus gps; Oprogramowanie Serial ss(4, 3); radio RF24 (8, 7); // CE, CSN struct dataStruct{ double latitude; podwójna długość geograficzna; niepodpisana długa data; niepodpisany długi czas; } dane gps; void setup() { Serial.begin(115200); ss.początek(9600); Serial.println("Konfigurowanie radia"); // Skonfiguruj nadajnik radiowy radio.begin(); radio.openWritingPipe(0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel(RF24_PA_MAX); radio.setDataRate(RF24_250KBPS); radio.stopSłuchanie(); radio.enableDynamicPayloads(); radio.powerUp(); Serial.println("Rozpoczęcie wysyłania"); } void loop() { while (ss.available() > 0){ if (gps.encode(ss.read())){ getInfo(); radio.write(&gpsData, sizeof(gpsData)); } } } void getInfo(){ if (gps.location.isValid()){ gpsData.longitude = gps.location.lng(); gpsData.latitude = gps.location.lat(); } else{ gpsData.longitude = 0.0; gpsData.szerokość = 0.0; } if (gps.date.isValid()){ gpsData.date = gps.date.value(); } else{ gpsData.data = 0; } if (gps.time.isValid()){ gpsData.time = gps.time.value(); } else{ gpsData.time = 0; } }
ODBIORCA
#włączać
#include #include RF24 radio(8, 7); // CE, CSN struct dataStruct{ double latitude; podwójna długość geograficzna; niepodpisana długa data; niepodpisany długi czas; } dane gps; void setup() { Serial.begin(115200); // Konfiguracja odbiornika radiowego radio.begin(); radio.openReadingPipe(1, 0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel(RF24_PA_MAX); radio.setDataRate(RF24_250KBPS); radio.startNasłuch(); radio.enableDynamicPayloads(); radio.powerUp(); } void loop() { if (radio.available()) { radio.read(&gpsData, sizeof(gpsData)); Serial.print("Lokalizacja: "); Serial.print(gpsData.latitude, 6); Serial.print(", "); Serial.print(gpsData.longitude, 6); Serial.print(" Data: "); Serial.print(gpsData.data); Serial.print(" Czas: "); Serial.print(gpsData.time); Serial.println();} }
(Sprawdź wideo dla tego kodu na
Krok 3: Przechowywanie danych za pomocą modułu karty SD
Moduł radiowy jest dość niezawodny, ale czasami potrzebny jest plan awaryjny na wypadek awarii zasilania po stronie odbiornika lub gdy radio znajdzie się poza zasięgiem. Nasz plan awaryjny to moduł karty SD, który pozwala nam przechowywać gromadzone dane. Ilość zbieranych danych nie jest tak duża, więc nawet niewielka karta SD z łatwością będzie w stanie przechowywać dane z całego dnia.
#włączać
#include #include #include TinyGPSPlus gps; Oprogramowanie Serial ss(4, 3); struct dataStruct{ podwójna szerokość geograficzna; podwójna długość geograficzna; niepodpisana długa data; niepodpisany długi czas; } dane gps; void setup() { Serial.begin(115200); ss.początek(9600); if (!SD.begin(5)) { Serial.println("Karta nie powiodła się lub nie ma"); powrót; } Serial.println("karta zainicjowana."); Plik dataFile = SD.open("gps_data.csv", FILE_WRITE); if (dataFile) { dataFile.println("Szerokość, długość, data, godzina"); plik_danych.zamknij(); } else{ Serial.println("nie można otworzyć pliku"); } } void loop() { while (ss.available() > 0){ if (gps.encode(ss.read())){ getInfo(); printResults(); zapiszInfo(); } } } void getInfo(){ if (gps.location.isValid()){ gpsData.latitude = gps.location.lat(); gpsData.longitude = gps.location.lng(); } else{ Serial.println("Nieprawidłowa lokalizacja"); } if (gps.date.isValid()){ gpsData.date = gps.date.value(); } else{ Serial.println("Nieprawidłowa data"); } if (gps.time.isValid()){ gpsData.time = gps.time.value(); } else{ Serial.println("Nieprawidłowy czas"); } } void printResults(){ Serial.print("Lokalizacja: "); Serial.print(gpsData.latitude, 6); Serial.print(", "); Serial.print(gpsData.longitude, 6); Serial.print(" Data: "); Serial.print(gpsData.data); Serial.print(" Czas: "); Serial.print(gpsData.time); Serial.println(); } void saveInfo(){ Plik dataFile = SD.open("gps_data.csv", FILE_WRITE); if (dataFile) { dataFile.print(gpsData.latitude); dataFile.print(", "); dataFile.print(gpsData.longitude); dataFile.print(", "); dataFile.print(gpsData.data); dataFile.print(", "); dataFile.println(gpsData.time); plik_danych.zamknij(); } else{ Serial.println("nie ma pliku danych"); } }
(Rozmawiamy o tym kodzie w filmie
Krok 4: Wysyłanie i przechowywanie danych GPS
Krok 5: Dzięki
Zapisz się na naszą listę mailingową!
Część 1: Dokonywanie pomiaru fali i temperatury
Część 2: Radio GPS NRF24 i karta SD
Część 3: Planowanie zasilania boi
Część 4: Rozmieszczanie boi