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