Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Denne Smart Buoy-serien viser vårt (ambisiøse) forsøk på å bygge en vitenskapelig bøye som kan ta meningsfulle målinger av havet ved hjelp av hylleprodukter. Dette er opplæring to av fire - sørg for at du er oppdatert, og hvis du trenger en rask introduksjon til prosjektet, kan du se sammendraget vårt.
Del 1: Gjør bølge- og temperaturmålinger
I denne opplæringen viser vi deg hvordan du får GPS -data, lagrer dem på et SD -kort og sender dem et sted ved hjelp av radio.
Vi gjorde dette slik at vi kunne holde oversikt over plasseringen av vår sjøbøye. Radioen betyr at vi kan se det eksternt, og SD -kortet betyr at når noe går i stykker og det går på en vandring, kan vi laste ned dataene det samlet inn under den uplanlagte utflukten - hvis vi noen gang er i stand til å hente dem!
Rekvisita
GPS -modul - Amazon
SD -kortmodul - Amazon
SD -kort - Amazon
2 X radiomoduler (NRF24L01+) - Amazon
2 X Arduino - Amazon
Trinn 1: Få GPS -data
Den smarte bøyen gjør sensormålinger mens den sitter i sjøen, inkludert GPS -posisjon og datotid. Ta en titt på skjematikken som viser hvordan vi konfigurerer kretsen. GPS -modulen kommuniserer via seriell tilkobling, så vi bruker det serielle biblioteket til Arduino -programvaren samt det lille GPS -biblioteket for å kommunisere med det. Disse bibliotekene gjør alt superenkelt. La oss ta deg gjennom koden …
#inkludere
#include // TinyGPS ++ - objektet TinyGPSPlus gps; // Den serielle tilkoblingen til GPS -enheten SoftwareSerial ss (4, 3); struct dataStruct {dobbel breddegrad; dobbel lengdegrad; usignert lang dato; usignert lang tid; } gpsData; ugyldig oppsett () {Serial.begin (115200); ss.begin (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 (); } annet {Serial.println ("Ugyldig plassering"); } hvis (gps.date.isValid ()) {gpsData.date = gps.date.value (); } annet {Serial.println ("Ugyldig dato"); } hvis (gps.time.isValid ()) {gpsData.time = gps.time.value (); } annet {Serial.println ("Ugyldig tid"); }} void printResults () {Serial.print ("Location:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Dato:"); Serial.print (gpsData.date); Serial.print ("Tid:"); Serial.print (gpsData.time); Serial.println (); }
(Sjekk videoen for denne koden på
Trinn 2: Sende GPS -data via radio
Anta at bøyen er i sjøen og tar målinger, men vi vil se dataene uten å bli våte på føttene eller ta bøyen i land. For å få målingene eksternt bruker vi en radiomodul koblet til en Arduino på begge sider av kommunikasjonen. I fremtiden vil vi erstatte mottaker-siden Arduino med en bringebær pi. Radioen fungerer på samme måte med begge disse grensesnittene, så det er ganske enkelt å bytte dem over.
Radiomodulen kommuniserer med SPI, som krever noen flere tilkoblinger enn I2C, men som fremdeles er veldig enkel å bruke på grunn av NRF24 -biblioteket. Ved å bruke GPS -modulen for sensormålingene, overfører vi dataene fra den ene Arduino til den andre. Vi skal koble GPS- og radiomodulen til Arduino og på den andre siden en Arduino med radiomodulen - se på skjematikken.
Sender
#inkludere
#include #include #include #include TinyGPSPlus gps; SoftwareSerial ss (4, 3); RF24 radio (8, 7); // CE, CSN struct dataStruct {dobbel breddegrad; dobbel lengdegrad; usignert lang dato; usignert lang tid; } gpsData; ugyldig oppsett () {Serial.begin (115200); ss.begin (9600); Serial.println ("Sette opp radio"); // Oppsett sender radio radio.begin (); radio.openWritingPipe (0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.stopListening (); radio.enableDynamicPayloads (); radio.powerUp (); Serial.println ("Begynner å sende"); } 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 (); } annet {gpsData.longitude = 0.0; gpsData.latitude = 0,0; } hvis (gps.date.isValid ()) {gpsData.date = gps.date.value (); } annet {gpsData.date = 0; } hvis (gps.time.isValid ()) {gpsData.time = gps.time.value (); } annet {gpsData.time = 0; }}
MOTTAKER
#inkludere
#include #include RF24 radio (8, 7); // CE, CSN struct dataStruct {dobbel breddegrad; dobbel lengdegrad; usignert lang dato; usignert lang tid; } gpsData; ugyldig oppsett () {Serial.begin (115200); // Oppsett mottaker radioradio.begin (); radio.openReadingPipe (1, 0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.startListening (); radio.enableDynamicPayloads (); radio.powerUp (); } void loop () {if (radio.available ()) {radio.read (& gpsData, sizeof (gpsData)); Serial.print ("Location:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Dato:"); Serial.print (gpsData.date); Serial.print ("Tid:"); Serial.print (gpsData.time); Serial.println ();}}
(Sjekk videoen for denne koden på
Trinn 3: Lagre data ved hjelp av en SD -kortmodul
Radiomodulen er ganske pålitelig, men noen ganger trenger du en beredskapsplan i tilfelle det er strømbrudd på mottakersiden eller hvis radioen beveger seg utenfor rekkevidde. Beredskapsplanen vår er en SD -kortmodul som lar oss lagre dataene vi samler inn. Mengden data som samles inn er ikke så stor, så selv et lite SD -kort vil enkelt kunne lagre data for en dag.
#inkludere
#include #include #include TinyGPSPlus gps; SoftwareSerial ss (4, 3); struct dataStruct {dobbel breddegrad; dobbel lengdegrad; usignert lang dato; usignert lang tid; } gpsData; ugyldig oppsett () {Serial.begin (115200); ss.begin (9600); hvis (! SD.begin (5)) {Serial.println ("Kort mislyktes, eller ikke til stede"); komme tilbake; } Serial.println ("kort initialisert."); File dataFile = SD.open ("gps_data.csv", FILE_WRITE); if (dataFile) {dataFile.println ("Latitude, Longitude, Date, Time"); dataFile.close (); } annet {Serial.println ("nei kan ikke åpne filen"); }} void loop () {while (ss.available ()> 0) {if (gps.encode (ss.read ())) {getInfo (); printResults (); saveInfo (); }}} void getInfo () {if (gps.location.isValid ()) {gpsData.latitude = gps.location.lat (); gpsData.longitude = gps.location.lng (); } annet {Serial.println ("Ugyldig plassering"); } hvis (gps.date.isValid ()) {gpsData.date = gps.date.value (); } annet {Serial.println ("Ugyldig dato"); } hvis (gps.time.isValid ()) {gpsData.time = gps.time.value (); } annet {Serial.println ("Ugyldig tid"); }} void printResults () {Serial.print ("Location:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Dato:"); Serial.print (gpsData.date); Serial.print ("Tid:"); Serial.print (gpsData.time); Serial.println (); } void saveInfo () {File dataFile = SD.open ("gps_data.csv", FILE_WRITE); hvis (dataFile) {dataFile.print (gpsData.latitude); dataFile.print (","); dataFile.print (gpsData.longitude); dataFile.print (","); dataFile.print (gpsData.date); dataFile.print (","); dataFile.println (gpsData.time); dataFile.close (); } annet {Serial.println ("nei, ingen datafil"); }}
(Vi snakker gjennom denne koden i videoen
Trinn 4: Sende og lagre GPS -data
Trinn 5: Takk
Registrer deg på vår adresseliste!
Del 1: Måling av bølger og temperaturer
Del 2: GPS NRF24 Radio og SD -kort
Del 3: Planlegge kraft til bøyen
Del 4: Distribusjon av bøyen