Vérifier plusieurs conditions

Bonjour,
J’aurais besoin d’un programme qui puisse vérifier plusieurs conditions simultanément mais je ne sais pas comment faire, je m’explique :
En fait il faudrait que mon programme puisse par exemple vérifier la température amblent et vérifier qu’il n’y a pas d’obstacles (tout cela avec des capteurs évidement).
Au début j’ai essayé d’utiliser des while avec par exemple while température normale ne rien faire
Et dès qu’elle trop haute activer le ventilateur
Seulement le probleme c’est que ici pendant que le programme exécuté lesbien instructions pour refroidir, il ne vérifie plus les capteurs (car il est dans la boucle while)
Du coup comment faire ?
Ne peut on pas faire de multiple sous programmes ?
Merci

Il faut donc utiliser des if :

  • Si la température est trop élevée, allumer le ventilateur, sinon l'éteindre
  • S'il y a un obstacle, agir, sinon autre action
    La loop s'exécute en boucle, donc à chaque fois qu'elle s'exécute, tu refais les mêmes tests. Et tu lances les actions correspondantes.
    Si ton code n'est pas bloquant, c'est à dire sans delay, ça ira très vite et tu liras tes capteurs suffisamment vite pour que les actions soient "temps réel".

Justement le problème c’est qu’il y a parfois des délais...
J’ai entendu parler débat la fonction millis() pour remplacer les delay, mais je n’ai pas exactement compris son fonctionnement

Pour remplacer les delay par millis, tu crées une sorte de chronomètre. Tu inities le chronomètre, en fait une variable de type unsigned long, avec la valeur de millis ()

Puis tu testes si la différence entre le chronomètre et millis () dépasse l’intervalle que tu veux

if (millis() - chrono >= intervalle) {
 chrono = millis() ;
 action () ;
}

Ces lignes peuvent être au début d’une fonction appelée par la loop. Dans ce cas tu changeras le sens du test pour sortir de la fonction si l’intervalle n’est pas écoulé

if (millis() - chrono < intervalle) return ;
 chrono = millis() ;
 action () ;

chrono doit être une variable globale, ce sera plus simple.

Du coup ta loop devient juste une succession d’appels de fonctions qui vont s’occuper chacune d’un capteur ou d’un actionneur.

fonction millis() pour remplacer les delay, mais je n'ai pas exactement compris son fonctionnement

Les microcontrôleurs utilisent un oscillateur local : l'horloge, pour cadencer les opérations.
Dans un microcontrôleur il y a des compteurs de cycles horloge : les Timers.

Par exemple le micro de la UNO à 3 timers, les fonctions arduino utilisent le premier, le timer 0, pour la gestion du temps. Une fonction arduino compte les millisecondes --> millis(), une autre les microsecondes. D'autres fonctions utilisent les timers pour faire de la PWM par exemple.

Quand tu veux qu'un certain temps s'écoule entre deux opérations il faut lire la valeur actuelle de millis() et comparer à la lecture précédente pour voir si suffisamment de millisecondes se sont écoulées.

On a déja du te dire et tu as du lire plusieurs fois qu'il faut s'inspirer de l'exemple blink_without_delay

// Note : Pour stocker la valeur de millis il faut un long integer
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change: Déclaration constante pour optimiser l'ocupation mémoire
const long interval = 1000;           // interval at which to blink (milliseconds)

previousMillis est la lecture précédent
interval = 1000 est le nombre de millisecondes qu'il doit s'écouler entre deux actions : soit 1 seconde.

void loop() {
  unsigned long currentMillis = millis();  // Déclaration de la variable pour stocker la valeur actuelle

  if (currentMillis - previousMillis >= interval) {
    // Le test en bon
    previousMillis = currentMillis;
etc
etc

currentMillis est la lecture actuelle de millis,
Dans le if on teste si l'écart entre la lecture actuelle et la lecture précédente est bien supérieur à l’intervalle que l'on s'est fixé.
Si c'est vrai , pour préparer le tour de loop() suivant, la valeur de la lecture actuelle devient la lecture précédente et on fait l'action qu'on s'est fixé.
Si c'est faux on ne fait rien et on passe aux autres actions définies dans la fonction loop().

Cela fonctionne car comme te l'a écrit Lesept la fonction loop() s'éxécute :

  • en boucle --> ce qui veut dire que dès qu'on arrive à la fin on en sort mais on y rentre instantanément.
  • elle s’exécute rapidement

Il faut que tu remplaces chaque delay() par :
une lecture de millis()
une condition if qui compare la lecture actuelle de millis à la lecture précédente

Très bien je vous remercie pour votre aide !!