Serre à semis

Portrait de Labricole14

Bonjour,

J'ai commencé un programme pour piloter ma serre, qui actuellement fonctionne avec 2 thermostats électronique du type STC100.

Un thermostat commande le chauffage pour maintenir la température a 20° C.

L'autre me sert a piloter le vérin électrique qui ouvre la porte en grand quand T > 25°.

Ce vérin est équipé de 2 fins de courses qui coupe l'alimentation électrique dans les 2 positions extrêmes.

Et la referme quand T< --°

La carte "ARDUINO MEGA 2560" que je compte utiliser pour ouvrir la porte mais par palier.

Quand T > 25° C je donne un ordre ouverture pendant 5 secondes, je temporise 1 minutes pour laisser le temps à la température de se stabiliser et je reprend la boucle.

J'ai commencé ce code en utilisant mes recherche sur le Net.

//*****************************************************************************************************

#include <OneWire.h>    // Inclusion de la librairie OneWire

#define DS18B20 0x28    // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 2  // Broche utilisée pour le bus 1-Wire

#define relayChauffage 4    // Commande la résistance de chauffage
#define relayOuverture 5  // Commande ouverture de la porte
#define relayFermeture 6  // Commande la fermeture de la porte
#define relayPompe 7    // Démarre la pompe d'arrosage - Attente capteur humidité sol
#define relayBrumiseur 8  // Commande le brumisation piezzo pour l'engrais  - Attente Horloge
#define buzzerPin 9     // Le buzzer sur 9
#define relayEclairage 10 // Commande la lumière - Attente cordon leds

#define tempBasse 20.5    // temp déclenchement allumage
#define tempHaute 25.0    // temp déclenchement extinction
#define alerteBasse 18.0  // temp déclenchement alerte basse buzzer
//#define alerteHaute 30.0  // temp déclenchement ouverture porte en grand
#define alerteHaute 35.0  // temp déclenchement buzzer  

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

boolean etatChauffe;      // attention : boolean etatChauffe = false.
boolean etatOuverture;    // attention : boolean etatOuverture = false.
boolean etatFermeture;    // attention : boolean etatFermeture = false.
// ne provoque pas d'erreur
// mais ne fonctionne pas.

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }

  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return true;
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  pinMode (relayChauffage, OUTPUT);    // Sortie
  pinMode (relayOuverture, OUTPUT);
  pinMode (relayFermeture, OUTPUT);
  pinMode (relayPompe, OUTPUT);
  pinMode (relayBrumiseur, OUTPUT);
  pinMode (relayEclairage, OUTPUT);
  pinMode (buzzerPin, OUTPUT);

  digitalWrite (relayChauffage, LOW);  // On met tout OFF
  digitalWrite (relayOuverture, LOW);  // On met tout OFF
  digitalWrite (relayFermeture, LOW);  // On met tout OFF
  digitalWrite (relayPompe, LOW);    // On met tout OFF
  digitalWrite (relayBrumiseur, LOW);  // On met tout OFF
  digitalWrite (relayEclairage, LOW);  // On met tout OFF
  digitalWrite (buzzerPin, LOW);     // On met tout OFF

  etatChauffe = false;         // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
  etatOuverture = false;       // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
  etatFermeture = false;      // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
}

// loop()
void loop() {
  float temp;
  float sinVal;
  int toneVal;

  // Lit la température ambiante à ~1Hz
  if (getTemperature(&temp)) {

    // Affiche la température
    Serial.print("Temperature : ");
    Serial.print(temp);
    Serial.write(176); // caractère °
    Serial.write('C');
    Serial.println();
    delay(5000); // tempo: 5 secondes
 

    if ((temp > tempBasse) && (etatChauffe == false)) { //Température est supérieure à 20° & état de chauffe faux
      Serial.println();// saut 1 ligne
      Serial.println("Temperature > 20 , Chauffage a l'arret."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
      Serial.println();// saut 1 ligne
      digitalWrite(relayChauffage, HIGH); // Chauffage enclenché .
      etatChauffe = false;
    }
    if ((temp < tempBasse) && (etatChauffe == true)) { 
      Serial.println("Temperature < 20, Enclenchement du chauffage.");  // Temperature de maintient trop basse, Enclencement du chauffage.
      Serial.println();
      digitalWrite(relayChauffage, LOW); // Chauffage à l'arret.
      etatChauffe = true;
    }
    
    //****************************************************************//
    
 

    if (temp > tempHaute) {
      Serial.println(); 
      Serial.println("Temperature > 25, ouverture de la porte, pendant 5 secondes.");  // Message: Temperature supérieure à 25°C, ouverture de la porte.
      Serial.println();
      digitalWrite(relayOuverture, HIGH), delay (5000); // ouverture de la porte pendant 5 secondes .
      digitalWrite(relayOuverture, LOW);
      etatOuverture = false;
      Serial.println("Tempo 1 mn, Message: Attente stabilisation de la Temperature."); //Message: Attente stabilisation de la Temperature.
      Serial.println();// saut 1 ligne.
      
      delay(60000); // tempo 1 mn  pour que la température est le temps de changer.
    }
    if (temp < tempHaute) {
      Serial.println("Temperature < 25, fermeture de la porte."); // Message:Temperature inférieure à 25°C .
      Serial.println();
      digitalWrite(relayFermeture, HIGH); // Ferture de la porte.
      digitalWrite(relayFermeture,LOW);
      etatOuverture = false;
    }
    
    //**********************************************************************//
    
    // température anormale !
    if ((temp < alerteBasse) || (temp > alerteHaute)) {
      Serial.println("Temperature anormale !!!!!!!!"); // Message: Temperature anormale.
      Serial.println();
      for (int x=0; x<180; x++) {
      sinVal = (sin(x * (3.1412 / 180)));
      toneVal = 2000 + (int(sinVal * 1000));
      tone(buzzerPin, toneVal);
      delay(10);
    }
    noTone(buzzerPin);
  }
  else {
    noTone(buzzerPin);
  }
}
}

Portrait de Nathan Garnier

Bonjour,

J'ai pas trés bien compris ... vous voulez remplacer les capteurs STC100 par cela ds18b20 c'est sa ?

Si oui pourquoi vous metté un bout du code en dehors des voidSetup et voidLoop ?

Je suis curieux d'apprendre plus sur ce projet.

A bientot

Portrait de Labricole14

Bonjour,

Oui, je veux remplacer les thermostats par une régulation programmé sous ARDUINO

En utilisant comme capteur de température un DS18B20.

Je veux pouvoir réguler la température de la serre en ouvrant la porte par palier.

Je n'ai pas trouver comment insérer le code  entre les balises.

Cordialement,

Portrait de Nathan Garnier

J'ai trouvé sa , sa a l'air de s'implifier pas mal l'obtention de la température après il suffit de faire des if comme vous l'avez fait dans votre prgrm initial.

Portrait de Labricole14

Pour le problème ce trouve dans les if.

La température fonctionne bien.

C'est la gestion des if  avec les délais qui monopolise  l'ARDUINO

Je cherche comment passé outre.

De même la fermeture de la porte quand la température est inférieur à 25° ne fonctionne pas correctement.

Cordialement

Portrait de Nathan Garnier

Ah d'accord enfaite vous voulez que lorsque la porte s'ouvre durant les x secondes de l'ouverture l'arduino ne soit pas bloqué mais continue a regardé la temperature et si la temperature redescend sa referme la porte avant les x secondes c'est sa ?

Si oui la fonctions millis pourrait etre utile dans ce genre probleme

Portrait de Labricole14

Merci je vais explorer la fonction millis elle va me permettre d'avancer.

Je dois ajouter un module DS3231  pour déclencher mon brumisateur pour l'engrais.

Faut-il toujours utiliser la fonction millis ou il y a une autre fonction a utiliser dans la librairie du DS3231

Merci pour tes réponses

Cordialement,

Portrait de Nathan Garnier

Avec grand plaisir

Vous utilisez quel librairie pour ce module DS3231?

Et pour la fonction millis elle est très simple le seul problème c'est le faite qu'au bout d'environ 70 jours le compteur reviens a 0 donc sa peut créé un petit bug (un reset de la carte tt les 30jours permet d'éviter sa)

Portrait de Labricole14

Bonjour,

Je regarde la fonction millis et ne trouve pas que c'est si simple pour un débutant.

Je pense utiliser la librarie RTC pour mon DS3231, mais vous avez peut-être une autre librairie a me proposer?

Et je n'ai pas compris quand il faut utiliser delay plustôt que millis.

Cordialement,

Portrait de Nathan Garnier

