Bonjour à tous,
Je me retrouve bloqué dans mon projet et je ne comprends pas pourquoi il ne fonctionne pas. Je m'explique : je veux, pour un projet, enregistrer une pression sur une carte SD avec un écran OLED. Le programme fonctionnait parfaitement avec un écran LCD I2C, j'ai simplement adapté le code pour un écran OLED. Cependant, mon problème est que depuis, je perds la communication avec l'écran.
J'ai déjà testé séparément la carte SD et l'écran, et les deux fonctionnent bien. Les câblages sont corrects, et j'ai vérifié les adresses I2C, elles remontent bien. Mais lorsque je les assemble, rien ne fonctionne. Je ne comprends pas d'où vient le problème. Ci-dessous, le code complet.
#include <Wire.h> // Inclusion de la bibliothèque Wire pour la communication I2C
#include <Adafruit_GFX.h> // Inclusion de la bibliothèque Adafruit_GFX pour les graphiques (affichage sur OLED)
#include <Adafruit_SSD1306.h> // Inclusion de la bibliothèque Adafruit_SSD1306 pour l'écran OLED SSD1306
#include <RTClib.h> // Inclusion de la bibliothèque RTClib pour gérer le module RTC
#include <SD.h> // Inclusion de la bibliothèque SD pour interagir avec la carte SD
#include "logo_cegelec.h" // Inclusion du fichier contenant le logo Cegelec (si utilisé)
#define SCREEN_WIDTH 128 // Largeur de l'écran OLED (en pixels)
#define SCREEN_HEIGHT 64 // Hauteur de l'écran OLED (en pixels)
#define PRESSURE_SENSOR A0 // Pin du capteur de pression (sur la pin A0 de l'Arduino)
#define SD_CS 10 // Pin CS (Chip Select) de la carte SD (ici sur la pin 10)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // Création d'un objet display pour l'écran OLED sans pin RESET
RTC_DS1307 rtc; // Création d'un objet rtc pour gérer l'horloge RTC
float V, P; // Variables pour stocker la tension et la pression
File dataFile; // Variable pour gérer le fichier sur la carte SD
void setup() {
Serial.begin(9600); // Initialisation de la communication série à 9600 bauds
pinMode(PRESSURE_SENSOR, INPUT); // Définition de la pin du capteur de pression comme entrée
// Initialisation de l'écran OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Vérifie si l'écran OLED s'initialise correctement (adresse 0x3C)
Serial.println(F("Échec de l'initialisation de l'écran OLED"));
while (true); // Arrête le programme en cas d'échec
}
// Initialisation du module RTC
if (!rtc.begin()) {
Serial.println("Échec de l'initialisation du RTC");
while (true); // Arrête le programme en cas d'échec
}
// Vérifier l'heure du RTC et la régler si nécessaire
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Réglage de l'heure et de la date avec la date de compilation du programme
}
// Initialisation de la carte SD
if (!SD.begin(SD_CS)) { // Vérifie si la carte SD est bien initialisée
Serial.println("Erreur d'initialisation de la carte SD !");
while (true); // Arrête le programme en cas d'échec
}
Serial.println("Carte SD initialisée");
// Créer un fichier et écrire des données d'entête
dataFile = SD.open("data.csv", FILE_WRITE); // Ouvre (ou crée) un fichier CSV sur la carte SD en mode écriture
if (dataFile) {
dataFile.println("Date,Time,Tension (V),Pression (bar)"); // Ajoute des entêtes de colonnes
dataFile.close(); // Ferme le fichier après l'écriture
} else {
Serial.println("Erreur d'ouverture du fichier !");
while (true); // Arrête le programme si l'ouverture du fichier échoue
}
// Initialisation de l'écran OLED pour l'affichage
display.clearDisplay(); // Efface l'écran OLED
display.setTextSize(1); // Définit la taille du texte sur l'écran OLED
display.setTextColor(SSD1306_WHITE); // Définit la couleur du texte (blanc)
}
void loop() {
DateTime now = rtc.now(); // Obtenez l'heure et la date actuelles du RTC
// Lecture et conversion de la tension du capteur de pression
V = analogRead(PRESSURE_SENSOR) * (4.5 - 0.05) / 1024.0 + 0.05; // Lecture de la tension et conversion en volts
P = max((V - 0.493) * 10.0 / 0.9, 0.0); // Calcul de la pression en bar en fonction de la tension
// Affichage de la date, de l'heure et de la pression sur l'écran OLED
display.clearDisplay(); // Efface l'écran pour mettre à jour les données
// Affichage de la date
display.setTextSize(1); // Définit la taille du texte
display.setCursor(0, 0); // Position du curseur à la première ligne
display.print("Date: ");
display.print(now.year(), DEC);
display.print('/');
display.print(now.month(), DEC);
display.print('/');
display.print(now.day(), DEC);
// Affichage de l'heure
display.setCursor(0, 10); // Position du curseur à la deuxième ligne
display.print("Time: ");
display.print(now.hour(), DEC);
display.print(':');
display.print(now.minute(), DEC);
display.print(':');
display.print(now.second(), DEC);
// Affichage de la pression
display.setCursor(0, 30); // Position du curseur à la troisième ligne
display.print("Pression: ");
display.print(P, 1); // Affiche la pression avec une décimale
display.print(" bar");
display.display(); // Actualisation de l'affichage
// Enregistrement des données dans la carte SD
dataFile = SD.open("data.csv", FILE_WRITE); // Ouvre le fichier en mode écriture
if (dataFile) {
// Enregistre la date, l'heure, la tension et la pression dans le fichier CSV
dataFile.print(now.year(), DEC);
dataFile.print('/');
dataFile.print(now.month(), DEC);
dataFile.print('/');
dataFile.print(now.day(), DEC);
dataFile.print(",");
dataFile.print(now.hour(), DEC);
dataFile.print(":");
dataFile.print(now.minute(), DEC);
dataFile.print(":");
dataFile.print(now.second(), DEC);
dataFile.print(",");
dataFile.print(V, 3); // Enregistrement de la tension avec 3 décimales
dataFile.print(",");
dataFile.print(P, 1); // Enregistrement de la pression avec 1 décimale
dataFile.println(); // Ajoute une nouvelle ligne après chaque enregistrement
dataFile.close(); // Ferme le fichier après l'écriture
Serial.println("Données enregistrées sur la carte SD");
} else {
Serial.println("Erreur lors de l'écriture sur la carte SD");
}
// Affichage sur le moniteur série
Serial.print("Tension : ");
Serial.print(V, 3); // Affiche la tension avec 3 décimales
Serial.println("V");
Serial.print("Pression : ");
Serial.print(P, 1); // Affiche la pression avec 1 décimale
Serial.println(" bar");
Serial.println();
delay(1000); // Attendre 1 seconde avant de recommencer le loop
}