1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
| #include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <math.h>
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
const int boutonPin = 8; // Broche du bouton poussoir
Adafruit_MPU6050 mpu1, mpu2; // Deux instances de l'objet Adafruit_MPU6050
float incl1 = 0;
float incl2 = 0;
float inclRef = 0;
float inclMes = 0;
const unsigned long intervalleMesure = 3000; // Intervalle entre les mesures en millisecondes
const float margeInclinaison = 3.0;
unsigned long derniereMesure = 0;
// Configuration des broches RX et TX pour la communication avec le module GPS
SoftwareSerial gpsSerial(7, 6); // RX sur broche 6, TX sur broche 7
// Initialisation de l'objet GPS
Adafruit_GPS GPS(&gpsSerial);
// Variables pour stocker la latitude et la longitude
float latitude;
float longitude;
void setup() {
// Initialisation de la communication série avec le moniteur série
Serial.begin(9600);
// Initialisation de la communication série avec le module GPS
gpsSerial.begin(9600);
// Initialisation de l'objet GPS
GPS.begin(9600);
pinMode(boutonPin, INPUT_PULLUP);
Serial.println(F("Initialisation du système"));
// Démarrage du premier MPU6050 à l'adresse 0x68
if (!mpu1.begin(0x68)) {
Serial.println("Échec de la détection de la puce MPU6050 (1)");
while (1) {
delay(10);
}
}
// Démarrage du deuxième MPU6050 à l'adresse 0x69
if (!mpu2.begin(0x69)) {
Serial.println("Échec de la détection de la puce MPU6050 (2)");
while (1) {
delay(10);
}
}
// Configuration des paramètres des MPU6050
mpu1.setAccelerometerRange(MPU6050_RANGE_16_G);
mpu1.setGyroRange(MPU6050_RANGE_250_DEG);
mpu1.setFilterBandwidth(MPU6050_BAND_21_HZ);
mpu2.setAccelerometerRange(MPU6050_RANGE_16_G);
mpu2.setGyroRange(MPU6050_RANGE_250_DEG);
mpu2.setFilterBandwidth(MPU6050_BAND_21_HZ);
}
void loop() {
// Lecture et affichage des données d'inclinaison
lectureInclinaison();
// Lecture et affichage des données GPS
lectureGPS();
delay(2000);
}
void lectureInclinaison() {
bool boutonAppuye = !digitalRead(boutonPin);
if (boutonAppuye) {
inclRef = lireInclinaisonMoyenne();
delay(1000); // Attendre un court instant avant de continuer
}
Serial.print("Valeur de référence : ");
Serial.print(inclRef);
Serial.println(" degrés");
unsigned long maintenant = millis();
if (maintenant - derniereMesure >= intervalleMesure) {
inclMes = lireInclinaisonMoyenne();
Serial.print("Mesure : ");
Serial.print(inclMes);
Serial.println(" degrés");
// Vérifier si la différence avec la valeur de référence dépasse la marge autorisée
float difference = abs(inclRef - inclMes);
if (difference > margeInclinaison) {
Serial.println("Position mauvaise");
} else {
Serial.println("Position correcte");
}
// Mettre à jour le temps de la dernière mesure
derniereMesure = maintenant;
}
}
void lectureGPS() {
// Lecture des données GPS
if (GPS.available()) {
char c = GPS.read();
// Analyser les données NMEA
if (GPS.newNMEAreceived()) {
// Si un nouveau message NMEA est reçu, l'analyser
if (GPS.parse(GPS.lastNMEA())) {
// Si le parsing est réussi, vous pouvez accéder aux données GPS
if (GPS.fix) {
// Si le module GPS a fixé une position valide
Serial.print("Latitude: ");
Serial.print(GPS.latitudeDegrees, 7); // Afficher la latitude
Serial.print(" Longitude: ");
Serial.println(GPS.longitudeDegrees, 7); // Afficher la longitude
// Enregistrer la latitude et la longitude dans les variables
latitude = GPS.latitudeDegrees;
longitude = GPS.longitudeDegrees;
} else {
// Si le module GPS n'a pas encore fixé de position valide
Serial.println("Veuillez attendre, le signal GPS n'est pas encore fixé.");
}
}
}
}
}
float lireInclinaisonMoyenne() {
float sommeInclinaisons = 0;
for (int i = 0; i < 5; ++i) {
readMPU1(); // Lecture des données du premier MPU6050
readMPU2(); // Lecture des données du deuxième MPU6050
sommeInclinaisons += ((incl1 + incl2) / 2);
delay(1000);
}
return sommeInclinaisons / 5.0;
}
void readMPU1() {
sensors_event_t a, g, temp;
mpu1.getEvent(&a, &g, &temp);
// Calcul de l'angle d'inclinaison en radians pour le premier MPU6050
float pitch = atan2(-a.acceleration.x, sqrt(a.acceleration.y * a.acceleration.y + a.acceleration.z * a.acceleration.z));
// Conversion des radians en degrés et affichage de l'angle d'inclinaison
pitch = -1 * (pitch * 180.0 / M_PI);
pitch = round(pitch);
incl1 = pitch;
}
void readMPU2() {
sensors_event_t a, g, temp;
mpu2.getEvent(&a, &g, &temp);
// Calcul de l'angle d'inclinaison en radians pour le deuxième MPU6050
float pitch = atan2(-a.acceleration.x, sqrt(a.acceleration.y * a.acceleration.y + a.acceleration.z * a.acceleration.z));
// Conversion des radians en degrés et affichage de l'angle d'inclinaison
pitch = -1 * (pitch * 180.0 / M_PI);
pitch = round(pitch);
incl2 = pitch;
} |
Partager