Utilisation d'une fonction dans l'arduino

Cool. Bonne continuation

Salut !

J'ai fait des calculs de RMS un plus précis qu'avant. Tous mes calculs, je les ai fait pour la différence de tension entre A0 et A1. Je voudrais savoir comment automatiser cela pour d'autres mesures c'est-à-dire pour A0_A2 ou A1_A3... .
D'avance merci !

void loop() {
  float somme = 0, sommeCarre = 0; // Initialisation de la variable somme et sommeCarre
  float Vmin, Vmax, Newdata, pic2pic; // initialisation des valeurs Vmin et Vmax
  int N = 1000; // Nombre d'acquisition
  double Buffer [N]; // Stockage des valeurs dans un tableau

  for (int i = 0; i < N; i++) { // boucle for pour réaliser 1000 mesures
    int16_t valeurA0_A1 = ADS.readADC_Differential_0_1(); // valeur numérique de la différence de tension entre chanal A0 et A1
    float Newdata = ADS.toVoltage(valeurA0_A1); // valeur en volt
    Buffer[i] = Newdata; // acquisition d'une nouvelle valeur
    somme += Buffer[i]; // On fait la somme des valeurs dans le tableau
    Vmin = min(Newdata, Vmin); // Calcul de Vmin
    Vmax = max(Newdata, Vmax); // Calcul de Vmax
    pic2pic     = Vmax - Vmin; // Calcul de l'amplitude pic to pic
  }
  float moyenne = somme / N;  // Faire la moyenne

  for (int i = 0; i < N; i++) {
    sommeCarre += (Buffer[i] - moyenne) * (Buffer[i] - moyenne); // Calcul de la somme des carré
  }
  float RMS = sqrt(sommeCarre / N); // Calcu de RMS
  SerialUSB.print("La moyenne est : "); //afficher la valeur moyenne
  SerialUSB.println(moyenne); // Valeu moyenne
  SerialUSB.print("La valeur RMS est : "); //afficher la valeur Vpp
  SerialUSB.println(RMS); // Valeu Vpp
  SerialUSB.print("La valeur minimale est : "); //afficher la valeur minimale
  SerialUSB.println(Vmin); // Valeu minimale
  SerialUSB.print("La valeur maximale est : "); //afficher la valeur maximale
  SerialUSB.println(Vmax); // Valeu maximale
  SerialUSB.print("La valeur Vpp est : "); //afficher la valeur Vpp
  SerialUSB.println(pic2pic); // Valeu Vpp


  while (1); // Forcer le programme à s'arrêter
}

ben il suffit de faire pareil mais au lieu d'appeler
float Newdata = ADS.toVoltage(ADS.readADC_Differential_0_1());
vous appelez la bonne fonction pour A0_A2 ou A1_A3

en déclarant plus de variables pour capturer chaque canal, vous pouvez mettre tout dans la même boucle

Vous voulez dire comme ça ?

for (int i = 0; i < N; i++) { // boucle for pour réaliser 1000 mesures
    int16_t valeurA0_A3 = ADS.readADC_Differential_0_3(); // valeur numérique de la différence de tension entre chanal A0 et A1
    int16_t valeurA1_A3 = ADS.readADC_Differential_1_3();
    int16_t valeurA2_A3 = ADS.readADC_Differential_2_3();
    float Newdata = ADS.toVoltage(valeurA0_A3);// valeur en volt
    float Newdata = ADS.toVoltage(valeurA1_A3);
    float Newdata = ADS.toVoltage(valeurA2_A3) ;
    Buffer[i] = Newdata; // acquisition d'une nouvelle valeur
    somme += Buffer[i]; // On fait la somme des valeurs dans le tableau
    Vmin = min(Newdata, Vmin); // Calcul de Vmin
    Vmax = max(Newdata, Vmax); // Calcul de Vmax
    pic2pic     = Vmax - Vmin; // Calcul de l'amplitude pic to pic
  }

Mais comment je fais pour avoir un Newdata pour chaque différence de tension et faire les calculs ?

Je voudrais faire les calculs pour les trois valeurs de tension en même temps...

ben non, il faut des variables différentes... le compilo va se plaindre que Newdata est déjà déclarée

  for (int i = 0; i < 100; i++) {
    float Newdata01 = ADS.toVoltage(ADS.readADC_Differential_0_1());
    float Newdata03 = ADS.toVoltage(ADS.readADC_Differential_0_3());
    float Newdata23 = ADS.toVoltage(ADS.readADC_Differential_2_3());
   // pour 0-1
    somme01 += Newdata01; 
    sommeCarre01 = ...
    Vmin01 = ...
    Vmax01 =...

   // pour 0-3
    somme03 += Newdata03; 
    sommeCarre03 = ...
    Vmin03 = ...
    Vmax03 =...

   // pour 2-3
    somme23 += Newdata23; 
    sommeCarre23 = ...
    Vmin23 = ...
    Vmax23 =...
  }
  ... ici calculer les valeurs moyennes, VPP etc

bien sûr il faut déclarer les variables utilisées

D'accord, merci bcp !
Je pense plutôt utiliser des fonctions. Je vais y réfléchir si c'est plus pratique ou pas :slight_smile:

Bonjour,
Je voudrais utiliser 5 ads1115 en parallèle dans mon code arduino mais le problème est que le module n'a que 4 adresse i2C donc maximum 4 ADC en parallèle peuvent être piloter. Ainsi je voudrais utiliser les I/O digitales de l'arduino pour sélectionner l'ADC voulu. Concrètement je souhaiterait faire une fonction qui me permettra de mettre à l'état haut l'adresse i2c de l'ADC voulu et mettre les autres à l'état bas sachant que tous les 5 sont connectés à l'arduino.
Vous avez une idée comment faire cela s'il vous plaît ?

Merci d'avance pour votre réponse !

prenez un Multiplexeur I2C (genre TCA9548A)

:grinning:
pas mieux !

Merci pour votre proposition mais je sais pas trop comment utiliser ce module.
C'est pas possible de faire un truc comme ça ?

#include "ADS1X15.h"
ADS1115 ADS(0x48);  // ADS1115 physiquement défini à l'adresse 0x48 i2c

void setup() {
  pinMode(12, OUTPUT); // initialisation du pin 12 de l'arduino qui sera conencté à l'ADDR
  SerialUSB.begin(9600);
  while (!SerialUSB);
  ADS.begin();
  ADS.setGain(1); /
  ADS.setMode(1);
  ADS.setDataRate(7);
}
void loop() {
  digitalWrite(12, HIGH);

Je voudrais seulement modifier mon code et non rajouter un autre composant.
Avec ce programme, je risque pas quelque chose sur la carte arduino ?

en lisant le tuto du lien..

sinon lire l'article de TI pointé par Artouste sur les tenants et aboutissants du pilotage par GPIO

J'ai lu votre document et merci !
Si j'ai bien compris, c'est comme je l'ai fait ici non ?

#include "ADS1X15.h"
ADS1115 ADS(0x48);  // ADS1115 physiquement défini à l'adresse 0x48 i2c

void setup() {
  pinMode(12, OUTPUT); // initialisation du pin 12 de l'arduino qui sera conencté à l'ADDR
  SerialUSB.begin(9600);
  while (!SerialUSB);
  ADS.begin();
  ADS.setGain(1); /
  ADS.setMode(1);
  ADS.setDataRate(7);
}
void loop() {
  digitalWrite(12, HIGH);

comment voulez vous qu'on sache ?

A tester : essayer d'alimenter chacun des ads1115 (Low CurrentConsumption:150μA) par un GPIO dédié

J'ai fait un programme comme c'est expliqué dans le tuto mais je ne sais pas quelles broches de mon ADC seront connectées aux sorties numériques de l'arduino. Par exemple quand je choisis le pin 12 de l'arduino, cela sera relié à quelle broche de mon ADC ? Moi je pensais que c'était l'adresse ADDR de l'ADS1115 mais ça marche pas avec celle là.
Des suggestions s'il vous plaît ?

pouvez vous partager un lien sur votre ADS1115 ? (pour voir quelles pins sont exposées)

l'adresse est sélectionné en connectant ADDR à une des autres pins.


donc tout ce que vous pouvez simuler simplement depuis une pin sans matériel supplémentaire c'est GND ou VDD

Merci pour votre réponse rapide J-M-L. Je crois que j'ai lu le même document que vous c'est à dire la datasheet. Je me suis basé sur ce tableau pour connecter les 4 ADC. Maintenant j'en ai besoin 6 c'est pourquoi je voudrais utiliser les sorties digitales de l'arduino. Je pensais qu'en connectant l'adresse ADDR à ces sorties numériques ça marcherait mais tel n'est pas le cas...

essayez la propositions de @Artouste

essayer d’alimenter chacun des ads1115 (Low CurrentConsumption:150μA) par un GPIO dédié

En mettant la pin à LOW vous coupez l'alimentation du ads1115 et donc il "disparait" du bus. (parfois c'est un souci d'avoir un composant branché mais non alimenté)

Vous voulez que je connecte la sortie numérique de l'arduino au VDD de l'ADS1115 puis mettre cette pin à LOW ?
Par exemple

#define ADC_ADRESS1    8
pinMode(ADC_ADRESS1, OUTPUT);
digitalWrite(ADC_ADRESS1, LOW);