PB Thermostat Arduino

Bonjour a tous.
Je viens de réaliser un projet Arduino sur la base du projet qu'a réalisé PlaisirArduino (lien de son site Web : Thermostat créé avec un LCD et Arduino. - PlaisirArduino ).
.
Ce projet est un thermostat d'ambiance (destiné a une serre de jardin pour ma part) le problème est que j'ai voulu utiliser un arduino Nano à la place du Uno qu'il utilisait. Je ne sais pas si le problème vient de la mais au bout de quelques dizaines de minutes mon Ecran LCD 16x2 se met à déconner. En effet, il m'affiche des caractères totalement inconnus et les menus ne sont plus accéssibles. Peut-être je tire trop d'intensité sur l'arduino avec mon relais ? qui est un simple relais 5V DC trouvé dans un tiroir pouvant commuter jusqu'à 3 A en 230 V.

Je vous met des photos en pièces jointe.
J'utilise une alimentation 5 V sur secteur qui est branchée sur la broche VIN et GND de l'arduino.
L'écran est branché sur un répartiteur de la broche GND et 5 V de l'arduino.

Voici le code :


//***** Mise en place des déclarations *****//
//***** Bibliothèques. *****//
#include <LiquidCrystal.h> //Gestion de l'afficheur LCD
#include "OneWire.h"
#include "DallasTemperature.h"
 
OneWire oneWire(A0);
DallasTemperature ds(&oneWire);

//***** Déclaration des variables. *****//
//BROCHES D'EXPLOITATION LCD.
#define RS 12 //Broche de synchronisation LCD.
#define E  11 //Broche d'activation de transmission données LCD.
#define D4 5  //Broche de donnée LCD.
#define D5 4  //Broche de donnée LCD.
#define D6 3  //Broche de donnée LCD.
#define D7 2  //Broche de donnée LCD.

//***** BOUTONS POUSSOIR. *****//

//BROCHES D'ENTREE BOUTONS.
#define ENTREE 6 //Broche Bouton.
#define HAUT 7   //Broche Bouton.
#define BAS 8    //Broche Bouton.

//ENTREE.
byte etat_bouton_entree = 0;  //État actuel du bouton.
byte precd_entree = 0;        //État précédent bouton.
//PLUS.
byte etat_bouton_plus = 0;  //État actuel du bouton.
byte precd_plus = 0;        //État précédent bouton.
//MOINS.
byte etat_bouton_moins = 0;  //État actuel du bouton.
byte precd_moins = 1;        //État précédent bouton.

//GENERAL BOUTONS.
int incremente = 0;   //Incrémentation de la saisi.
byte ret_boutons = 0; //Retour d'état bouton.

//***** VOYANT LED. *****//

//BROCHES DE SORTIES LED.
#define ROUGE 10//Broche LED ROUGE.
#define VERT 9   //Broche LED VERTE.
#define RELAY 13

//POTENTIMETRE.
#define POTAR A1      //Broche potentiomètre.
#define SONDE A0
int memo_temperature; //Contrôle de tendance.
int memo_MAXI_T;      //Mémorisation de la température MAXI mesuré.
int memo_MINI_T;      //Mémorisation de la température MINI mesuré.

//***** VARIABLES GLOBALES PROGRAMME *****//

//LCD.
int fenetre = 0;  //Variable de verrouillage fenêtre.

//TEMPORISATION.
unsigned long memo_temps_1; //Chargement du temps décompté.
unsigned long memo_temps_2; //Chargement du temps décompté.

//SYSTEME.
byte etat = 0;      //État d'activation du système et des alarmes.
byte memo_etat = 0; //État d'activation du système et des alarmes.
byte tendance = 4;  //État de la tendance du système.

//TEMPORISATIONS.
unsigned long memo_temps[2] {}; //Tableau des retours tempos.

//DONNÉES PARAMETRES.
//Index 0 utile pour donnée retour système = Capteurs.
int parametres [7] {0, 15, 12, 20, 7, -20, 100}; //Tableau des données en traitement ( --, MAX, min, alarme MAX, alarme min,...) 
int val_defaut[2] { -20, 100};                    //Tableau des données MINI MAXI.

//AFFICHAGE DES FENÊTRES.
String nom_parametres [7] {"TEMP.:", "ARRET :", "MARCHE:", "MAX_T:", "MIN_T:"}; //Tableau des nom de parametres.
String etat_systeme [6] {" ", "STOP      ", "RUN       ", "T_MAXI", "T_MINI"};  //Tableau des état systeme.

//***** SYMBOLES SPECIFIQUES. *****//
//CELCIUS. "°"
byte celsius[8] = { 0b11100,  0b10100,  0b11100,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000};

//FLECHE BAS.
byte fleche_bas[8] = {  0b00100,  0b00100,  0b00100,  0b00100,  0b00100,  0b11111,  0b01110,  0b00100};

//FLECHE HAUT.
byte fleche_haut[8] = {  0b00100,  0b01110,  0b11111,  0b00100,  0b00100,  0b00100,  0b00100,  0b00100};

//FLECHE STABLE.
byte fleche_stable[8] = {  0b00100,  0b01110,  0b11111,  0b00100,  0b00100,  0b11111,  0b01110,  0b00100};

//FLECHE POINTEUSE ALARME.
byte fleche_pointe_alarme[8] = {  0b11000,  0b11100,  0b11110,  0b11111,  0b11111,  0b11110,  0b11100,  0b11000};


//***** INSTANCIATION DE LCD. *****//
LiquidCrystal lcd (RS, E, D4, D5, D6, D7); //Paramétrage de la classe LCD.

//***** CONFIGURATIONS,INTIALISATIONS ET TEST *****//
void setup() {

  Serial.begin(9600);  // définition de l'ouverture du port série
  ds.begin();          // sonde activée

  //***** CONFIGURATIONS *****//

  //Moniteur série.
  //Serial.begin(9600); //Configuration du moniteur série.//--*/

  //LCD.
  lcd.begin(16, 2);   //Configuration LCD.

  //ENTREE.
  pinMode (ENTREE, INPUT_PULLUP); //Configuration de broche en entrée.
  pinMode (HAUT, INPUT_PULLUP);   //            //
  pinMode (BAS, INPUT_PULLUP);    //Configuration de broche en entrée.

  //SORTIE.
  pinMode (ROUGE, OUTPUT); //Configuration de broche en sortie.
  pinMode (VERT, OUTPUT);  //Configuration de broche en sortie.
 pinMode (RELAY, OUTPUT);


  //***** INTITIALISATION *****//
  //LCD => Affectation des caractères spéciaux.
  lcd.createChar(1, celsius );        //Assigné 1 à ce caractère.
  lcd.createChar(2, fleche_haut );    //Assigné 2 à ce caractère.
  lcd.createChar(3, fleche_bas );     //Assigné 3 à ce caractère.
  lcd.createChar(4, fleche_stable );  //Assigné 4 à ce caractère.
  lcd.createChar(5, fleche_pointe_alarme );  //Assigné 5 à ce caractère.

  //PROGRAMME => Lecture du temps actuel.
  unsigned long temps_actuel = millis(); //Acquisition du temps actuel.

  //CAPTEUR => Lecture de la température.
  /*Simulation d'un capteur de température*/
  //parametres[0] = analogRead(POTAR);  
  //Lecture du signale à la broche dédié.

  ds.requestTemperatures();
  int sonde1 = ds.getTempCByIndex(0);
  
  parametres[0] = sonde1; //Mise à l'échelle et chargement de la valeur.
  memo_MAXI_T = parametres[0];                        //Initialisation des valeurs d'enregistrement MAXI.
  memo_MINI_T = parametres[0];                        //Initialisation des valeurs d'enregistrement MINI.

  //***** TEST *****//

  //LED.
  digitalWrite(ROUGE, HIGH);//Allumage.
  digitalWrite(VERT, HIGH); //Allumage.

  //LCD.
  lcd.clear();                    //Effacement de l'afficheur.
  lcd.setCursor(0, 0);            //Positionnement du curseur.
  lcd.print("-- THERMOSTAT --");  //Affichage d'un message.
  lcd.setCursor(0, 1);            //Positionnement du curseur.
  lcd.print("----- PRET -----");   //Affichage d'un message.
  delay(2000);                    //Temporisation.

  //LED
  analogWrite(ROUGE, LOW); //Extinction.
  analogWrite(VERT, LOW);  //Extinction.

  /*MONITEUR SÉRIE.
    Serial.println("***** PROJET PRET *****");  //Affichage d'un message.
    Serial.println();                           //Saut de ligne.*/
}//Fin de setup().

//------------------------------------------------------------------





void raz() { //Sans paramètres.

  //***** RETOUR DÉBUT MENU. *****/
  ret_boutons = 0;  //Initialisation => Validation d'action.
  fenetre = 0;      //Initialisation  => Retour fenêtre lecture.
}//fin de raz();

//------------------------------------------------------------------

byte boutons () { //Sans paramètres.

  //***** Lecture de l'état des entrées de boutons. *****//
  byte etat_bouton_entree = digitalRead(ENTREE);  //Lecture de l'état de l'entrée bouton.
  byte etat_bouton_plus = digitalRead(HAUT);      //Lecture de l'état de l'entrée bouton.
  byte etat_bouton_moins = digitalRead(BAS);      //Lecture de l'état de l'entrée bouton.

  //INCREMENTATION DE LA SAISI.
  switch (fenetre) {
    case 11:
    case 21:
    case 31:
    case 41:
      if (etat_bouton_plus == LOW) { //Conditionnement d’exécution.
        incremente++; //Incrémentation positif de la saisi.
        delay(250);   //Temporisation d'appuis.
      }//if.

      if (etat_bouton_moins == LOW) { //Conditionnement d’exécution.
        incremente--; //Incrémentation négative de la saisi.
        delay(250);   //Temporisation d'appuis.
      }//if.
      break;
  }

  //***** Gestion de l'état du bouton ENTREE.
  if (etat_bouton_entree != precd_entree) { //Contrôle de l'état précédent un appui.

    if (etat_bouton_entree == LOW) {  //Conditionnement d’exécution.

      precd_entree = etat_bouton_entree;  //Chargement de l'état bouton.
      delay(250);                         //Temporisation d'appuis.
      return 1;                           //Retour d'état => ENTREE.
    }//if.
  }//if.
  precd_entree = etat_bouton_entree;  //Chargement de l'état bouton.

  //***** Gestion de l'état du bouton PLUS.
  if (etat_bouton_plus != precd_plus) { //Contrôle de l'état précédent un appui.

    if (etat_bouton_plus == LOW) {  //Conditionnement d’exécution.

      precd_plus = etat_bouton_plus;  //Chargement de l'état bouton.
      delay(250);                     //Temporisation d'appuis.
      return 2;                       //Retour d'état => PLUS.
    }//if.
  }//if.
  precd_plus = etat_bouton_plus;  //Chargement de l'état bouton.

  //***** Gestion de l'état du bouton MOINS.
  if (etat_bouton_moins != precd_moins) {//Contrôle de l'état précédent un appui.

    if (etat_bouton_moins == LOW) { //Conditionnement d’exécution.

      precd_moins = etat_bouton_moins;  //Chargement de l'état bouton.
      delay(250);                       //Temporisation d'appuis.
      return 3;                         //Retour d'état => MOINS.
    }//if.
  }//if.
  precd_moins = etat_bouton_moins;  //Chargement de l'état bouton.

  return 0; //Retour d'état => PAR DEFAUT.
}//Fin de boutons().

//------------------------------------------------------------------

