Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SPI.h>
- #include <SD.h>
- // Constantes symboliques du système
- #define PIN_CAPTEUR A2
- #define PIN_CS_SD 4
- #define DUREE_ACQUISITION_MS 7000
- #define FACTEUR_CONVERSION 0.0205
- #define OFFSET_CAPTEUR 261
- // Constantes pour la configuration du timer
- #define TIMER_PRESCALER 1024
- #define FREQUENCE_CPU 16000000UL
- #define TICKS_PAR_SECONDE (FREQUENCE_CPU / TIMER_PRESCALER)
- #define SECONDES_ACQUISITION 7
- // Variables globales
- File myFile;
- unsigned long tempsDebut;
- volatile boolean acquisitionTerminee = false;
- volatile uint8_t compteurInterruptions = 0;
- void setup() {
- // Initialisation de la communication série
- Serial.begin(115200);
- Serial.println(F("Initialisation carte SD..."));
- // Initialisation de la carte SD
- if (!SD.begin(PIN_CS_SD)) {
- Serial.println(F("Échec!"));
- return;
- }
- // Préparation du fichier d'enregistrement
- if (SD.exists("MESURE.txt")) {
- SD.remove("MESURE.txt");
- }
- myFile = SD.open("MESURE.txt", FILE_WRITE);
- // Configuration du timer pour la durée d'acquisition
- configurerTimer();
- // Démarrage de l'acquisition
- tempsDebut = millis();
- Serial.println(F("Début acquisition"));
- }
- // Configuration du Timer1 pour générer des interruptions périodiques
- void configurerTimer() {
- noInterrupts();
- // Réinitialisation des registres
- TCCR1A = 0;
- TCCR1B = 0;
- TCNT1 = 0;
- // Configuration pour une interruption par seconde
- OCR1A = TICKS_PAR_SECONDE - 1;
- // Mode CTC avec prescaler 1024
- TCCR1B |= (1 << WGM12); // Mode CTC
- TCCR1B |= (1 << CS12) | (1 << CS10); // Prescaler 1024
- // Activation de l'interruption
- TIMSK1 |= (1 << OCIE1A);
- interrupts();
- }
- // Gestionnaire d'interruption du Timer1
- ISR(TIMER1_COMPA_vect) {
- // Incrémentation et vérification du compteur
- if (++compteurInterruptions >= SECONDES_ACQUISITION) {
- acquisitionTerminee = true;
- TIMSK1 = 0; // Désactivation complète des interruptions du Timer1
- }
- }
- void loop() {
- static uint32_t nbEchantillons = 0;
- // Boucle d'acquisition rapide
- if (!acquisitionTerminee) {
- // Lecture et conversion de la valeur
- uint16_t valeurBrute = analogRead(PIN_CAPTEUR);
- float valeurConvertie = FACTEUR_CONVERSION * (OFFSET_CAPTEUR - valeurBrute);
- // Écriture dans le fichier
- myFile.print(valeurConvertie);
- myFile.println(F(";"));
- // Incrémentation du compteur
- nbEchantillons++;
- }
- // Finalisation de l'acquisition
- else if (myFile) {
- // Fermeture du fichier
- myFile.close();
- // Affichage des statistiques
- Serial.println(F("Acquisition terminée"));
- Serial.print(F("Échantillons: "));
- Serial.println(nbEchantillons);
- Serial.print(F("Durée (ms): "));
- Serial.println(millis() - tempsDebut);
- // Attente infinie (évite les répétitions)
- while(true) {
- delay(1000);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement