Table des matières:
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Cette série de bouées intelligentes retrace notre tentative (ambitieuse) de construire une bouée scientifique capable de prendre des mesures significatives sur la mer à l'aide de produits du commerce. Il s'agit du didacticiel deux sur quatre - assurez-vous que vous êtes à jour, et si vous avez besoin d'une introduction rapide au projet, consultez notre résumé.
Partie 1: Réalisation de mesures de vagues et de températures
Dans ce tutoriel, nous vous montrons comment obtenir des données GPS, les stocker sur une carte SD et les envoyer quelque part à l'aide de la radio.
Nous l'avons fait pour que nous puissions garder une trace de l'emplacement de notre bouée maritime. La radio signifie que nous pouvons le regarder à distance et la carte SD signifie que si quelque chose se casse et qu'il va se promener, nous pouvons télécharger les données qu'il a collectées lors de son excursion imprévue - si jamais nous sommes en mesure de le récupérer !
Fournitures
Module GPS - Amazon
Module de carte SD - Amazon
Carte SD - Amazon
2 modules radio (NRF24L01+) - Amazon
2 X Arduino - Amazon
Étape 1: Obtenir des données GPS
La bouée intelligente effectue des mesures de capteur lorsqu'elle se trouve dans la mer, y compris la localisation GPS et la date et l'heure. Jetez un œil au schéma qui montre comment nous avons configuré le circuit. Le module GPS communique via une connexion série, nous utilisons donc la bibliothèque série du logiciel Arduino ainsi que la petite bibliothèque GPS pour communiquer avec lui. Ces bibliothèques rendent tout super simple. Passons en revue le code…
#comprendre
#include // L'objet TinyGPS++ TinyGPSPlus gps; // La connexion série au périphérique GPS SoftwareSerial ss(4, 3); struct dataStruct{ double latitude; double longitude; date longue non signée; non signé longtemps; }gpsData; void setup(){ Serial.begin(115200); ss.begin(9600); } void loop(){ while (ss.available() > 0){ if (gps.encode(ss.read())){ getInfo(); printRésultats(); } } } void getInfo(){ if (gps.location.isValid()){ gpsData.latitude = gps.location.lat(); gpsData.longitude = gps.location.lng(); } else{ Serial.println("Emplacement invalide"); } if (gps.date.isValid()){ gpsData.date = gps.date.value(); } else{ Serial.println("Date invalide"); } if (gps.time.isValid()){ gpsData.time = gps.time.value(); } else{ Serial.println("Heure invalide"); } } void printResults(){ Serial.print("Emplacement: "); Serial.print(gpsData.latitude, 6); Serial.print(", "); Serial.print(gpsData.longitude, 6); Serial.print(" Date: "); Serial.print(gpsData.date); Serial.print(" Heure: "); Serial.print(gpsData.time); Serial.println(); }
(Regardez la vidéo de ce code sur
Étape 2: Envoi de données GPS par radio
Supposons que la bouée soit en mer en train de prendre des mesures, mais que nous voulions voir les données sans nous mouiller les pieds ni ramener la bouée à terre. Pour obtenir les mesures à distance, nous utilisons un module radio connecté à un Arduino des deux côtés de la communication. À l'avenir, nous remplacerons l'Arduino côté récepteur par un Raspberry Pi. La radio fonctionne de la même manière avec ces deux interfaces, il est donc assez simple de les échanger.
Le module radio communique en SPI, ce qui nécessite un peu plus de connexions qu'I2C mais reste très simple d'utilisation grâce à la librairie NRF24. En utilisant le module GPS pour les mesures du capteur, nous transmettons ses données d'un Arduino à l'autre. Nous allons connecter le module GPS et radio à l'Arduino et de l'autre côté un Arduino avec le module radio - regardez le schéma.
Émetteur
#comprendre
#include #include #include #include GPS TinyGPSPlus; SoftwareSerial ss(4, 3); radio RF24 (8, 7); // CE, CSN struct dataStruct{ double latitude; double longitude; date longue non signée; non signé longtemps; }gpsData; void setup() { Serial.begin(115200); ss.begin(9600); Serial.println("Configuration de la radio"); // Configuration de l'émetteur 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("Commencer à envoyer"); } boucle vide() { 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.latitude = 0.0; } if (gps.date.isValid()){ gpsData.date = gps.date.value(); } else{ gpsData.date = 0; } if (gps.time.isValid()){ gpsData.time = gps.time.value(); } else{ gpsData.time = 0; } }
DESTINATAIRE
#comprendre
#include #include radio RF24 (8, 7); // CE, CSN struct dataStruct{ double latitude; double longitude; date longue non signée; longtemps non signé; }gpsData; void setup() { Serial.begin(115200); // Configuration du récepteur radio radio.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("Emplacement: "); Serial.print(gpsData.latitude, 6); Serial.print(", "); Serial.print(gpsData.longitude, 6); Serial.print(" Date: "); Serial.print(gpsData.date); Serial.print(" Heure: "); Serial.print(gpsData.time); Serial.println();} }
(Regardez la vidéo de ce code sur
Étape 3: Stockage des données à l'aide d'un module de carte SD
Le module radio est assez fiable, mais parfois vous avez besoin d'un plan d'urgence en cas de coupure de courant côté récepteur ou si la radio se déplace hors de portée. Notre plan d'urgence est un module de carte SD qui nous permet de stocker les données que nous collectons. La quantité de données collectées n'est pas si importante, donc même une petite carte SD pourra facilement stocker l'équivalent d'une journée de données.
#comprendre
#include #include #include GPS TinyGPSPlus; SoftwareSerial ss(4, 3); struct dataStruct{ double latitude; double longitude; date longue non signée; non signé longtemps; }gpsData; void setup() { Serial.begin(115200); ss.begin(9600); if (!SD.begin(5)) { Serial.println("La carte a échoué ou n'est pas présente"); revenir; } Serial.println("carte initialisée."); Fichier dataFile = SD.open("gps_data.csv", FILE_WRITE); if (dataFile) { dataFile.println("Latitude, Longitude, Date, Heure"); dataFile.close(); } else{ Serial.println("nope can't open file"); } } void loop() { while (ss.available() > 0){ if (gps.encode(ss.read())){ getInfo(); printRésultats(); saveInfo(); } } } void getInfo(){ if (gps.location.isValid()){ gpsData.latitude = gps.location.lat(); gpsData.longitude = gps.location.lng(); } else{ Serial.println("Emplacement invalide"); } if (gps.date.isValid()){ gpsData.date = gps.date.value(); } else{ Serial.println("Date invalide"); } if (gps.time.isValid()){ gpsData.time = gps.time.value(); } else{ Serial.println("Heure invalide"); } } void printResults(){ Serial.print("Emplacement: "); Serial.print(gpsData.latitude, 6); Serial.print(", "); Serial.print(gpsData.longitude, 6); Serial.print(" Date: "); Serial.print(gpsData.date); Serial.print(" Heure: "); Serial.print(gpsData.time); Serial.println(); } void saveInfo(){ File 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.date); dataFile.print(", "); dataFile.println(gpsData.time); dataFile.close(); } else{ Serial.println("non, pas de fichier de données"); } }
(Nous parlons à travers ce code dans la vidéo
Étape 4: Envoi et stockage des données GPS
Étape 5: Merci
Inscrivez-vous à notre liste de diffusion !
Partie 1: Faire la mesure des vagues et de la température
Partie 2: Radio GPS NRF24 et carte SD
Partie 3: Planification de l'alimentation de la bouée
Partie 4: Déploiement de la bouée