INHOUDSOPGAWE:
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-13 06:56
Hierdie Smart Buoy-reeks gee 'n uiteensetting van ons (ambisieuse) poging om 'n wetenskaplike boei te bou wat betekenisvolle metings oor die see kan neem met behulp van produkte van die rak af. Dit is handleiding twee van vier - maak seker dat u op datum is, en kyk na ons opsomming as u 'n vinnige inleiding tot die projek nodig het.
Deel 1: Maak golf- en temperatuurmetings
In hierdie handleiding wys ons hoe u GPS -data kan kry, dit op 'n SD -kaart kan stoor en dit êrens heen kan stuur met behulp van radio.
Ons het dit gedoen sodat ons die ligging van ons boei op die see kon dophou. Die radio beteken dat ons dit op afstand kan kyk, en die SD -kaart beteken dat as ons iets afbreek en dit kan dwaal, ons die data kan aflaai wat tydens die onbeplande uitstappie ingesamel is - as ons dit ooit kan opspoor!
Voorrade
GPS -module - Amazon
SD -kaartmodule - Amazon
SD -kaart - Amazon
2 X radiomodules (NRF24L01+) - Amazon
2 X Arduino - Amazon
Stap 1: Kry GPS -data
Die slim boei maak sensormetings terwyl dit in die see sit, insluitend GPS -ligging en datietyd. Kyk na die skema wat wys hoe ons die stroombaan opgestel het. Die GPS -module kommunikeer via seriële verbinding, dus gebruik ons die seriële biblioteek van die Arduino -sagteware sowel as die klein GPS -biblioteek om daarmee te kommunikeer. Hierdie biblioteke maak alles super eenvoudig. Kom ons neem u deur die kode …
#insluit
#include // Die TinyGPS ++ - voorwerp TinyGPSPlus gps; // Die reeksverbinding met die GPS -toestel SoftwareSerial ss (4, 3); struct dataStruct {dubbele breedtegraad; dubbele lengte; ongetekende lang datum; ongetekende lang tyd; } gpsData; ongeldige opstelling () {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 (); } anders {Serial.println ("Ongeldige ligging"); } as (gps.date.isValid ()) {gpsData.date = gps.date.value (); } anders {Serial.println ("Ongeldige datum"); } as (gps.time.isValid ()) {gpsData.time = gps.time.value (); } anders {Serial.println ("Ongeldige tyd"); }} void printResults () {Serial.print ("Location:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Datum:"); Serial.print (gpsData.date); Serial.print ("Tyd:"); Serial.print (gpsData.time); Serial.println (); }
(Kyk na die video vir hierdie kode op
Stap 2: Stuur GPS -data via radio
Gestel die boei is in die see en neem afmetings, maar ons wil die data sien sonder om ons voete nat te maak of die boei aan wal te bring. Om die metings op afstand te kry, gebruik ons 'n radiomodule wat aan 'n Arduino aan beide kante van die kommunikasie gekoppel is. In die toekoms sal ons die Arduino aan die ontvangerkant vervang deur 'n framboospi. Die radio werk op dieselfde manier met albei hierdie koppelvlakke, so dit is redelik eenvoudig om oor te skakel.
Die radiomodule kommunikeer met behulp van SPI, wat 'n paar meer verbindings benodig as I2C, maar steeds baie maklik is om te gebruik as gevolg van die NRF24 -biblioteek. Deur die GPS -module vir die sensormetings te gebruik, stuur ons die data van die een Arduino na die ander. Ons gaan die GPS- en radiomodule aan die Arduino koppel en aan die ander kant 'n Arduino met die radiomodule - kyk na die skema.
Sender
#insluit
#include #include #include #include TinyGPSPlus gps; SoftwareSerial ss (4, 3); RF24 radio (8, 7); // CE, CSN struct dataStruct {double latitude; dubbele lengte; ongetekende lang datum; ongetekende lang tyd; } gpsData; ongeldige opstelling () {Serial.begin (115200); ss.begin (9600); Serial.println ("Radio opstel"); // Stel senderradioradio op. Begin (); radio.openWritingPipe (0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.stopListening (); radio.enableDynamicPayloads (); radio.powerUp (); Serial.println ("Begin stuur"); } 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 (); } anders {gpsData.longitude = 0.0; gpsData.latitude = 0.0; } as (gps.date.isValid ()) {gpsData.date = gps.date.value (); } anders {gpsData.date = 0; } as (gps.time.isValid ()) {gpsData.time = gps.time.value (); } anders {gpsData.time = 0; }}
ONTVANGER
#insluit
#include #include RF24 radio (8, 7); // CE, CSN struct dataStruct {double latitude; dubbele lengte; ongetekende lang datum; ongetekende lang tyd; } gpsData; ongeldige opstelling () {Serial.begin (115200); // Stel ontvangerradioradio op. Begin (); radio.openReadingPipe (1, 0xF0F0F0F0E1LL); radio.setChannel (0x76); radio.setPALevel (RF24_PA_MAX); radio.setDataRate (RF24_250KBPS); radio.startListening (); radio.enableDynamicPayloads (); radio.powerUp (); } void lus () {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 ("Datum:"); Serial.print (gpsData.date); Serial.print ("Tyd:"); Serial.print (gpsData.time); Serial.println ();}}
(Kyk na die video vir hierdie kode op
Stap 3: Stoor data met behulp van 'n SD -kaartmodule
Die radiomodule is redelik betroubaar, maar soms benodig u 'n gebeurlikheidsplan as daar 'n kragonderbreking aan die ontvangerkant is of as die radio buite bereik beweeg. Ons gebeurlikheidsplan is 'n SD -kaartmodule waarmee ons die data wat ons versamel, kan stoor. Die hoeveelheid data wat ingesamel word, is nie so groot nie, dus selfs 'n klein SD -kaart kan maklik 'n dag se data stoor.
#insluit
#include #include #include TinyGPSPlus gps; SoftwareSerial ss (4, 3); struct dataStruct {dubbele breedtegraad; dubbele lengte; ongetekende lang datum; ongetekende lang tyd; } gpsData; ongeldige opstelling () {Serial.begin (115200); ss.begin (9600); as (! SD.begin (5)) {Serial.println ("Kaart misluk, of nie voorkom nie"); terugkeer; } Serial.println ("kaart geïnisialiseer."); Lêer dataFile = SD.open ("gps_data.csv", FILE_WRITE); if (dataFile) {dataFile.println ("Latitude, Longitude, Date, Time"); dataFile.close (); } anders {Serial.println ("nope kan nie lêer oopmaak nie"); }} 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 (); } anders {Serial.println ("Ongeldige ligging"); } as (gps.date.isValid ()) {gpsData.date = gps.date.value (); } anders {Serial.println ("Ongeldige datum"); } as (gps.time.isValid ()) {gpsData.time = gps.time.value (); } anders {Serial.println ("Ongeldige tyd"); }} void printResults () {Serial.print ("Location:"); Serial.print (gpsData.latitude, 6); Serial.print (","); Serial.print (gpsData.longitude, 6); Serial.print ("Datum:"); Serial.print (gpsData.date); Serial.print ("Tyd:"); Serial.print (gpsData.time); Serial.println (); } void saveInfo () {File dataFile = SD.open ("gps_data.csv", FILE_WRITE); as (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 (); } anders {Serial.println ("nee, geen datafile"); }}
(Ons praat deur hierdie kode in die video
Stap 4: Stuur en stoor GPS -data
Stap 5: Dankie
Teken in op ons poslys!
Deel 1: Meting van golwe en temperatuur
Deel 2: GPS NRF24 -radio en SD -kaart
Deel 3: Skeduleringskrag na die boei
Deel 4: Die implementering van die boei