[RÉSOLU] Mega Projet Contrôleur de Température et d'Humidité

Bonjour à tous,
Après avoir réalisé mon premier projet de contrôle d’humidité grâce à Infobarquee (merci encore pour son soutien),
je me lance cette fois-ci pour mon 2ème et Mega Projet, la gestion de température et d’humidité.

Le Projet : Fabriqué un contrôleur de température et d’humidité avec possibilité de changé les valeurs de temp. et d’hum. selon nos besoins, le tout dans une boîte de dérivation ou autres.

Ce projet (si réalisé) peut être utilisé pour Cave à vin, Reptile, Incubateur, Couveuse…
S’il y à des personnes amateurs comme moi intéressées on peut s’entraider.

Matériels:

    1. Arduino Uno, Mega …
    1. Capteur DHT22
    1. Relais 2 Canaux - 5V
    1. DFRobot LCD Keypad Shield (Bouclier 1602)
    1. Module I2C
    1. Screw Shield (bouclier Uno avec bornier a vis)

Le Sketch : (avec des erreurs car emprunter chez 2 braves personnes)

#include <LiquidCrystal.h>
#include <DFR_Key.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7); // 0.27 est l’adresse du bus I2C

const int relay1Pin = 8; // PIN 8 pour le relais (humidité)
const int relay2Pin = 9; // PIN 9 pour le relais (température)
const int DHTPIN = D2; // PIN D2 pour le capteur Dht22


// Démarrage des valeurs après le démarrage, on peut les changer
int temp = 12;  // Souhaite avoir 12℃
int hum = 80;  // Et 80% d'humidité
int readkey;
long int lastmillis;
long int hours;
long int minutes;
long int seconds;
char l2c1; 
char l2c2;
char l2c3;

DHT dht (DHTPIN, DHT22); // Pour capteur Dht22
const int humidityRelay1 = 8;
const int heaterRelay2= 9;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // ← Ici pas sûr car utilise le module I2C ?
DFR_Key keypad;
int localKey = 0;
String keyString = "";
int lcd_key     = 0;
int adc_key_in  = 0;

#define btnRIGHT  0  // Je ne sais pas si je dois définir les boutons ?
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

int read_LCD_buttons(){               
    adc_key_in = analogRead(0);
    if (adc_key_in > 1000) return btnNONE; 
    if (adc_key_in < 50)   return btnRIGHT;  
    if (adc_key_in < 150)  return btnUP; 
    if (adc_key_in < 300)  return btnDOWN; 
    if (adc_key_in < 460)  return btnLEFT; 
    if (adc_key_in < 690)  return btnSELECT;  
    
}
              
void setup() 
{ 
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(“KeithControl");
  lcd.setCursor(0, 1);
  lcd.print("Instr on Select");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();
    
  keypad.setRate(10);  // Taux d'échantillonnage (par défaut 10 ms)
  digitalWrite(relay1, HIGH);
  digitalWrite(relay2, HIGH);

}

void loop() 
{ 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(t) || isnan(h)) 
{  // contrôle du fonctionnement du capteur
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur NC!!"); 
    delay(10000);
  } else 

{
 // Possibilité de changer les valeurs après chaque pression sur la touche, la valeur par défaut est de 1'C pour la température et 1% d'humidité
    
    lcd_key = read_LCD_buttons();
    switch (lcd_key)
      {
        
       case btnLEFT:{
             temp = temp +1;
             break;
       }
       case btnRIGHT:{
             temp = temp - 1;
             break;
       }
       case btnUP:{
             hum = hum + 1;
             break;
       }
       case btnDOWN:{
             hum = hum - 1;
             break;
       }
       case btnSELECT:{
            lcd.begin(16, 2);
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Hum Up/Down +-1%");
            lcd.setCursor(0, 1);
            lcd.print("Temp L/R +-1");
            lcd.print((char)223);
            lcd.print("C");
            delay (5000);
            break;
     }
  }
    
    lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
    
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");

//  Ajout hysterie afin que l'humidificateur ne s'allume et ne s'éteigne pas constamment (l'humidificateur dépassera la limite supérieure de 10% 
      
      int H = 75 + 10;    
      if(h < 85)
      digitalWrite(relay1, LOW);
      else if (h >= H)
      digitalWrite(relay1, HIGH);
      

     //* A UTILISÉ SI ON VEUT DES VALEURS PRÉCISES
      if(h < hum )
      digitalWrite(relay1, LOW);
      else
      digitalWrite(relay1, HIGH);  *//

      int T = 12 + 2
      if(t < 12 )
      digitalWrite(relay2, LOW);
      else if (t >= T)
      digitalWrite(relay2, HIGH);
  
  
  }
}