void affiche (byte cas, int i) { //Paramètre => Index respectif de la donnée dans le tableau.

  switch (cas) {  //Contrôle de index de fonction.

    case 0://LECTURE.
      lcd.clear();                    //Rafraîchissement de l'affichage.
      lcd.setCursor(0, 0);            //Positionnement du curseur.
      lcd.print("TEMP: ");            //Affichage d'un message.
      lcd.setCursor(0, 1);            //Positionnement du curseur.
      lcd.print("ETAT: ");            //Affichage d'un message.
      lcd.print(etat_systeme [etat]); //Affichage d'un message.
      break;

    case 1://SELECTION DES PARAMETRES. P1 => P4.
      lcd.clear();                    //Rafraîchissement de l'affichage.
      lcd.setCursor(0, 0);            //Positionnement du curseur.
      lcd.print("PARAMETRE ");        //Affichage d'un message.
      lcd.print(i);                   //Affichage de l'index de la donnée.
      lcd.setCursor(0, 1);            //Positionnement du curseur.
      lcd.print(nom_parametres [i]);  //Affichage d'un message.
      lcd.print(parametres [i]);      //Affichage d'un message.
      lcd.write(1);                   //Affichage du caractère 1 " ° " .
      lcd.print("C ");        //Affichage d'un message.
      break;

    case 2://SELECTION MESURES MINI MAXI.

      lcd.clear();  //Rafraîchissement de l'affichage.

      //MESURE MAXI.
      lcd.setCursor(0, 0);  //Positionnement du curseur.
      lcd.print("Mesure");  //Affichage d'un message.

      if (memo_etat == 4) { //Contrôle de l'état d'alarme.
        lcd.write(5);   //Affichage du caractère 5 fleche pointeur d'alarme .
      } else {          //Action par défaut.
        lcd.print(" "); //Affichage d'un message.
      }

      lcd.print("MINI:");     //Affichage d'un message.
      lcd.print(memo_MINI_T); //Affichage de la valeur MINI mesuré.
      lcd.write(1);           //Affichage du caractère 1 " ° " .
      lcd.print("C ");        //Affichage d'un message.

      //MESURE MAXI.
      lcd.setCursor(0, 1);  //Positionnement du curseur.*/
      lcd.print("Mesure");  //Affichage d'un message.

      if (memo_etat == 3) { //Contrôle de l'état d'alarme.

        lcd.write(5);   //Affichage du caractèer 5 flèche pointeur alarme .
      } else {          //Action par défaut.
        lcd.print(" "); //Affichage d'un message.
      }

      lcd.print("MAXI:");     //Affichage d'un message.
      lcd.print(memo_MAXI_T); //Affichage de la valeur MAXI mesuré.
      lcd.write(1);           //Affichage du caractère 1 " ° " .
      lcd.print("C ");        //Affichage d'un message.
      break;

    case 3://AFFICHAGE DE SELECTION R.A.Z.
      lcd.clear();                    //Rafraîchissement de l'affichage.
      lcd.setCursor(3, 0);            //Positionnement du curseur.
      lcd.print("?? RAZ ??");         //Affichage d'un message.
      lcd.setCursor(0, 1);            //Positionnement du curseur.
      lcd.print("ALARME + MESURES");  //Affichage d'un message.
      break;

    case 4://AFFICHAGE DE LA SAISI;
      lcd.clear();                  //Rafraîchissement de l'affichage.
      lcd.setCursor(0, 0);          //Positionnement du curseur.
      lcd.print("SAISI ");          //Affichage d'un message.
      lcd.setCursor(0, 1);          //Positionnement du curseur.
      lcd.print(nom_parametres[i]); //Affichage de l'index de la donnée.
      break;

    case 5://AFFICHAGE DE L'EXECUTION DE R.A.Z.
      lcd.clear();              //Rafraîchissement écran.
      lcd.setCursor(0, 0);      //Positionnement du curseur.
      lcd.print("!! RAZ =");    //Affichage d'un message.
      delay(1500);              //Temps d'affichage.
      digitalWrite(ROUGE, LOW); //Activation LED ROUGE = EXTINCTION.
      lcd.print("= OK !!");     //Affichage d'un message.
      delay(1500);              //Temps d'affichage.   
      break;
  }

  //FIN D'EXECUTION.
  ret_boutons = 0; //Initialisation => Validation d'action.

}//Fin de sélection().

//------------------------------------------------------------------

void actualiser(byte i) { //Sans paramètres.

  switch (i) {

    case 1:
      //***** ACTUALISATION DONNÉES LECTURES. *****/ /
      //Affichage de la température.
      lcd.setCursor(6, 0);      //Positionnement du curseur.
      lcd.print(parametres[0]); //Affichage de l'index de la donnée.
      lcd.write(1);             //Appel du caractère 1 " ° " .
      lcd.print("C ");          //Rafraîchissement de la valeur.

      //Affichage de l'état système.
      lcd.setCursor(6, 1);            //Positionnement du curseur.
      lcd.print(etat_systeme[etat]);  //Affichage de l'index de la donnée.
      lcd.print(" ");                 //Rafraîchissement de la valeur.

      //Affichage de la tendance du système.
      lcd.setCursor(15, 0); //Positionnement du curseur.
      lcd.write(tendance);  //Affichage de l'index de la donnée.
      lcd.print(" ");       //Rafraîchissement de la valeur.t
      break;

    case 2:
      //***** ACTUALISATION DE LA SAISI. *****/ /
      lcd.setCursor(8, 1);    //Positionnement du curseur.
      lcd.print(incremente);  //Affichage d'un message.
      lcd.write(1);           //Affichage d'un message.
      lcd.print("C ");        //Affichage d'un message.
      break;
  }

}//Fin de actualis_saisi().

//------------------------------------------------------------------





//***** PROGRAMME PRINCIPALE *****//
void loop() {

  //***** ACQUISITION DU SIGNALE ANALOGIQUE *****//
  /*Simulation d'un capteur de température*/
  //parametres[0] = analogRead(POTAR);                  //Lecture du signale à la broche dédié.
  //parametres[0] = map(parametres[0], 0, 1023, -15, 50); //Mise à l'échelle et chargement de la valeur.

//---------------------------
//---------------------------
ds.requestTemperatures();
  int sonde2 = ds.getTempCByIndex(0);
 
  Serial.print(sonde2);
  Serial.println( "C");
 

  parametres[0] = sonde2;
  //Serial.println(parametres[0]);
//---------------------------
//---------------------------

  //***** ACQUISITION DES BOUTONS. *****//
  ret_boutons = boutons ();//Appel de fonction.

  //***** CONTÔLE DU TEMPS *****//
  unsigned long temps_actuel = millis(); //Acquisition du temps actuel.

  //TEMPOS_1 ACTIONS.
  /*Contrôle l'activité au clavier.*/
  if (fenetre != 0) {               //Conditionnement d'activation.
    if (ret_boutons != 0 ) {        //Contrôle des actions au clavier.
      memo_temps_2 = temps_actuel;  //Mise à l'origine du décompte de temporisation.
    }//if.

    if (temps_actuel - memo_temps_2 >= 60000) { //Contrôle de l'écart de temps.
      memo_temps_2 = temps_actuel;              //Charge le temps actuel au passage de boucle.
      raz();
    }//if.
  }//if.

  //TEMPOS_2 TENDANCE.
  if (temps_actuel - memo_temps_1 >= 5000) {  //Contrôle de l'écart de temps.
    memo_temps_1 = temps_actuel;              //Charge le temps actuel au passage de boucle.

    //***** ENREGISTREMENT DE LA TENDANCE HAUTE OU BASSE. *****//
    /* Contrôle si la température crois ou décrois. */

    //Tendance à la hausse.
    if (parametres[0] > memo_temperature ) { //Contrôle de la température.
      tendance = 2; //Chargement de la valeur de tendance positive.
    }

    //Tendance à la baisse.
    if (parametres[0] < memo_temperature ) { //Contrôle de la température.
      tendance = 3; //Chargement de la valeur de tendance négative.
    }

    //Tendance égale.
    if (parametres[0] == memo_temperature ) { //Contrôle de la température.
      tendance = 4; //Chargement de la valeur de tendance nul.
    }

    //***** ENREGISTREMENT DE LA TEMPERATURE ACTUELLE. *****//

    memo_temperature = parametres[0]; //Mise en mémoire de la température actuel au passage dans la tempos.
  }

  //***** ENREGISTREMENT DE LA TEMPERATURE MAXI ET MINI MESURÉ. *****//

  //Enregistrement de la température maximum. MAXI_T
  if (parametres[0] > memo_MAXI_T) {  //SIGNALE > MAXI_T;
    memo_MAXI_T = parametres[0];  //Chargement de la valeur MAXI. +1 => Correction.
  }

  //Enregistrement de la température minimum. MINI_T.
  if (parametres[0] < memo_MINI_T) {  //SIGNALE > MAXI_T;
    memo_MINI_T = parametres[0];  //Chargement de la valeur MAXI. +1 => Correction.
  }

  //***** GESTION DE L'AFFICHAGE. *****//

  //***** FENETRE DE LECTURE.
  //FENETRE 1. => LECTURE.
  if ( fenetre == 0 && ret_boutons == 0) { //AUCUNE ACTIONS.
    affiche(0, 0); //Appel fonction => Validation fenêtre 1.
    fenetre = 1;                    //Verrouillage de la fenêtre.
  }

  //Actualisation de la lecture de la donnée système.
  if (fenetre == 1) { //Conditionnement de l'affichage.
    //Affichage de la température, l'état système et la tendance du système.
    actualiser(1);
  }

  //***** SELECTION DES PARAMETRES.

  //FENETRE 2. => LISTE DES PARAMETRES. (Transitoire)
  if (fenetre == 1 && ret_boutons == 1) { //APPUI SUR ENTRÉE.

    //Serial.println("LISTE DES PARAMETRES");
    lcd.clear();              //Rafraîchissement de l'affichage.
    lcd.setCursor(0, 0);      //Positionnement du curseur.
    lcd.print("LISTE DES");   //Affichage d'un message.
    lcd.setCursor(0, 1);      //Positionnement du curseur.
    lcd.print("PARAMETRES");  //Affichage d'un message.
    delay(1500);              //Temporisation d'affichage.
    ret_boutons = 2;          //Validation d'action.
    fenetre = 2;              //Verrouillage de la fenêtre.
  }

  //***** SELECTION DES PARAMETRES. *****//
  switch (fenetre) {

    case 2:// FENETRE 1 => DEFILEMENT PARAMETRE_1.
      affiche(1, 1);    //Appel de fonction.
      fenetre = 3;      //Verrouillage de la fenêtre.
      ret_boutons = 0;  //Validation d'action.
      //Serial.print("FENETRE 1 => DEFILEMENT PARAMETRE_1 :"); Serial.println(fenetre);

      //PAS UTILISÉ.
      /*if (ret_boutons == 1) {
        saisi(X);         //Appel de fonction.
        fenetre = X;      //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        Serial.print("FENETRE X.X => SELECTION PARAMETRES X :"); Serial.println(fenetre);
        }//---*/
      /*if (ret_boutons == 2) {
        saisi(X);         //Appel de fonction.
        fenetre = X;      //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        Serial.print("FENETRE X.X => SELECTION PARAMETRES X :"); Serial.println(fenetre);
        }//---*/
      break;

    case 3:// FENETRE 1 => DEFILEMENT PARAMETRE_2.
      if (ret_boutons == 1) {//Appui sur ENTRÉE.
        affiche(4, 1);   //Appel de fonction.
        fenetre = 11;     //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 1.1 => SELECTION PARAMETRES 1 :"); Serial.println(fenetre);
      }//---*/
      if (ret_boutons == 2) {//Appui sur PLUS(+).
        affiche(1, 2);    //Appel de fonction.
        fenetre = 4;      //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 2 => DEFILEMENT PARAMETRE_1 :"); Serial.println(fenetre);
      }
      break;

    case 4://PARAMETRE_3.
      if (ret_boutons == 1) {//Appui sur ENTRÉE.
        affiche(4, 2);   //Appel de fonction.
        fenetre = 21;     //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 2.1 => SELECTION PARAMETRES 2 :"); Serial.println(fenetre);
      }
      if (ret_boutons == 2) {//Appui sur PLUS(+).
        affiche(1, 3);    //Appel de fonction.
        fenetre = 5;      //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 3 => DEFILEMENT PARAMETRE_3 :"); Serial.println(fenetre);
      }
      break;

    case 5://PARAMETRE_4.
      if (ret_boutons == 1) {//Appui sur ENTRÉE.
        affiche(4, 3);   //Appel de fonction.
        fenetre = 31;     //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 3.1 => SELECTION PARAMETRES 3 :"); Serial.println(fenetre);
      }
      if (ret_boutons == 2) {//Appui sur PLUS(+).
        affiche(1, 4);    //Appel de fonction.
        fenetre = 6;      //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 4 => DEFILEMENT PARAMETRE_4 :"); Serial.println(fenetre);
      }
      break;

    case 6://VISU MINI MAXI.
      if (ret_boutons == 1) {//Appui sur ENTRÉE.
        affiche(4, 4);    //Appel de fonction.
        fenetre = 41;     //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Validation d'action.
        //Serial.print("FENETRE 4.1 => SELECTION PARAMETRES 4 :"); Serial.println(fenetre);
      }
      if (ret_boutons == 2) {//Appui sur PLUS(+).
        affiche(2, 0);    //Appel de fonction.
        fenetre = 7;      //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Initialisation => Validation d'action.
        //Serial.print("FENETRE 5 => DEFILEMENT PARAMETRE_5 :"); Serial.println(fenetre);
      }
      break;

    case 7://RAZ ALARME.
      //PAS UTILISÉ.
      /* if (ret_boutons == 1) {//Appui sur ENTRÉE.
         saisi(X);         //Appel de fonction.
         fenetre = X;      //Verrouillage de la fenêtre.
         ret_boutons = 0;  //Initialisation => Validation d'action.
         Serial.print("FENETRE X.X => SELECTION PARAMETRES X :"); Serial.println(fenetre);
        }//--*/
      if (ret_boutons == 2) {//Appui sur PLUS(+).
        affiche(3, 0);    //Appel de fonction.
        fenetre = 8;      //Verrouillage de la fenêtre => Retour début.(2)
        ret_boutons = 0;  //Initialisation => Validation d'action.
        //Serial.print("FENETRE 6 => DEFILEMENT PARAMETRE_6 :"); Serial.println(fenetre);
      }
      break;

    case 8://FIN DE LISTE.
      if (ret_boutons == 1) {//Appui sur ENTRÉE.
        affiche(5, 0);    //Appel de fonction.
        fenetre = 61;     //Verrouillage de la fenêtre.
        ret_boutons = 0;  //Initialisation => Validation d'action.
        //Serial.print("FENETRE 6.1 => SELECTION PARAMETRES 6 :"); Serial.println(fenetre);
      }
      if (ret_boutons == 2) {//Appui sur PLUS(+).
        fenetre = 2;      //Verrouillage de la fenêtre => Retour début.(2)
        ret_boutons = 0;  //Initialisation => Validation d'action.
      }
      break;

    //***** SAISI DE LA VALEUR DE PARAMETRES. *****//
    /*Les données ne peuvent pas être supérieur ou égales les une par rapport aux autres.
      Mise en butée, par défaut, de un point supérieur ou inférieur.*/

    case 11:  //FENETRE 1.1 => SAISI VALEUR ARRET(1).
      // Mise en butée MINI / MAXI de la valeur en cours de saisi.
      incremente = constrain(incremente, parametres[2] + 1, parametres[3] - 1); // (2)MARCHE => (3)MAXI_T.
      actualiser(2);
      //Validation de la saisi.
      if (ret_boutons == 1) {  //Contrôle de validation.
        parametres [1] = incremente;  //Chargement de la SAISI VALEUR ARRET.
        raz();                        //Appel de la fonction.
      }
      break;

    case 21:  //FENETRE 3.2  => SAISI VALEUR MARCHE.
      // Mise en butée MINI / MAXI de la valeur en cours de saisi.
      incremente = constrain(incremente, parametres[4] + 1, parametres[1] - 1); // (4)MINI_T => (1)ARRÊT.
      actualiser(2);

      //Validation de la saisi.
      if (ret_boutons == 1) {  //Contrôle de validation.
        parametres [2] = incremente;  //Chargement de la SAISI VALEUR ARRET.
        raz();                        //Appel de la fonction.
      }
      break;

    case 31:  //FENETRE 3.3  => SAISI VALEUR MAXI_T.
      // Mise en butée MINI / MAXI de la valeur en cours de saisi.
      incremente = constrain(incremente, parametres[1] + 1, parametres[6] ); // (1)ARRÊT => (6)MAXI_MAXI Défini par l'utilisateur. (par défaut 100).
      actualiser(2);

      //Validation de la saisi.
      if (ret_boutons == 1) {  //Contrôle de validation.
        parametres [3] = incremente;  //Chargement de la SAISI VALEUR ARRET.
        raz();                        //Appel de la fonction.
      }
      break;

    case 41:  //FENETRE 3.4  => SAISI VALEUR MAXI_T.
      // Mise en butée MINI / MAXI de la valeur en cours de saisi.
      incremente = constrain(incremente, parametres[5] , parametres[2] - 1); //(5)MINI_MINI Défini par l'utilisateur. (par défaut -20) => (2)MARCHE.
      actualiser(2);

      //Validation de la saisi.
      if (ret_boutons == 1) {  //Contrôle de validation.
        parametres [4] = incremente;  //Chargement de la SAISI VALEUR ARRET.
        raz();                        //Appel de la fonction.
      }
      break;

    /*Pas utilisé pour une lecture. (maintient de l'ordre des fenetres).
      case 35: //FENETRE 3.5  => MESURE MINI_MAXI.
      break;//--*/

    case 61:  //FENETRE 3.6  => RAZ ALARMES.
      /*Remis à zéro des valeurs MINI / MAXI enregistrés et des alarmes*/
      memo_etat = 0;                //Validation d'action.
      memo_MAXI_T = parametres[0];  //Valeur actuelle.
      memo_MINI_T = parametres[0];  //Valeur actuelle.
      raz();                        //Appel de la fonction.
      break;
  }//switch.

  //***** RETOUR AU DÉBUT DU MENU. *****//

  /*Retour au début possible au niveau de la sélection des paramètres*/
  if (fenetre >= 2 && fenetre <= 10) {//Conditionnement d'execution.
    if (ret_boutons == 3) {//Appui sur MOINS(-).
      fenetre = 0;      //Verrouillage de la fenêtre.
      ret_boutons = 0;  //Validation d'action.
      //Serial.print("RETOUR LECTURE :"); Serial.println(fenetre);
    }
  }

  //***** ACTIVATION SYSTEME *****//

  //ARRÊT => LED VERT.
  if (parametres[0] >= parametres[1]) { ////SIGNALE >= MARCHE.
    digitalWrite (VERT, LOW);  //Activation de la sortie.
    digitalWrite (RELAY, LOW);
    etat = 1;                  //État STOP respectif au tableau.
  }

  //MARCHE => LED VERT.
  if (parametres[0] <= parametres[2]) { //SIGNALE <= ARRÊT.
    digitalWrite (VERT, HIGH);  //Activation de la sortie.
    digitalWrite (RELAY, HIGH);
    etat = 2;                   //État RUN respectif au tableau.
  }

  //ALARME MAXI => LED ROUGE.
  if (parametres[0] >= parametres[3] ) { //SIGNALE >= MAXI.
    digitalWrite (ROUGE, HIGH); //Activation de la sortie.
    etat = 3;                   //État ALARME respectif au tableau.
    memo_etat = etat;           //Mémorisation du dernière état d'alarme.
  }
  //ALARME MINI => LED ROUGE.
  if ( parametres[0] <= parametres[4]) { //SIGNALE <= MINI.
    digitalWrite (ROUGE, HIGH); //Activation de la sortie.
    etat = 4;                   //État ALARME respectif au tableau.
    memo_etat = etat;           //Mémorisation du dernière état d'alarme.
  }

}//fin de loop.