Vous aurez le lien de cette librairie ? (Moi j'utilise le DS1307 comme module RTC).

Pour millis sa rajoute 2 variables dans le code :

-previousMillis (unsigned-long)

-delai = 10000 (juste pour l'exemple)(un int standard)

-currentMillis (unsigned long)

Et on joue avec cette fonction je m'explique :

D'abord on fais :

currentMillis = millis()

Puis pour voir si les 10 secondes ce sont écoulés :

If ( currentMillis - previousMillis >= delai){

previousMillis = currentMillis; //remet a zero le "compteur"

//On fait ce qu'on a a faire

}

Ce petit bout de code va donc activée l'intérieur du If une fois tt les 10secondes

Pour votre utilisation il faut donc faire pareil mais rajouter un If qui vient vérifiée la température et si la température redescend avant vos x secondes ce ne sera pas le If de "temps" qui s'activera mais le If de "température"

Je sais pas si j'ai été clair dans mes explications ...

Portrait de Labricole14

Bonsoir,

Je vais faire des essais et je reviens vers vous si besoin.

Merci pour votre aide

Cordialement;

Portrait de brossden

Bonjour

Pour palier le problème des Delay(x)  dans les if qui "bloquent" le programme à un endroit déterminé, je te propose de mettre une tempo de 1 seconde à la fin de la boucle et à chaque fois que tu veux une tempo en court de route mets un compteur et lorsque ton compteur arrive à la valeur voulue tu déclenches l'action de ton choix cela ne pénalisera pas tes autres tempos, qui continueront à s'incrémenter ou pas selon ton désir.

Principe ;

Int Tempo1 = 0;
Int Tempo2 = 0;

void setup() {
  // Mets ici les paramètres de ton choix
}

void loop() {
  If (acquisition1 = 1) ; //acquisition1 represente le déclenchement d'une tempo avant action1

  { Tempo1 = Tempo1 + 1;
    If (Tempo1 >= Valeur_de_tempo1)
    {
      action1 = 1
    }
  }
  If (action1 = 1)
  { Tempo2 = Tempo2 + 2;
    If (Tempo2 >= Valeur_de_tempo2)
    {
      action2 = 1;
    }

    If (action2 = 1)
    { Tempo2 = Tempo2 + 2;
      If (Tempo2 >= Valeur_de_tempo2)
      {
        action2 = 1;
      }
    }
    //etc...

  Delay(1000);
  }

Ceci est un principe pas un programme !

Portrait de Labricole14

Bonjour,

J'ai repris mon programme, mais je n'ai sûrement pas tout compris car la tempo d'une minute ne s'enclenche pas.

/*  le 17/02/2017 code extrait du Net
    Ancienne armoire réfrigérée vitrée 4 faces transformée en serre à semis
    Ouverture de la porte par un actionneur linéaire 24v= qui est équipé de 2 fins de course d'origine et interne
    carte Agrduino MEGA 2560
    DS3231 horloge pour gérer le temps
    DS18B20 sonde température
    Module relais pour toute commande tout ou rien
    Un fin de course sur la porte pour savoir quand elle est fermée.
    Il coupera la commande de fermeture et autorisera la mise en service du chauffage
*/

//*****************************************************************************************************

#include <OneWire.h>    // Inclusion de la librairie OneWire

#define DS18B20 0x28    // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 2  // Broche utilisée pour le bus 1-Wire
#define fdcPorte 3        // Fin de course porte fermée
#define relayChauffage 4    // Commande la résistance de chauffage
#define relayOuverture 5  // Commande ouverture de la porte
#define relayFermeture 6  // Commande la fermeture de la porte
#define relayPompe 7    // Démarre la pompe d'arrosage - Attente capteur humidité sol
#define relayBrumisateur 8  // Commande le brumisation piezzo pour l'engrais  - Attente Horloge
#define buzzerPin 9     // Le buzzer sur 9
#define relayEclairage 10 // Commande la lumière - Attente cordon leds

#define alerteBasse 18.0  // temp déclenchement alerte basse buzzer
#define tempBasse 20.5    // temp déclenchement allumage
#define tempHaute 25.0    // temp déclenchement extinction
#define tempTresHaute 30.0  // temp déclenchement extracteur d'air
#define alerteHaute 35.0  // temp déclenchement buzzer  

OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds

const long Time_1 = 1000; //1 secondes
const long Time_2 = 5000; //5 secondes
const long Time_3 = 10000; //10 secondes
const long Time_4 = 32000; //32 secondes
const long Time_5 = 60000; //1 minute

boolean etatChauffe;      // attention : boolean etatChauffe = false.
boolean etatOuverture;    // attention : boolean etatOuverture = false.
boolean etatFermeture;    // attention : boolean etatFermeture = false.

unsigned long previousMillis_1 = 0;        //
unsigned long previousMillis_2 = 0;
unsigned long previousMillis_3 = 0;        // 
unsigned long previousMillis_4 = 0;
unsigned long previousMillis_5 = 0;

// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp) {
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }

  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20

  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus

  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;

  // Pas d'erreur
  return true;
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  
  pinMode (relayChauffage, OUTPUT);    // Initialisé en sortie
  pinMode (relayOuverture, OUTPUT);
  pinMode (relayFermeture, OUTPUT);
  pinMode (relayPompe, OUTPUT);
  pinMode (relayBrumisateur, OUTPUT);
  pinMode (relayEclairage, OUTPUT);
  pinMode (buzzerPin, OUTPUT);

  digitalWrite (relayChauffage, LOW);  // On met tout OFF
  digitalWrite (relayOuverture, LOW);  // On met tout OFF
  digitalWrite (relayFermeture, LOW);  // On met tout OFF
  digitalWrite (relayPompe, LOW);    // On met tout OFF
  digitalWrite (relayBrumisateur, LOW);  // On met tout OFF
  digitalWrite (relayEclairage, LOW);  // On met tout OFF
  digitalWrite (buzzerPin, LOW);     // On met tout OFF

  etatChauffe = false;         // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
  etatOuverture = false;       // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
  etatFermeture = false;      // la condition d’exécution fausse, L’exécution en boucle se terminera et ne reprendra que lorsque la condition redeviendra vraie.
}

// loop()
void loop() {
   unsigned long currentMillis = millis();
  float temp;
  float sinVal;
  int toneVal;

  // Lit la température ambiante à ~1Hz
  if (getTemperature(&temp)) {

    // Affiche la température
    Serial.print("Temperature : ");
    Serial.print(temp);
    Serial.write(176); // caractère °
    Serial.write('C');
    Serial.println();
    //if ((millis() - temps) > 5000)
     //delayMicroseconds(500000); // tempo: 5 secondes

    //********************        Chauffage         ******************//
      if ((temp > tempBasse) && (etatChauffe == false)) { //Température est supérieure à 20° & état de chauffe faux
        Serial.println();// saut 1 ligne
        Serial.println("Temperature > 20 , Chauffage a l'arret."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
        Serial.println();// saut 1 ligne
        digitalWrite(relayChauffage, HIGH); // Chauffage enclenché .
        etatChauffe = false;
      }
    if ((temp < tempBasse) && (etatChauffe == true)) {
      Serial.println("Temperature < 20, Enclenchement du chauffage.");  // Temperature de maintient trop basse, Enclencement du chauffage.
      Serial.println();
      digitalWrite(relayChauffage, LOW); // Chauffage à l'arret.
      etatChauffe = true;
    }

    //**********************  Régulation température      ******************************************//

    if (temp > tempHaute) {
      Serial.println();
      Serial.println("Temperature > 25, ouverture de la porte, pendant 5 secondes.");  // Message: Temperature supérieure à 25°C, ouverture de la porte.
      Serial.println();
      
      digitalWrite(relayOuverture, HIGH);//, delay (5000); // ouverture de la porte pendant 5 secondes .
      if (currentMillis - previousMillis_2 >= Time_2)
      {
       previousMillis_2 = currentMillis;
 
      {
        digitalWrite(relayOuverture, LOW);
        etatOuverture = false;
        Serial.println("Tempo 1 mn, Message: Attente stabilisation de la Temperature."); //Message: Attente stabilisation de la Temperature.
        Serial.println();// saut 1 ligne.
        
        if (currentMillis - previousMillis_5 >= Time_5) {
       previousMillis_5 = currentMillis;
        {
          //delay(60000); // tempo 1 mn  pour que la température est le temps de changer.
        }
        if (temp < tempHaute) {
          Serial.println("Temperature < 25, fermeture de la porte."); // Message:Temperature inférieure à 25°C .
          Serial.println();
          digitalWrite(relayFermeture, HIGH); // Fermeture de la porte.
          if (currentMillis - previousMillis_4 >= Time_4) {
       previousMillis_4 = currentMillis;
          digitalWrite(relayFermeture, LOW);
          etatOuverture = false;
        }

        //**********************************************************************//

        // température anormale !
        if ((temp < alerteBasse) || (temp > alerteHaute)) {
          Serial.println("Temperature anormale !!!!!!!!"); // Message: Temperature anormale.
          Serial.println();
          for (int x = 0; x < 180; x++) {
            sinVal = (sin(x * (3.1412 / 180)));
            toneVal = 2000 + (int(sinVal * 1000));
            tone(buzzerPin, toneVal);
            delay(10);
          }
          noTone(buzzerPin);
        }
        else {
          noTone(buzzerPin);
        }
      }
    }
  }
}
}
}
}

Je ne trouve pas ou j'ai fais une erreur.

Mais je n'ai d'erreur en compilant le code.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Je ne comprend pas bien ce bout j'ai l'impression qu'il ya une erreur...

//********************        Chauffage         ******************//
      if ((temp > tempBasse) && (etatChauffe == false)) { //Température est supérieure à 20° & état de chauffe faux
        Serial.println();// saut 1 ligne
        Serial.println("Temperature > 20 , Chauffage a l'arret."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
        Serial.println();// saut 1 ligne
        digitalWrite(relayChauffage, HIGH); // Chauffage enclenché .
        etatChauffe = false;
      }
    if ((temp < tempBasse) && (etatChauffe == true)) {
      Serial.println("Temperature < 20, Enclenchement du chauffage.");  // Temperature de maintient trop basse, Enclencement du chauffage.
      Serial.println();
      digitalWrite(relayChauffage, LOW); // Chauffage à l'arret.
      etatChauffe = true;
    }

Et pour millis sa ne sert a rien de creer autant de variable previous_millis juste 1 suffit pour tt le code

Portrait de Labricole14

Bonsoir,

 //********************        Chauffage         ******************//
      if ((temp > tempBasse) && (etatChauffe == false)) { //Température est supérieure à 20° & état de chauffe faux
        Serial.println();// saut 1 ligne
        Serial.println("Temperature > 20 , Chauffage a l'arret."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
        Serial.println();// saut 1 ligne
        digitalWrite(relayChauffage, LOW); // Chauffage déclenché .
        etatChauffe = false;
      }
    if ((temp < tempBasse) && (etatChauffe == true)) {
      Serial.println("Temperature < 20, Enclenchement du chauffage.");  // Temperature de maintient trop basse, Enclencement du chauffage.
      Serial.println();
      digitalWrite(relayChauffage, HIGH); // Chauffage à l'arret.
      etatChauffe = true;

C'est mieux comme ça?

Cordialement.

Portrait de Nathan Garnier

Je pense que oui mais il faut aussi inverse l'etat de chauffe dans les if car si la temperature est plus haute on doit eteindre le chauffage que si il est allumé (premier If) et inversement pour le deuxieme if

Vous me permettez d'éditer le programme chez moi pour commenter directement le code ?

Portrait de Labricole14

Bonjour,

Il n'y a pas de problème, ce code est libre d'accès.

Si vous pouvez m'aider a résoudre les problèmes c'est super car je vais devoir commencer mes semis.

Cordialement.

Portrait de Nathan Garnier

Pourriez-vous m'envoyer les liens de vos librairies one wire et pour votre module RTC ?

Portrait de Labricole14

Bonsoir,

Voici les liens

https://github.com/rodan/ds3231  One wire

https://github.com/rodan/ds3231  RTC

Merci pour votre aide

Cordialement;

Portrait de Nathan Garnier

Bonsoir,

il ne manque pas la librairie One Wire ? 

Je voudrai juste le compiler afin de vous donner un code sans erreur c'est mieux quand même

Desolé du derangement... 

Portrait de Nathan Garnier

Bon impossible de compiler le programme en le copiant pouvez vous envoyer le .ino directement ?

Portrait de Labricole14

Bonjour, je vous joints le fichier.

Merci de votre aide.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Merci beaucoup je fais sa aujourd'hui sa tombe bien j'ai TPE :)

Portrait de Nathan Garnier

Bonjour, voici le code edité je n'ai rien changé mis a part l'organisation des boucles et les If d'attente j'espere qu'il fonctionnera