Comment faire plusieurs choses avec Arduino

Bonjour,

J'aimerais connecter plusieurs carpteurs en série mais comme l'ATmega2560 n'est pas multitâches, je ne sais pas trop comment bien faire.

J'ai d'abord essayé avec le multiplexer 1838HXL 74hc595 mais ça n'a pas fonctionné : Using a multiplexer with Arduino. Finalement j'ai essayé d'exécuter les x millisecondes depuis le lancement du programme avec millis() Comment faire plusieurs choses avec Arduino et ici aussi, tous les capteurs fonctionnent l'un après l'autre mais restent tous branchés en continue donc je présume que mon branchement n'est pas bon.

Maintenant j'ai 4 capteurs connectés et je ne sais pas comment vérifier la fiabilités des données puisque ça passe par de l'analogique, je pourrais très bien avoir le même résultat sur ma console sans rien connecter... Comment puis-je bien faire ? :slight_smile:

int LED1 = 12;
int LED2 = 11;
int buzzer = 10;
int sensorThreshold = 400;

void setup(){
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(buzzer, OUTPUT);
  
  Serial.begin(9600);
  pinMode(A0, INPUT);
}

void loop(){
  task_MQ2();
  task_MQ3();
  task_MQ4();
  task_MQ5();
}

void task_MQ2(){
  int analogSensor = analogRead(A0);
  Serial.print("Pin A0/MQ2: ");
  Serial.println(analogSensor);
  
  if (analogSensor > sensorThreshold)
  {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, LOW);
    tone(buzzer, 1000, 200);
  }
  else
  {
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, HIGH);
    noTone(buzzer);
  }
  delay(500);
}

void task_MQ3() {
  int analogSensor = analogRead(A1);
  Serial.print("Pin A1/MQ3: ");
  Serial.println(analogSensor);
  delay(500);
}

void task_MQ4() {
  int analogSensor = analogRead(A2);
  Serial.print("Pin A2/MQ4: ");
  Serial.println(analogSensor);
  delay(500);
}

void task_MQ5() {
  int analogSensor = analogRead(A3);
  Serial.print("Pin A3/MQ5: ");
  Serial.println(analogSensor);
  delay(500);
}

Parlez Anglais!

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

Développe, par ce que là c'est pas très clair.

  • Donne des détails sur les capteurs
  • Qu'est-ce que tu entends par branchés en continu?
  • Qu'est-ce que tu veux faire au final?

Bonjour sam_sam

J'ai pas compris où était ton problème. Si tu as assez d'entrées analogiques sur ton Arduino, tu peux laisser tes sondes connectées. Ta façon de les lire est bonne mais pourrait être optimisée. A voire plus tard.
Tu ne pourras jamais lire tes sondes toutes en même temps mais rapidement, oui.

Tu pourrais détailler, comment tu pourrais avoir le même résultat?

A+
Cordialement
jpbbricole

Je pense plutôt à un débutant qui ne maîtrise pas encore le fonctionnement du micropcontrôleur.

Le fichier final est un vrai fichier C++ que tu ne vois pas, mais c'est sans importance.

Tu vois deux fonctions qui ont des noms explicites.
setup() qui ne s'éxécute qu'une seule fois, c'est là où l'on place les initialisation du programme.
loop() qui est placée dans une boucle infinie. Boucle infinie signifie que dès que la fonction loop() est parcourue la boucle infinie fait retourner dans loop(), indéfiniment.
Cette boucle est obligatoire, sans elle le microcontrôleur de bloquerait.
Note : dans un ordinateur c'est le système d'exploitation qui rempli ce rôle.

Dans loop() les opérations s'effectuent séquenciellement les une après les autres a un rythme très rapide.

Delay()
Deux utilisatioons de cette fonction :
Cette fonction bloque le programme le temps du delais spécifié.

  1. Dans la programmation. Elle est à éviter, il est préférable d'utiliser millis() qui permet de faire plusieurs actions presque en multitâche.
  2. Avec des capteurs matériels. Elle est souvent incontournable quand le capteur a besoin d'un temps pour répondre. Mais c'est toujours des valeurs de délais très courts, souvent delayMicrosecond() est suffisant.

Il est possible d'écrire autant de fonctions que l'on veux qui peuvent être appellées de n'importe quelles autres fonction.

Au vu de la photo, vous utilisez un certain nombre de capteurs de gaz

comment vérifier la fiabilités des données?

Ces modules fonctionnent sous 5V et ont généralement une sortie analogique. Vous pouvez bâtir une formule (plus ou moins compliquée, sur la phase de linéarité ou pas...) qui vous permet de transformer la tension lue en une indication de la concentration (très approximative si vous n'avez pas fait une calibration en environnement contraint et ça dépend aussi de l'humidité et de la température).

Donc pour votre question, si vous voulez vérifier la fiabilité des données, il vous faut trouver un laboratoire de test capable de mettre le capteur en situation. Par exemple le MQ2 permet de détecter le GPL, le I-butane, le propane, le méthane, l'alcool, l'hydrogène etc (des vapeurs combustibles). Il faut pouvoir varier les concentrations, la température, l'humidité et regarder la réponse du capteur...

Bien sûr le fabriquant à fait des tests et vous donne des informations dans la datasheet, par exemple pour le MQ2:

D'un point de vue pratique, Il vous faut donc une entrée analogique par capteur, votre MEGA doit en avoir assez. Ensuite le code doit simplement passer en revue chaque capteur. ils ont chacun leurs spécificités en terme de courant consommé notamment pendant la phase de chauffe (800mW sous 5V pour un MQ2 par exemple donc attention où vous prenez la source de courant), calibration, temps de chauffe etc...