Voilà merci d’avance pour le passage la lecture les remarques, conseils tout est le bienvenu, sincère salutations.

Salut

En pratique, si vous voulez une architecture de code évolutive, c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

quelques commentaires:

appuyer sur ctrl-T ou cmd-T (mac) pour indenter le code correctement, ce sera plus lisible

je ne connais pas votre shield exactement mais dans la fonction read_LCD_buttons() que ce passe-t-il si adc_key_in et dans l'intervalle [690, 1000]? (la fonction dit retourner un int mais ne retourne rien).

Vos boutons seraient mieux sous la forme d'un enum de type byte plutôt que de #define (économie d'octets)

Mettre le port série à 115200 au lieu de 9600 (pourquoi aller lentement?)

Ne pas répéter le lcd.begin(16, 2); dans la loop, il est déjà bien dans le setup()

Mettre les pins en const [color=green]byte[/color] au lieu de const [color=red]int[/color]

long [color=red]int[/color] lastmillis; --> dès qu'on joue avec millis() il faut prendre des [color=green]unsigned[/color] long

De manière générale, bannir l'usage de la classe String et utiliser à la place des c-string (tableau de caractères terminés par '\0').
--> vous déclarez [color=red]String[/color] keyString = ""; mais là ça tombe bien, keyString ne sert à rien --> la virer

pour économiser de la place mémoire j'utiliserais la macro F() dans tous les print() (du lcd ou de Serial) par exemple changer lcd.print("Instr on Select"); en lcd.print([color=green]F([/color]"Instr on Select"[color=green])[/color]); (idem pour tous les autres)
--> cf la paragraphe "The F() macro" dans la doc de PROGMEM

il n'y a pas de gestion de min et max pour la T° ou l'humidité?

delay (5000); ça ça va être pénible à l'usage... vous bloquez tout pendant 5 secondes, y compris la commande de régulation. ça devrait être géré dans la boucle, souvenez vous que ça a été affiché et notez le moment d'affichage, ensuite dans la boucle si ce texte est toujours affiché et que 5 secondes sont passées alors revenez à l'affichage normal. (une machine a état aide pour ce genre de choses)

Pour éviter que le LCD ne clignote trop, mémoriser les anciennes valeurs affichées et changez les uniquement si elles ont varié. pas la peine de ré-afficher tout le texte non plus à chaque boucle

De même pas la peine d'envoyer à chaque passage dans la boucle un ordre d'allumage ou d'extinction aux relais. (une machine a état aide pour ce genre de choses)

envisager d'explorer ce qu'un Régulateur PID peut faire pour vous (et éventuellement la librairie arduino pour cela et l'exemple PID RelayOutput)

envisager de stocker en EEPROM les dernières consignes (en cas de panne de courant)

sinon ce commentaire m'a bien fait rire :slight_smile:

Ajout hysterie afin que l'humidificateur ne s'allume et ne s'éteigne pas constamment

Salut J-M-L

Je te remercie de tout mon coeur pour tout ses explications digne de cours professionnel, vraiment trop fort très sympa, je te souhaite que du bonheur J-M-L et heureux de t’avoir fait rire pour l’Hystérie avec l’humidité :smiley: (je amateur)

Je vais reprendre le code et modifié tout ce que tu conseil de changer ligne par ligne.

J’ai réussi à avoir le code modifié et rendu utilisable grâce à un ami ingénieur professionnel à la retraite vivant en Australie, le très aimable et honorable Mr KEITH. L’auteur du code LCD Shield compatible module I2C. Il m’a aidé de A à Z pour le codage, j’en profite pour le remercier et lui souhaiter bonne santé et bonheur.

Le code seul est compatible pour l’utilisation seulement d’après Mr KEITH il y aurait des modif. à effectué dans librairie DFR_Key. Alors j’ai fouillé dans les fichiers de la librairie DFR_Key.h et pu uniquement changé les valeurs de boutons pour les adapter avec les valeurs de mon bouclier DFRobot.

Finalement j’ai une erreur au niveau de la librairie qui revient à chaque fois,
l’erreur est : DFR_Key.cpp:29:7: error ‘DFR_Key’ was not declared in this scope

if (def == DFR_Key)

Là je bloque ! Si une âme charitable pourrait me conseillé ?

Voici le code complet avec pas mal de commentaire car amateur :slight_smile:

#include <Wire.h>  // Inclure les librairies
#include <DFR_Key.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);  // 0.27 est l’adresse du bus I2C

const int relay1Pin = 18; // PIN 18 pour le relais (Humidificateur)
const int relay2Pin = 19; // PIN 19 pour le relais (Température)
const int DHTPIN = 2;  // PIN 2 pour le capteur 

// Démarrage des valeurs après le démarrage, on peut les changer

int temp = 12;  // Température souhaitée
int hum = 80;  // Humidité souhaitée
int readkey;
long int lastmillis;
long int hours;
long int minutes;
long int seconds;

char l2c1;
char l2c2;
char l2c3;

// Pour DHT22 (AM2023)
DHT dht (DHTPIN, DHT22);  // Type de capteur utilisé
const int humidityRelay1 = 8;
const int heaterRelay2 = 9;



DFR_Key keypad(0);  // Utilise 0 pour le tableau DFRobot et 1 pour le tableau Cytron (?)

int localKey = 0;
String keyString = "";
int lcd_key = 0;
int adc_key_in = 0;

// Utilisation de (const) au lieu de (#define)
const byte btnRIGHT = 0;  
const byte btnUP = 1;     
const byte btnDOWN = 2;   
const byte btnLEFT = 3;   
const byte btnSELECT = 4; 
const byte btnNONE = 5;   

int read_LCD_buttons() {
  adc_key_in = analogRead(0);
  if (adc_key_in > 1000) return btnNONE;
  if (adc_key_in < 50)   return btnRIGHT;
  if (adc_key_in < 150)  return btnUP;
  if (adc_key_in < 300)  return btnDOWN;
  if (adc_key_in < 460)  return btnLEFT;
  if (adc_key_in < 690)  return btnSELECT;
}

void setup() 

{
  pinMode(humidityRelay1, OUTPUT);
  pinMode(heaterRelay2, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("KeithControl");
  lcd.setCursor(0, 1);
  lcd.print("Select instr");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();

  // Taux d'échantillonnage (par défaut 10ms)
  keypad.setRate(10);
  digitalWrite(humidityRelay1, HIGH);  // Relais Humidité actif
  digitalWrite(heaterRelay2, HIGH);  // Relais Température actif

}

void loop() 

{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h))
{   // contrôle du fonctionnement du capteur
                             
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur N/C!!");
    delay(10000);
  } 
else 
 {
    lcd_key = read_LCD_buttons();  // Affichage d’utilisation des boutons pour les réglages
    switch (lcd_key) {
      case btnLEFT:
        {
          temp = temp + 1;  // Bouton LEFT augmente la température de +1 par appuie
          break;
        }
      case btnRIGHT:
        {
          temp = temp - 1;  // Bouton RIGHT diminue la température de -1 par appuie
          break;
        }
      case btnUP:
        {
          hum = hum + 1;  // Bouton UP augmente l’humidité de +1 par appuie
          break;
        }
      case btnDOWN:
        {
          hum = hum - 1;  // Bouton DOWN diminue l’humidité de -1 par appuie
          break;
        }
      case btnSELECT:   // Bouton SELECT pour la sélection
        {
          lcd.begin(16, 2);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Hum Up/Down +-1%");
          lcd.setCursor(0, 1);
          lcd.print("Temp L/R +-1");
          lcd.print((char)223);
          lcd.print("C");
          delay (5000);
          break;
        }
    } lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");
    
    int H = 75 + 10;  // Pour éviter les démarrages fréquents H = 75 + 10% 
    if (h < 85) digitalWrite(humidityRelay1, LOW);  // Si humidité inférieur à 85 Relais1 Fermé
    else if (h >= H) digitalWrite(humidityRelay1, HIGH);  // Sinon si humidité supérieure a 
H =75+10 relais1 ouvert
   
    int T = 12 + 2 ;  // Ajout Hystérésie de 2 - Température=12+2
    if (t < 12 )
      digitalWrite(heaterRelay2, LOW);  // Si température intérieure a 12 Relais2 Fermé
    else if (t >= T)
      digitalWrite(heaterRelay2, HIGH);  // Sinon si température supérieur a T Relais2 Ouvert
  }

}

Ben vous avez modifié comment la librairie?

J-M-L:
Ben vous avez modifié comment la librairie?

Je suis rentré dans le dossiers il y avait plusieurs fichiers, j'ai fait un clique droit sur le fichier et j'ai cliqué sur modifié, la page du fichier en question c'est ouverte et j'ai pu modifié uniquement les valeurs des boutons par les valeurs de mon bouclier 1602, puis enregistrer.

Jai vérifié dans la librairie si modif. ok et tout était ok, j'ai viré l'ancien librairie DFR_Key pour installer celle modifié, j'ai pas pu modifié autres chose car je n'ai pas les capacités.

Et quand vous compilez maintenant vous avez une erreur?

Oui la même erreur en continue
j'ai modifier le if (def == DFRKey) par (if (def == DFR_Key) mais change rien,
je vais essayé de trouver d'autres librairies DFR_Key puis visualisé dedans, le problème c'est qu'étant amateur je ne peut pas comprendre grand chose mise à part la valeurs des bouton Select, Left,Up...

Merci pour le soutien J-M-L.

Elle est où cette ligne if (def == DFRKey) ?

Est-ce dans cette librairie?

J-M-L:
Elle est où cette ligne if (def == DFRKey) ?

Est-ce dans cette librairie?

Dans la librairie DFR_Key.h je vous la copier de suite

Donnez moi plutôt un lien vers la source en ligne

Voici les liens des librairies utiliser

Sky Control V1 - Temperature and Humidity Controller With Relays : 3 Steps - Instructables

Et biensur le lien du très chère Mr KEITH

1602 LCD Keypad Shield Module With I2C Backpack : 6 Steps - Instructables

Ce sont les projets inspirés pour fabriquer mon objectif.

Je suis sur mon iPhone, je ne peux pas voir le zip de la librairie

le premier fichier modifier DFR_Key.cpp

#include "Arduino.h"
#include "DFR_Key.h"

static int DEFAULT_KEY_PIN = 0; 
static int DEFAULT_THRESHOLD = 5;

static int DFROBOT = 0;
static int CYTRON = 1;

static int UPKEY_ARV = 131;
static int DOWNKEY_ARV = 307;
static int LEFTKEY_ARV = 480;
static int RIGHTKEY_ARV = 0;
static int SELKEY_ARV = 723;
static int NOKEY_ARV = 1023;

