I want to make an arduino project with several files .h and .cpp. i have a couple of file Menu.h/Menu.cpp and another one couple RELAIS.h/RELAIS.cpp. The compiler doesn’t work ith this code. Please correct those four codes for working together : 
//Menu.h
#ifndef Menu_H
#define Menu_H
#include <Keypad.h>
#include <Arduino.h>

extern const byte ROWS = 4;
extern const byte COLS = 4;
extern byte rowPins[ROWS] = { 33, 32, 31, 30 };
extern byte colPins[COLS] = { 29, 28, 27, 26 };
extern char key;

extern char keys[ROWS][COLS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};

extern Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void Initialisation_LCD();
void mainMenu();
void relaisMenu();
int getKeypadValue(int minVal, int maxVal, char* infoText);
void infoMenu();
void showTemps();
void showHumidity();

#endif
//Menu.cpp
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RELAIS.h"
#include "Menu.h"
#include <Arduino.h>

char key = 0;
//Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 20, 4);

void Initialisation_LCD(){
Wire.begin();
lcd.init();
lcd.noBacklight();
}

void mainMenu() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("A-Relais  B-Info");
  lcd.setCursor(0, 1);
  lcd.print("D-Quit");

  char key = keypad.waitForKey();
  switch (key) {
    case 'A': relaisMenu(); break;
    case 'B': infoMenu(); break;
    case 'D': lcd.clear(); lcd.noBacklight(); break;
  }
}

void relaisMenu() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Entrez numero relai #");

  int relai_choisi = getKeypadValue(1, Relais_Nb, "Entrez numero relai #");
  relai_choisi = relai_choisi - 1 ;
  lcd.setCursor(0, 1);
  lcd.print("A:ON/OFF B:TIMER ");
  lcd.setCursor(0, 2);
  lcd.print("C:Program D:Exit ");

bool exitFlag = false;
while (!exitFlag) {
  char key = keypad.waitForKey();
  int value;

  switch (key) {
    case 'A':
      Relais_Statut[relai_choisi] = !Relais_Statut[relai_choisi];
      break;

    case 'B':
      value = getKeypadValue(0, 999, "Enter Timer:");
      if (value > -1) {
        Relais_Statut[relai_choisi] = 1;
        Relais_Timer[relai_choisi] = value;
      }
      break;

    case 'C':
          Relais_Prog[relai_choisi] = 1;
          value = getKeypadValue(0, 24, "Enter Heure PH:");
      if (value > -1) {
        Relais_ProgH[relai_choisi] = value;
        value = getKeypadValue(0, 60, "Enter Min PH:");
        if (value > -1) {
          Relais_ProgM[relai_choisi] = value;
          Relais_ProgT[relai_choisi] = getKeypadValue(1, 999, "Enter Duration:");
        }
      }
      break;

    case 'D':
      exitFlag = true;
      lcd.clear();
      lcd.noBacklight();
      break;
  }
}
}

int getKeypadValue(int minVal, int maxVal, char* infoText) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(infoText);
  lcd.setCursor(0, 1);
  lcd.print("A-VALIDER D-QUITTER");
  
  int value = 0;
  bool exitFlag = false;
  while (!exitFlag) {
    char key = keypad.waitForKey();

    if (key >= '0' && key <= '9') {
      int newVal = value * 10 + (key - '0');
      if (newVal >= minVal && newVal <= maxVal) {
        value = newVal;
        lcd.print(key);
      }
    } else if (key == 'D') {
      return -1; // Annuler l'entrée
    } else if (key == 'A') {
      exitFlag = true;
    }
  }

  return value;
}

void infoMenu() {
  // Gérer l'affichage et l'interaction avec le menu d'informations
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("A-Temp   B-Hum");
  lcd.setCursor(0, 1);
  lcd.print("D-Quit");

  bool quit = false;
  while (!quit) {
    char key = keypad.waitForKey();
    switch (key) {
      case 'A': showTemps(); break;
      case 'B': showHumidity(); break;
      case 'D': quit = true; break;
    }
  }
}

void showTemps() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T1:");
 // lcd.print(temp1, 1);
  lcd.setCursor(0, 1);
  lcd.setCursor(0, 4);
  lcd.print("D-Quit");

char key;
do {
  key = keypad.waitForKey();
} while (key != 'D');
}
void showHumidity() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("H1:");
//  lcd.print(hum1, 1);

  lcd.print("D-Quit");

  char key;
  do {
    key = keypad.waitForKey();
  } while (key != 'D');
}

//RELAIS.h
#ifndef RELAIS_H
#define RELAIS_H

extern const int Relais_Nb = 8;
extern const int Relai_Depart = 34;

extern int Relais_Pin[Relais_Nb];
extern int Relais_Statut[Relais_Nb];
extern int Relais_Timer[Relais_Nb];
extern int Relais_Prog[Relais_Nb];
extern int Relais_ProgH[Relais_Nb];
extern int Relais_ProgM[Relais_Nb];
extern int Relais_ProgT[Relais_Nb];
extern int Relais_Tension[Relais_Nb];
extern int Relais_Intensite[Relais_Nb];
extern int Relais_Puissance[Relais_Nb];

void Initialisation_Relais();
void updateRelayState(int relay, bool state);
void MAJ_timer();

#endif

//RELAIS.cpp
#include "RELAIS.h"
#include <Arduino.h>
#include "Menu.h"
/*
Relais_Pin[Relais_Nb] = {34, 35, 36, 37, 38, 39, 40, 41};
Relais_Statut[Relais_Nb] = {0};
Relais_Timer[Relais_Nb] = {0};
Relais_Prog[Relais_Nb] = {0};
Relais_ProgH[Relais_Nb] = {0};
Relais_ProgM[Relais_Nb] = {0};
Relais_ProgT[Relais_Nb] = {0};
Relais_Tension[Relais_Nb] = {0};
Relais_Intensite[Relais_Nb] = {0};
Relais_Puissance[Relais_Nb] = {0};
*/

void Initialisation_Relais() {
  for (int i = 0; i < Relais_Nb; i++) {
    Relais_Pin[i] = Relai_Depart + i;
    pinMode(Relais_Pin[i], OUTPUT);
    updateRelayState(i, LOW);
  }
}

void updateRelayState(int relay, bool state) {
//if (state == HIGH) state = LOW; else state = HIGH;
//  if (tension >= Tension_min) {
//    float tension_avant = lireTensionBatterie();
//    float intensite_avant = mesure_intensite(pintIntensite1);
    digitalWrite(Relais_Pin[relay], state);
    Relais_Statut[relay] = state;
    delay(100);
    if (state == HIGH) {
      //Relais_Tension[relay] = lireTensionBatterie() - tension_avant;
      //Relais_Intensite[relay] = mesure_intensite(pintIntensite1) - intensite_avant;
      //Relais_Puissance[relay] = lireTensionBatterie() * intensite_relai[relay];
    } else {
      Relais_Tension[relay] = 0;
      Relais_Intensite[relay] = 0;
      Relais_Puissance[relay] = 0;
    }
  }
//}

void MAJ_timer() {
  for (int i = 0; i < Relais_Nb; i++) {
    if (Relais_Timer[i] > 0) {
      Relais_Timer[i]--;
      if (Relais_Timer[i] == 0) {
        //updateRelayState(i, LOW);***************************************************************************************************
      }
    }
  }
}

/*
void coupure_urgence() {
  if (tension <= Tension_min) {
    for (int i = 0; i < NUM_RELAYS; i++) {
      if (forcing[i] == 0) {
        timer[i] = 0;
        updateRelayState(i, LOW);
      }
    }
  }
}
*/