Demande d'aide pour compréhension programme Arduino

chris3874 - Modifié le 27 nov. 2023 à 21:09
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 - 27 nov. 2023 à 18:20

Bonjour,

Je suis nul en C et j'ai recupéré ce programme qui me sera utile par la suite...

#include <Arduino.h>
#include <math.h>

int ecgPin = A0;
int ledPin = 13;
volatile int ecgValue = 0;
volatile float ecgValueFloat;
volatile bool flag;
volatile int data=0;

// put function declarations here:
void timerSetup(void);
void setup() {
  // put your setup code here, to run once:
    timerSetup();
  // declare the ledPin as an OUTPUT
    pinMode(ledPin, OUTPUT);
    digitalWrite(ledPin, LOW);
    flag = false;
    Serial.begin(115200);       // initialize UART with baud rate of 9600 bps
}

void loop() {
  // put your main code here, to run repeatedly:
}

void timerSetup(void){
    noInterrupts();
    TCCR1A = 0;
    TCCR1B = 0;
    // 15625 = 16Mhz/1024 (prescalar)
    // echantillonage toute le 100 ms
    TCNT1 = 65536 - 1562;
    //TCNT1 = 55536;            // preload timer 65536-16MHz/8/200Hz
    TCCR1B |= (1 << CS00);    // prescaler : 1024
    TCCR1B |= (1 << CS02);
    TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt JMJ
    // JMJ added
    TIFR1 |= 1;
    interrupts();             // enable all interrupts
}

ISR(TIMER1_OVF_vect){
    char buff[10];
    ecgValue = analogRead(ecgPin); // int : two bytes
    Serial.print("ecgValue: ");
    Serial.println(ecgValue);
    ecgValueFloat = (ecgValue * 5) / 1024.0;
    dtostrf(ecgValueFloat, 4, 6, buff);
    //snprintf (buff, sizeof(buff), "%f", ecgValueFloat);
    Serial.print("ecgValueFloat: ");
    Serial.println(ecgValueFloat,2);
    //Serial.write(ecgValue >> 8);  // send first byte
    //Serial.write(ecgValue);       // send second byte
    //TCNT1 = 55536;            // reset intterupt
    TCNT1 = 65536 - 1562;
    flag = ! flag;
    if (flag == true) digitalWrite(ledPin, LOW);
    else digitalWrite(ledPin, HIGH);
}

Pourriez-vous m'indiquer ce que fait chaque ligne (en écrivant à coté..dessous...) puis dans sa globalité...Merci d'avance de votre aide...

2 réponses

[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
27 nov. 2023 à 18:20

C'est de l'Arduino, ce n'est effectivement pas du C (d'ailleurs il y a des éléments de C++ aussi dans ce langage), même si la syntaxe ressemble, c'est un langage à part entière.

Je me suis familiarisé avec Arduino il y a longtemps, mais pas de façon approfondie.

Dans un programme Arduino, la fonction setup est appelée automatiquement 1 fois au démarrage, et loop est appelée automatiquement en boucle, comme son nom l'indique, une fois le setup terminé (tu n'as pas à appeler explicitement ces fonctions, c'est juste comme cela que cela fonctionne dans ce langage).

Dans ce code elle est vide et ne fait rien elle-même car les parties actives sont exécutées par une interruption provenant d'un timer du matériel. La fonction ISR() est appelée lorsque l'interruption se produit (visiblement toutes les 100 ms). "ISR" signifie "Interrupt Service Routines".

On en parle là :

https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

et sur ce lien auquel renvoie la documentation ci-dessus : http://gammon.com.au/interrupts

Comme le code "récupéré" par chris3874 est loin de faire une utilisation évidente de l'Arduino, je pense que chris3874 devrait poser sa question sur un forum Arduino.

2
mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
27 nov. 2023 à 15:05

Bonjour,

C'est difficile à dire même si on fait du C, car en réalité, il faut regarder la documentation associée à chaque fonction, pour la plupart fournies par Arduino. Le point de départ serait donc de regarder ici.

Sur le principe :

  • les lignes 1-2 incluent les headers fournissant les fonctions impliquées dans ton programme ;
  • les lignes 4-9 déclarent des variables globales au programme ;
    • Vu le nommage il est sans doute question d'un électrocardiogramme
  • la ligne 12 déclare une fonction qui sera implémentée par la suite (l27) ;
  • la fonction setup crée la connexion vers le périphérique, visiblement connecté à un port série ;
  • la fonction loop ne fait rien, mais te laisse l'opportunité de faire quelque chose à chaque fois qu'elle est appelée (mais elle n'est pas invoquée explicitement dans ton code, donc difficile de dire quand)
  • la fonction timerSetup... voir les commentaires :-) ;
  • la fin du programme semble être le programme principal ;
    • on lit un code PIN et on l'envoie sur le port série
    • on crée une chaîne contenant une valeur flottante (ecgValueFloat) et on l'envoie sur le port série
    • on envoie alternativement un signal haut ou bas sur ledPin.

Bonne chance

0