#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Wire.h>
#include <MPU6050.h>
#define nombreDePixelsEnLargeur 128
#define nombreDePixelsEnHauteur 64
#define brocheResetOLED -1
#define adresseI2CecranOLED 0x3C
Adafruit_SSD1306 ecranOLED(nombreDePixelsEnLargeur, nombreDePixelsEnHauteur, &Wire, brocheResetOLED);
MPU6050 mpu;
unsigned long startTime = 0; // Temps de début du chronomètre
unsigned long elapsedTime = 0; // Temps écoulé du chronomètre
bool isChronometerRunning = false; // Indicateur pour savoir si le chronomètre est en cours d'exécution
const int ledPin = 7; // Broche de la LED
const int buzzerPin = 8; // Broche du buzzer
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
// Vérifier si le MPU6050 est connecté correctement
if (!mpu.testConnection()) {
Serial.println("MPU6050 connection failed.");
while (1);
}
if (!ecranOLED.begin(SSD1306_SWITCHCAPVCC, adresseI2CecranOLED))
while (1);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// Variables pour stocker les valeurs d'accélération et de gyroscope
int16_t ax, ay, az, gx, gy, gz;
// Lire les données du MPU6050
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// Lecture de la température depuis le capteur MPU6050
float rawTemperature = mpu.getTemperature();
// Conversion de la température en degrés Celsius
float temperature = (rawTemperature / 340.0) + 36.53; // Conversion en fonction des spécifications du MPU6050
// Calculer l'angle autour de l'axe X en degrés en utilisant les données de l'accéléromètre
float angleX = atan2(-ay, az) * 180 / M_PI;
// Arrondir l'angle à l'unité
int angleX_rounded = round(angleX);
// Enregistrement de la dernière valeur maximale et minimale d'angle de l'axe X
static int lastMaxAngleX = INT8_MIN;
static int lastMinAngleX = INT8_MAX;
lastMaxAngleX = max(lastMaxAngleX, angleX_rounded);
lastMinAngleX = min(lastMinAngleX, angleX_rounded);
// Vérifier si l'angle X dépasse un certain seuil pour déclencher ou arrêter le chronomètre
if (angleX_rounded > 15 || angleX_rounded < -15) {
delay(2000);
if (!isChronometerRunning) {
startTime = millis(); // Démarre le chronomètre si ce n'était pas déjà fait
isChronometerRunning = true;
digitalWrite(ledPin, HIGH); // Allumer la LED lorsque l'angle dépasse le seuil
tone(buzzerPin, 1000); // Jouer une tonalité à une fréquence de 1000 Hz
noTone(buzzerPin); // Arrêter la tonalité
}
} else {
if (isChronometerRunning) {
elapsedTime += millis() - startTime; // Met à jour le temps écoulé si le chronomètre était en cours
isChronometerRunning = false; // Arrête le chronomètre
digitalWrite(ledPin, LOW); // Éteindre la LED lorsque l'angle est inférieur au seuil
}
}
// Effacer le contenu précédent de l'écran
ecranOLED.clearDisplay();
// Afficher la température sur l'écran OLED
ecranOLED.setTextColor(SSD1306_WHITE);
ecranOLED.setTextSize(1);
ecranOLED.setCursor(90, 0);
ecranOLED.print(temperature);
ecranOLED.print("C");
// Afficher l'angle X arrondi à l'unité sur l'écran OLED
ecranOLED.setTextColor(SSD1306_WHITE);
ecranOLED.setTextSize(2);
ecranOLED.setCursor(0, 0);
ecranOLED.print("X: ");
ecranOLED.print(angleX_rounded);
// Afficher la dernière valeur maximale de l'angle de l'axe X sur l'écran OLED
ecranOLED.setTextColor(SSD1306_WHITE);
ecranOLED.setTextSize(2);
ecranOLED.setCursor(0, 16);
ecranOLED.print("MaX: ");
ecranOLED.print(lastMaxAngleX);
// Afficher la dernière valeur minimale de l'angle de l'axe X sur l'écran OLED
ecranOLED.setTextColor(SSD1306_WHITE);
ecranOLED.setTextSize(2);
ecranOLED.setCursor(0, 32);
ecranOLED.print("MinX: ");
ecranOLED.print(lastMinAngleX);
// Afficher le temps écoulé du chronomètre sur l'écran OLED
ecranOLED.setTextColor(SSD1306_WHITE);
ecranOLED.setTextSize(2);
ecranOLED.setCursor(0, 48);
printElapsedTime(elapsedTime);
// Mettre à jour l'écran
ecranOLED.display();
}
void printElapsedTime(unsigned long elapsedMillis) {
unsigned long seconds = elapsedMillis / 1000;
unsigned long minutes = seconds / 60;
unsigned long hours = minutes / 60;
ecranOLED.print(hours);
ecranOLED.print(":");
ecranOLED.print(minutes % 60, DEC);
ecranOLED.print(":");
ecranOLED.print(seconds % 60, DEC);
}