DFR_Key::DFR_Key(int dev)
{ 
  _refreshRate = 10;
  _keyPin = DEFAULT_KEY_PIN;
  _threshold = DEFAULT_THRESHOLD;
  _keyIn = NO_KEY;
  _curInput = NO_KEY;
  _curKey = NO_KEY;
  _prevInput = NO_KEY;
  _prevKey = NO_KEY;
  _oldTime = 0;
  
  if (def == DFR_KEY)
  {
  UPKEY_ARV = 150;
  DOWNKEY_ARV = 300;
  LEFTKEY_ARV = 460;
  RIGHTKEY_ARV = 50;        <<<<< J ai juste modifier ses valeurs
  SELKEY_ARV = 690;
  NOKEY_ARV = 1000;
  }
  else if (def == CYTRON)
  {
  UPKEY_ARV = 131;
  DOWNKEY_ARV = 307;
  LEFTKEY_ARV = 480;
  RIGHTKEY_ARV = 0;
  SELKEY_ARV = 723;
  NOKEY_ARV = 1023;
  }
}

fichier DFR_Key.h

#ifndef DFR_Key_h
#define DFR_Key_h

#include "Arduino.h"

#define SAMPLE_WAIT -1
#define NO_KEY 5
#define UP_KEY 1
#define DOWN_KEY 2         <<<<< ici modifier les chiffres 
#define LEFT_KEY 3
#define RIGHT_KEY 0
#define SELECT_KEY 4

class DFR_Key
{
  public:
    DFR_Key(int);
    int getKey();
    void setRate(int);
  private:
    int _refreshRate;
    int _keyPin;
    int _threshold;
    int _keyIn;
    int _curInput;
    int _curKey;
    int _prevInput;
    int _prevKey;
    boolean _change;
    unsigned long _oldTime;
};

#endif

et dans le fichier README

README:

DFRobot LCD Shield for Arduino
Key Grab v0.4
Written by Glendon Klassen
gjklassen@gmail.com
http://www.sourceforge.net/users/ecefixer
http://ecefixer.tumblr.com

Displays the currently pressed key on the LCD screen.

Key Codes (in left-to-right order):

None   - 5
Select - 4
Left   - 3
Up     - 1         <<<< changer ici aussi
Down   - 2
Right  - 0

Changelog:
-Added support for multiple devices, thanks to keithsfg@sf.net.
-Fixed flicker issues in example program.

Example Constructor: DFR_Key keypad(DEVICE);

keypad.getKey();
Grabs the current key.
Returns a non-zero integer corresponding to the pressed key,
  OR
Returns 0 for no keys pressed,
  OR
Returns -1 (sample wait) when no key is available to be sampled.

OPTIONAL
keypad.setRate(x);
Sets the sample rate at once every x milliseconds.
Default: 10ms

je pense que la cause de l'erreur de compilation viens du fichier DFR_Key.cpp,
la ligne d'erreur if (def == DFRKey) y est present que dans celui-ci, reste a trouver la cause, dommage c'etait pas loin, au passage tres tres grand Merci J-M-L pour vos explication instructifs que je vais lire et relire, merci.

Il y a eu un petit bug

Le def devrait être dev le nom de la variable dans le constructeur DFR_Key::DFR_Key(int [color=red]dev[/color]) (dev pour device)

Donc changez soit dev en def à cet endroit: DFR_Key::DFR_Key(int [color=blue]def[/color])

soit corrigez les deux
if ([color=red]def[/color] == DFR_KEY) en if ([color=blue]dev[/color] == DFR_KEY) et
else if ([color=red]def[/color] == CYTRON) en else if ([color=blue]dev[/color] == CYTRON)

Suffit d’utiliser le nom de la variable de manière cohérente dev partout ou def partout mais pas un doux mélange :slight_smile: - ça devrait fixer le pb

Vous etes trop fort J-M-L tres grand Respect, je m'attaque de suite merci encore pour ce grand service.

Dommage pour moi, cela na pas fonctionner :sweat_smile: bon je baisse pas les bras mais je suis epuiser :grin: j’ai perdu le bras de fer faut que je reprenne des forces.

voici l’erreur annoncer :

Arduino : 1.8.4 (Windows 7), Carte : "Arduino/Genuino Uno"

" "C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp" -o "C:\Users\\AppData\Local\Temp\arduino_build_415906\libraries\DFR_Key\DFR_Key.cpp.o"
C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp: In constructor 'DFR_Key::DFR_Key(int)':

