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 vous avez donc deux capteurs de temperature ou juste un seul ?

Pour pouvoir reguler la temperature de facon correct il faudrai un capteur de temperature exterieure afin que si l'air exterieure est trop froid l'on utilise une regulation par chauffage et non une ouverture de porte.

Portrait de Labricole14

Bonsoir,

Actuellement j'ai 2 thermostats STC100 1 pour le chauffage et 1 pour la commande ouverture fermeture de ma porte.

Mais avec le thermostat la porte s'ouvre en grand  et se referme quand la température chute 

Cordialement.

Portrait de Nathan Garnier

d'accord sinon savez vous combien il faut de temps pour une ouverture complete de la porte ?

Portrait de Labricole14

Ouverture de la porte en 32s secondes.

C'est pour cela que j'ai prévu des ouvertures de 5 secondes 

Cordialement

Portrait de Nathan Garnier

d'accord donc maximum 6 cycle d'ouverture merci

Portrait de Labricole14

Oui 6 cycles c'est correct, vue que le vérin est équipé de fins de courses.

Cordialement

Portrait de Nathan Garnier

d'accord genial je fais une chose aux petits onion alors (si vous voulez je peut juste vous montrez le modele comme sa c'est vous qui programmer ; ) ce sera plus instructif que si c'est moi qui le fait...

Portrait de Labricole14

Ok vous voulez créer un compteur de cycle?

Je suis partant pour toute solutions je suis là pour apprendre même à mon age!!!

Cordialement

Portrait de Nathan Garnier

Vous allez voir... j'ai bientot fini d'ici 10 minute c'est bon

Portrait de Nathan Garnier

voila :

/* 
 Regulation de la temperature
 
*/ 

//variable ajouté :
int alldelay = 0;

 if(temp > tempHaute){  //si la temperature est superieur a 25°C :
        Serial.println();// saut 1 ligne
        Serial.println("Temperature > 25 , Ouverture porte."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
        Serial.println();// saut 1 ligne
      while ( temp >= tempHaute && alldelay < 30 ){// puis tant que la temperature n'est pas redescendu on ouvre la porte un peu plus (max 6 cycle)
        Serial.print("temp :");//affichage de la temperature parceque c mieux quand meme
        Serial.println(temp);
        etatOuverture == true; //securité pour la fermeture
        alldelay + 5;//permet de compter le nombre de cycle et en plus le temps de fermeture quand l'on voudra fermer
        digitalWrite(relayFermeture,LOW);//pour la securité
        delay(100);// temps pour que le relay contacte correctement
        digitalWrite(relayOuverture, HIGH);
        delay(5000);//5 sec d'ouverture
        digitalWrite(relayOuverture,LOW);
        delay(1000);//attete pour capter nouvelle temperature
      }
     }
    
    if(temp < tempHaute && etatOuverture == true){
      Serial.println();// saut 1 ligne
      Serial.println("Temperature < 25 , fermeture porte."); //Message: Temperature de maintien au maxi, coupure du Chauffage.
      Serial.println();// saut 1 ligne
      digitalWrite(relayOuverture,LOW);//pour la securité
      delay(100);// temps pour que le relay contacte correctement
      digitalWrite(relayFermeture, HIGH);
      delay(alldelay);//temps pour la fermeture complete
      digitalWrite(relayFermeture,LOW);
      etatOuverture = false;
      alldelay = 0;//raz des delay d'ouverture 
    } 

Portrait de Labricole14

Si je comprends bien vous créez une nouvelle variable pour stocker les délais.

Vous partez à 0 et a chaque cycle d'ouverture vous incrémentez  de+5.

Si bien qu'au bout de 6 cycles nous avons 30 et c'est la fin de l'ouverture.

Et en fin de fermeture on remet la variable Alldelay à 0 pour pouvoir recommencer un cycle.

Je modifie mon code et je vous tiens au courant du résultat.

Encore merci pour le temps que vous me consacrez.

Cordialement.

Portrait de Nathan Garnier

Oui c'est exactement sa

Et avec grand plaisir

Portrait de Labricole14

Bonjour,

Il y a encore des problèmes:

Alldelay ne s'incrémente pas.

 alldelay +5 ;  //permet de compter le nombre de cycle et en plus le temps de fermeture quand l'on voudra fermer

Si je mets alldelay ++ j'ai une incrémentation de 1 avec +5 alldelay reste à zéro.

J'ai ajouter: Serial.println(alldelay); // pour contrôler l'incrémentation de la variable.

De plus la tempèrature variable temp n'est pas mise à jour elle garde la valeur qu'elle a quand on entre dans la boucle.

Et je n'ai jamais la fermeture de la porte.

Cordialement.

Je vous joint mon fichier modifié et le contenu du moniteur série.

Cordialement

Portrait de Labricole14

J'ai trouver pour l'incrémentation:

alldelay = alldelay+5 ;//permet de compter le nombre de cycle.

Temperature : 21.87°C
Temperature : 21.94°C
Temperature : 21.94°C
Temperature : 21.94°C
Temperature : 21.94°C
Temperature : 22.69°C
Temperature : 23.62°C
Temperature : 24.50°C
Temperature : 25.31°C

Temperature > 25 , Ouverture porte.

temp :25.31
5
temp :25.31
10
temp :25.31
15
temp :25.31
20
temp :25.31
25
temp :25.31
30
Temperature : 28.37°C

Temperature > 25 , Ouverture porte.

Temperature : 28.37°C

Temperature > 25 , Ouverture porte.

Temperature : 28.31°C

Il faut que je trouve comment raffraichir la variable temp si non la porte s'ouvre en grand et tout nos efforts ne servent à rien.

Et écrire porte ouverte en grand en fin de boucle d'ouverture.

@+

Portrait de Nathan Garnier

Bonjour

Ah oui mince désolé pour l'incrementation en 5, petite lacune :/

Et pour rafraichir la température il faudrait créé une fonction température (un void temp par exemple) que l'on appelerait a chaque fois que l'on veut la température ou si une fonction de la librairie permet de lire directement la température il faudrait la mettre à l'intérieur du while()

Portrait de Nathan Garnier

Ah quoi sert la fonction getTemperature(&temp)?

Portrait de Labricole14

Bonsoir j'ai modifié encore un peu.

Je vous joint les fichiers code & série.

La fermeture de la porte ne fonctionne car je ne comprends pas pourquoi "etatOuverture" est à 0 donc faux alors qu'il devrait être à 1.

Je pense que c'est ce qui empêche la fermeture de la porte..

Cordialement.

Portrait de Nathan Garnier

Alors pour eviter la repetition des message d'ouverture il faudrait mettre la ligne a l'interieur de la boucle While comme sa quand sa ouvre sa affiche et si sa n'ouvre pas sa n'affiche pas

Ah ben oui pour l'etatOuverture c'est == alors que pour attribuer une valeur c'est juste un seul =.

Bon on va y arriver cette fois

Portrait de Nathan Garnier

Quelque correction mineur comme le ==

Portrait de Labricole14

Bonjour,

Je pense que pour la régulation de température c'est bon.

Je vais écrire le code pour les autres fonctions et je reviens vers vous.

Bonne fin de semaine.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Ah enfin :D

Bonne fin de semaine a vous aussi et a bientôt

Portrait de Labricole14

Bonjour,

J'ai ajouté la commande de mon extracteur d'air qui ce met en fonction quand la température dépasse 30°.

Et doit s'arrêter quand quand la température descend à 28°.

Et ne fonctionne que porte ouverte!!!

L'extrateur démarre bien mais ne s'arrête pas.

Voici le bout de code:

 // Température non stabilisé mise en fonction extracteur d'air

          if (temp > tempExtracON && etatOuverture == true) { // Température sup à 30°
            Serial.println();// saut 1 ligne
            Serial.println("Temperature > 30 Extracteur ON."); //Message: Extracteur ON.
            Serial.println();// saut 1 ligne
            digitalWrite(relayExtrac, HIGH);  // Extracteur ON
          }
          if (temp < tempExtracOFF && etatOuverture == true) { // Température inf à 28°
            Serial.println();// saut 1 ligne
            Serial.println("Temperature < 28 Extracteur OFF."); //Message: Extracteur OFF.
            Serial.println();// saut 1 ligne
            digitalWrite(relayExtrac, LOW); // Extracteur OFF

Je ne vois pas ou est l'erreur!!!!

Je n'ai pas d'erreur quand je compile le code.

Cordialement.

Portrait de Nathan Garnier

Bonjour, 

Pouvez vous envoyer le code? Comme sa sa me permet de regarder directement dans l'ide

Merci d'avance

Portrait de Labricole14

Voici le code

Cordialement

Portrait de Nathan Garnier

Bonsoir, desolé pour l'attente j'ai été occupé tout le week-end.

Pour le code j'ai juste sortie les boucles d'activation et descativation de l'aspiration de la boucle tempHaute.

Portrait de Labricole14

Bonjour,

J'ai testé il fonctionne,

J'ai ajouté un compteur pour n'avoir qu'une seule fois l'affichage dans le moniteur série: extracteur ON & OFF

Je me penche sur le module DS3231 pour enclencher le brumisateur ou la pompe d'arrosage.

J'ai a afficher l'heure et le jour mais je n'ai pas compris comment on active l'alarme pour par exemple arroser à 8h00 puis 12h00 par exemple.

"alarme" c'est bien cette fonction qu'il faut utiliser.

Je pense que pour la durée d'arrosage il faut utiliser "delay"

Si vous avez un exemple commenté de cette fonction je suis preneur pour essayer de comprendre.

Je n'ai pas encore intégré le module temps je fais des essais sur des fichier séparés.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Je n'ai pas non plus compris le fonctionnement de cette librairie ...et pour la durée d'arrosage tout depend combien de temps vous voulez arroser si ce n'est que 10seconde sa 'e devrai pas poser grand problème

Portrait de Nathan Garnier

J'ai trouvé cette librairie qui a l'air bien plus simple...

Portrait de Labricole14

Bonsoir,

J'ai modifié du code pour la commande de la pompe d'arrosage en utilisant un module DS3231.

Il y a un problème dans mon code et je ne vois pas ou.

Mon relais est ON alors qu'il devrait être OFF

"digitalWrite(relayPompe, LOW); //On met tout OFF"

Je ne vois pas ou ce trouve l'erreur.

Pour avoir plusieurs période d'arrosage je multiplie le code pour chaque période ou j'incrémente  du type:

int heure = 0 puis

int heure = heure + 4. => heure devient 4 - 8 - 12 - 16 - 20 et remettre à 0

Merci de votre aide.

Cordialement.

Portrait de Nathan Garnier

Bonjour,

Chez moi avec mon module RTC cela fonctionne avec ce code (je l'ai inclus dans votre code a vous).

Portrait de Labricole14

Bonjour,

Chez moi je suis obligé de mettre:
"  digitalWrite(relayPompe, 1)" pour que mon relais soit OFF

Je ne comprend pas.

OK pour le changement d'heures auto merci.

Je vais essayé d'intégrer ce code dans le code de la serre.

A bientôt.

Cordialement.

Portrait de Nathan Garnier

Ah d'accord enfaite votre relai est inversé il suffit de brancher votre pompe sur l'autre broche de votre relai

Portrait de Labricole14

Arduino : 1.8.0 (Windows 10), Carte : "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Serre_version_08_e:174: error: expected unqualified-id before 'if'

 if (getTemperature(&temp)) {

 ^

exit status 1
expected unqualified-id before 'if'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

 Je ne comprend pas pourquoi

Merci de votre aide.

Cordialement.

Portrait de Nathan Garnier

C'est juste parce que vous n'avez pas enlever le } qui ferme la void loop() après le delay 1000 de la lecture du RTC

Portrait de Labricole14

Plus compliqué que ça.

Maintenant :

Arduino : 1.8.0 (Windows 10), Carte : "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

C:\Users\Benoit\Downloads\DS3231_pompe_arrosage_c\DS3231_pompe_arrosage_c.ino: In function 'void loop()':

DS3231_pompe_arrosage_c:57: error: 'show_time_and_date' was not declared in this scope

   show_time_and_date(now);  // Datum und Uhrzeit ausgeben

                         ^

DS3231_pompe_arrosage_c:63: error: a function-definition is not allowed here before '{' token

   String get_day_of_week(uint8_t dow) {

                                       ^

DS3231_pompe_arrosage_c:102: error: expected '}' at end of input

   }

   ^

exit status 1
'show_time_and_date' was not declared in this scope

 L'assemblage de 2 codes différents n'as pas l'air aussi simple.

@+

Portrait de Labricole14

Bonjour,

J'avance doucement:

J'ai ajouté: #define show_time_and_date().

Maintenant l'erreur est:

macro "show_time_and_date" passed 1 arguments, but takes just 0

Je continue mes recherches.

Si vous avez des tuyaux!!

Merci.

Cordialement.

 

Portrait de Nathan Garnier

Bonsoir,

Après avoir relu le code, j'ai compris les problèmes que vous obtenez, les accolade ne sont pas a la bonne place et surtout il ne sont pas bien placé.

Portrait de Nathan Garnier

Je vous corrige cela et je vous envoie le fichier

Portrait de Nathan Garnier

Bonsoir, me revoila alors par quoi commencer ...

Le probleme avec votre horloge RTC c'est que si un delay est actif durant l'heure d'arrosage alors l'arrosage ne s'effetuera pas. Il y a deux solutions a ce probleme une tres simple et une plus complexe et surtout peut etre imossible :

Utiliser une autre arduino pour gerer l'heure et l'arrosage

Ou si votre module possede une broche d'alarme programmable alors il faut parametrer cette broche et creer une interruptions dans le programme pour lancer l'arrosage (ce n'est pas une tres bonne option car l'on ne gere plus la temperature...)

Moi j'utiliserais une autre arduino pour gerer l'arrosage par soucis de simplicité et donc pas desoin de refaire un programme juste utilisé le precedent.

Tenez-moi au courant.

A bientôt

Portrait de Labricole14

Bonjour,

OK, je n'insiste pas, je vais installer un ARDUINO avec le code pour la régulation de température et mettre une prise programmable pour l'arrosage.

Est-il possible en utilisant l'horloge RTC au lieu de "delay" de faire cohabiter les 2 codes?

Merci pour votre aide si précieuse.

Cordialement.

Portrait de Nathan Garnier

Remplacer les delay par la RTC doit être possible mais je ne vois pas en quoi se serai mieux autant faire une interruption comme décrite au dessus et comme sa lorsque la broche d'alarme change d'état on active la pompe puis on defini une nouvelle heure d'alarme au module et on reviens au programme principal.
Voilà...

Portrait de Labricole14

C'est quoi une interruption?  une pause.

Le temps d'arrosage  de mes barquettes de semis ne devrait pas être supérieur à 30 s voir 1 mn maxi.

Je ne pense pas que la régulation de température va être trop perturbée.

Cordialement.

Portrait de Nathan Garnier

Allez voir par ici c'est une fonction assez utile comme pour ici par exemple si votre module DS3231 possede une broche d'alarme programmable alors l'utilisation de l'interruption peut permettre de tout concentre dans une seule arduino.

Portrait de Labricole14

Bonjour,

Je pense que le code devient trop complexe pour moi je suis un débutant!!!!

J'ai bien la doc du DS3231 mais après mettre en oeuvre une interruption c'est une autre affaire.

Bonne journée

Cordialement.

Portrait de Labricole14

Bonsoir,

J'ai trouvé https://www.youtube.com/watch?v=eny5Q0f-kYw sur le Net.

C'est ce type de commande que vous me conseillé?

L'interruption il faut la faire sur la régulation de température?

Merci de votre réponse.

Cordialement.

Portrait de Nathan Garnier

Oui c'est sa il suffit de bien definir la fonction interrupt et lorsque la broche INT/SQW du module RTC passe a LOW (FALLING dans notre cas) l'interruption s'effectue quoi que le programme fasse.

pour cela il faut crée une nouvelle fonction void par exemple void arrosage qui sera appeler seulement lors d'une interruption.

voir ici pour les interruptions

Portrait de Labricole14

Ok je regarde et je reviens vers vous .

Bonne soirée.

Portrait de Labricole14

Bonjour,

Pour intégrer l'interruption il faut que je démarre avec un code sans erreurs, hors pour l'instant il me reste une erreur ligne 282.

Je ne vois pas ou elle est.

Merci de votre aide

Cordialement.

Portrait de Nathan Garnier

Bonsoir, sans vouloir être méchant vous avez quelques problèmes avec les accolades :) vous ne les placez pas au bonne endroit ou vous en oublier quelques unes mais bon c'est pas bien grave ...

Je vous le corrige si vous voulez et pour l'interruption surtout n'hésitez pas a demander ;)

Portrait de Nathan Garnier

Eh hop voici le programme sans erreur et l'interruption a compléter (en bas)

Pages