![IMG_6858|375x500](upload://rPLPmK5Ec8xGwt22459YdA8bcDm.jpeg)
![IMG_6827|375x500](upload://eOuwufkBi5BdBzxCBpToaOT9mEl.jpeg)
![IMG_6828|375x500](upload://m2ZAgCoJjf376qhywCeJb9UpIq2.jpeg)
![IMG_6829|375x500](upload://3VIcNi9Ub2kfV6DJWJS98idmLCN.jpeg)

Bonjour,

La tension sur VIN doit être de 7V minimum. Tu as sans doute moins de 5V sur le 5V en sortie.

Première erreur. Il faudrait au moins 6.5V pour alimenter une NANO ou une UNO par VIN.

Il est absolument impossible qu'un relais puisse fonctionner sans électronique de commande adaptée, à moins qu'il ne s'agisse d'un relais REED.

Je viens de mettre 7 V dessus et en effet le soucis n'a pas l'air de persister. Je peux rentrer du 5 V sur l'arduino quand même ?? Sur quelle broche ?

Je ne sais pas par quelle magie, mais le relais colle bien et décolle bien comme il faut.

Dans le 5V.

Oui, mais réponse en deux temps :

  1. Oui sur la broche marquée 5V qui est la sortie du régulateur interne de la carte.
  2. Attention : c'est soit l'un, soit l'autre : soit 5V sur la broche 5 V, soit 7 V sur la broche Vin.

Si tu fais les deux en même temps tu crames la carte.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.