C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp:29:14: error: 'DFR_KEY' was not declared in this scope

   if (def == DFR_KEY)

              ^

C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp: At global scope:

C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp:84:38: error: no 'void DFR_Key::setARV(int, int)' member function declared in class 'DFR_Key'

 void DFR_Key::setARV(int key, int dev)

                                      ^


exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

Ah c’est parce que c’est DFROBOT qu’il faut tester

Souvenez vous que dans votre code vous appelez le constructeur comme cela

DFR_Key keypad(0); // Utilise 0 pour le tableau DFRobot et 1 pour le tableau Cytron (?)

DFR_Key::DFR_Key(int dev)
{ 
  _refreshRate = 10;
  _keyPin = DEFAULT_KEY_PIN;
  _threshold = DEFAULT_THRESHOLD;
  _keyIn = NO_KEY;
  _curInput = NO_KEY;
  _curKey = NO_KEY;
  _prevInput = NO_KEY;
  _prevKey = NO_KEY;
  _oldTime = 0;
  
  if (dev == DFROBOT)  // UTILISER DEV et DFROBOT ICI PAS DEF ni DFR_KEY
  {
  UPKEY_ARV = 150;
  DOWNKEY_ARV = 300;
  LEFTKEY_ARV = 460;
  RIGHTKEY_ARV = 50;  
  SELKEY_ARV = 690;
  NOKEY_ARV = 1000;
  }
  else if (dev == CYTRON) // UTILISER DEV ICI PAS DEF
  {
  UPKEY_ARV = 131;
  DOWNKEY_ARV = 307;
  LEFTKEY_ARV = 480;
  RIGHTKEY_ARV = 0;
  SELKEY_ARV = 723;
  NOKEY_ARV = 1023;
  }
}

Je vous remercie pour tout le soutien mais ca ne fonctionne pas, je suis vraiment desoler, voici la modif librairie et le code erreur

static int UPKEY_ARV = 150;
static int DOWNKEY_ARV = 300;
static int LEFTKEY_ARV = 460;
static int RIGHTKEY_ARV = 50;
static int SELKEY_ARV = 690;
static int NOKEY_ARV = 1000;

DFR_Key::DFR_Key(int dev)
{	
  _refreshRate = 10;
  _keyPin = DEFAULT_KEY_PIN;
  _threshold = DEFAULT_THRESHOLD;
  _keyIn = NO_KEY;
  _curInput = NO_KEY;
  _curKey = NO_KEY;
  _prevInput = NO_KEY;
  _prevKey = NO_KEY;
  _oldTime = 0;
  
  if (dev == DFR_KEY)
  {
	  UPKEY_ARV = 150;
	  DOWNKEY_ARV = 300;
	  LEFTKEY_ARV = 460;
	  RIGHTKEY_ARV = 50;
	  SELKEY_ARV = 690;
	  NOKEY_ARV = 1000;
  }
  else if (dev == CYTRON)
  {
	  UPKEY_ARV = 131;
	  DOWNKEY_ARV = 307;
	  LEFTKEY_ARV = 480;
	  RIGHTKEY_ARV = 0;
	  SELKEY_ARV = 723;
	  NOKEY_ARV = 1023;
  }

et l'erreur

Arduino : 1.8.4 (Windows 7), Carte : "Arduino/Genuino Uno"

"C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp" -o "C:\Users\\AppData\Local\Temp\arduino_build_905844\libraries\DFR_Key\DFR_Key.cpp.o"
C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp: In constructor 'DFR_Key::DFR_Key(int)':

C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp:29:14: error: 'DFR_KEY' was not declared in this scope

   if (dev == DFR_KEY)

              ^

C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp: At global scope:

C:\Users\\Documents\Arduino\libraries\DFR_Key\DFR_Key.cpp:84:38: error: no 'void DFR_Key::setARV(int, int)' member function declared in class 'DFR_Key'

 void DFR_Key::setARV(int key, int dev)

                                      ^
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

Mince j"ai fait une erreur, j’ai pas capter les DFROBOT excusez moi !!!