Demande d'aide pour compréhension programme Arduino
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
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...
- "Windows 10"
- Programme demarrage windows - Guide
- Message programmé iphone - Guide
- Mettre en veille un programme - Guide
- Programme word gratuit - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
2 réponses
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.
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