Advertisement
bipping

Freehare.cpp

Mar 18th, 2025
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <SPI.h>
  2. #include <SD.h>
  3.  
  4. // Constantes symboliques du système
  5. #define PIN_CAPTEUR A2
  6. #define PIN_CS_SD 4
  7. #define DUREE_ACQUISITION_MS 7000
  8. #define FACTEUR_CONVERSION 0.0205
  9. #define OFFSET_CAPTEUR 261
  10.  
  11. // Constantes pour la configuration du timer
  12. #define TIMER_PRESCALER 1024
  13. #define FREQUENCE_CPU 16000000UL
  14. #define TICKS_PAR_SECONDE (FREQUENCE_CPU / TIMER_PRESCALER)
  15. #define SECONDES_ACQUISITION 7
  16.  
  17. // Variables globales
  18. File myFile;
  19. unsigned long tempsDebut;
  20. volatile boolean acquisitionTerminee = false;
  21. volatile uint8_t compteurInterruptions = 0;
  22.  
  23. void setup() {
  24.     // Initialisation de la communication série
  25.     Serial.begin(115200);
  26.     Serial.println(F("Initialisation carte SD..."));
  27.    
  28.     // Initialisation de la carte SD
  29.     if (!SD.begin(PIN_CS_SD)) {
  30.         Serial.println(F("Échec!"));
  31.         return;
  32.     }
  33.    
  34.     // Préparation du fichier d'enregistrement
  35.     if (SD.exists("MESURE.txt")) {
  36.         SD.remove("MESURE.txt");
  37.     }
  38.     myFile = SD.open("MESURE.txt", FILE_WRITE);
  39.    
  40.     // Configuration du timer pour la durée d'acquisition
  41.     configurerTimer();
  42.    
  43.     // Démarrage de l'acquisition
  44.     tempsDebut = millis();
  45.     Serial.println(F("Début acquisition"));
  46. }
  47.  
  48. // Configuration du Timer1 pour générer des interruptions périodiques
  49. void configurerTimer() {
  50.     noInterrupts();
  51.    
  52.     // Réinitialisation des registres
  53.     TCCR1A = 0;
  54.     TCCR1B = 0;
  55.     TCNT1 = 0;
  56.    
  57.     // Configuration pour une interruption par seconde
  58.     OCR1A = TICKS_PAR_SECONDE - 1;
  59.    
  60.     // Mode CTC avec prescaler 1024
  61.     TCCR1B |= (1 << WGM12);  // Mode CTC
  62.     TCCR1B |= (1 << CS12) | (1 << CS10);  // Prescaler 1024
  63.    
  64.     // Activation de l'interruption
  65.     TIMSK1 |= (1 << OCIE1A);
  66.    
  67.     interrupts();
  68. }
  69.  
  70. // Gestionnaire d'interruption du Timer1
  71. ISR(TIMER1_COMPA_vect) {
  72.     // Incrémentation et vérification du compteur
  73.     if (++compteurInterruptions >= SECONDES_ACQUISITION) {
  74.         acquisitionTerminee = true;
  75.         TIMSK1 = 0;  // Désactivation complète des interruptions du Timer1
  76.     }
  77. }
  78.  
  79. void loop() {
  80.     static uint32_t nbEchantillons = 0;
  81.    
  82.     // Boucle d'acquisition rapide
  83.     if (!acquisitionTerminee) {
  84.         // Lecture et conversion de la valeur
  85.         uint16_t valeurBrute = analogRead(PIN_CAPTEUR);
  86.         float valeurConvertie = FACTEUR_CONVERSION * (OFFSET_CAPTEUR - valeurBrute);
  87.        
  88.         // Écriture dans le fichier
  89.         myFile.print(valeurConvertie);
  90.         myFile.println(F(";"));
  91.        
  92.         // Incrémentation du compteur
  93.         nbEchantillons++;
  94.     }
  95.     // Finalisation de l'acquisition
  96.     else if (myFile) {
  97.         // Fermeture du fichier
  98.         myFile.close();
  99.        
  100.         // Affichage des statistiques
  101.         Serial.println(F("Acquisition terminée"));
  102.         Serial.print(F("Échantillons: "));
  103.         Serial.println(nbEchantillons);
  104.         Serial.print(F("Durée (ms): "));
  105.         Serial.println(millis() - tempsDebut);
  106.        
  107.         // Attente infinie (évite les répétitions)
  108.         while(true) {
  109.             delay(1000);
  110.         }
  111.     }
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement