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 ![]()
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)
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);
