#include <TM1637.h>
#include <LiquidCrystal_I2C.h>
const String NameARD = "ARD_001";
#define LCD_COLUMNS 20
#define LCD_LINES 4// 4
LiquidCrystal_I2C lcdModeIN(0x01, LCD_COLUMNS, LCD_LINES);
#define LCD_COLUMNS 20
#define LCD_LINES 4// 4
LiquidCrystal_I2C lcdModeOUT(0x02, LCD_COLUMNS, LCD_LINES);
#define LCD_COLUMNS 20
#define LCD_LINES 4// 4
LiquidCrystal_I2C lcd(0x03, LCD_COLUMNS, LCD_LINES);
int ModePertIN = 0;
int ModeLongueurIN = 0;
int ModePertIN_n1 = 0;
int ModeLongueurIN_n1 = 0;
int ConfigRelaisPert=0;
int ConfigRelaisLong = 0;
const int MODE_PERT = 11;
const int NB_RELAY_PERT = 16;
int TabModeOUT[MODE_PERT][NB_RELAY_PERT] =
//Mode 0
{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//0 à 220m
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//220 m à 440 m
{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},//440 m à 660 m
{1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0},//660 m à 880 m
{1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0},//880 m à 1100 m
//Mode 1
{0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0},//0 à 220m
{1,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0},//220 m à 440 m
//Mode 2
{0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,1},//0 à 220m
//Mode 3
{0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0},//0 à 220m
{1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0},//220 m à 440 m
//Mode 4
{0,1,0,1,1,0,1,1,1,0,1,0,1,0,1,0}};//0 à 220m
const int NB_LINE = 5;
String TabLigneUtil[MODE_PERT][NB_LINE] =
//Mode 0
{{"UT","NC","NC","NC","NC"},//0 à 220m
{"FULL","UT","NC","NC","NC"},//220 m à 440 m
{"FULL","FULL","UT","NC","NC"},//440 m à 660 m
{"FULL","FULL","FULL","UT","NC"},//660 m à 880 m
{"FULL","FULL","FULL","FULL","UT"},//880 m à 1100 m
//Mode 1
{"UT","NC","UT","NC","NC"},//0 à 220m
{"FULL","UT","FULL","UT","NC"},//220 m à 440 m
//Mode 2
{"UT","UT","UT","UT","UT"},//0 à 220m
//Mode 3
{"UT","NC","NC","NC","UT"},//0 à 220m
{"FULL","UT","NC","UT","FULL"},//220 m à 440 m
//Mode 4
{"UT","UT","UT","UT","UT"}};//0 à 220m
const int MODE_LONG = 11;
const int NB_RELAY_LONG = 16;
int TabLongueurOUT[12][11] =
{{0,1,1,0,0,0,0,0,1,1,0},//0
{1,0,1,0,0,0,0,0,1,1,0},//20
{1,1,0,0,0,0,0,0,1,1,0},//40
{1,1,1,1,0,1,0,0,1,1,0},//60
{1,0,1,1,1,0,0,0,1,1,0},//80
{1,1,0,1,1,0,0,0,1,1,0},//100
{1,1,1,1,0,0,0,1,1,1,0},//120
{1,0,1,1,0,0,1,1,1,1,0},//140
{1,1,0,1,0,0,1,1,1,1,0},//160
{1,1,1,1,0,0,1,1,0,1,0},//180
{1,1,1,1,0,0,1,1,1,0,0},//200
{1,1,1,1,0,0,1,1,1,1,1}};//220
const int OUT_RY_PERT_D = 33;
const int OUT_RY_PERT_F = 48;
const int OUT_RY_LINE_A_D = 11;
const int OUT_RY_LINE_A_F = 21;
const int OUT_RY_LINE_B_D = 22;
const int OUT_RY_LINE_B_F = 32;
const int OUT_RY_LINE_C_D = 33;
const int OUT_RY_LINE_C_F = 43;
const int OUT_RY_LINE_D_D = 11;
const int OUT_RY_LINE_D_F = 21;
const int OUT_RY_LINE_E_D = 22;
const int OUT_RY_LINE_E_F = 32;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
int i =0;
int numSortie =0;
//Init out relais perturbation
for (i=OUT_RY_PERT_D;i<OUT_RY_PERT_F+1;i++)//configuration sortie relais Ligne A
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);//LOW
}
//Init out relais Line B ou E
for (i=OUT_RY_LINE_B_D;i<OUT_RY_LINE_B_F+1;i++)//configuration sortie relais Ligne A
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
lcdModeIN.init();
lcdModeIN.backlight();
lcdModeOUT.init();
lcdModeOUT.backlight();
lcd.init();
lcd.backlight();
ModePertIN_n1 = 8;//en binaire 1000
ModeLongueurIN_n1 = 127;//en binaire 111 1111
}
void loop() {
// put your main code here, to run repeatedly:
//Lit le mode de test voulu
ModePertIN = !digitalRead(4)*4 + !digitalRead(3)*2 + !digitalRead(2);
//Lit la longueur de ligne voulue
ModeLongueurIN = !digitalRead(10)*32 +!digitalRead(9)*16 +!digitalRead(8)*8 +
!digitalRead(7)*4 + !digitalRead(6)*2 + !digitalRead(5);
if((ModePertIN_n1 != ModePertIN)|(ModeLongueurIN_n1 != ModeLongueurIN))
{
ModePertIN_n1 = ModePertIN;
ModeLongueurIN_n1 = ModeLongueurIN;
lcdModeIN.clear();
if((ModePertIN)<=4)
{
lcdModeIN.setCursor(0, 0);
lcdModeIN.print("Mode Pert IN : " + String(ModePertIN));
}
else
{
lcdModeIN.setCursor(0, 0);
lcdModeIN.print("Mode Pert IN : NOK");
}
if((ModeLongueurIN*20)<=1100)
{
lcdModeIN.setCursor(0, 1);
lcdModeIN.print("Longueur IN : " + String(ModeLongueurIN*20));
}
else
{
//lcdModeIN.clear();
lcdModeIN.setCursor(0, 1);
lcdModeIN.print("Longueur IN : NOK");
}
//Détermine le sous mode de test pour identifier la configuration des 5 longueurs de ligne
ConfigRelaisPert=0;
ConfigRelaisLong = 0;
switch (ModePertIN)
{
case 0 :
ModePert_n0();
//test cablage relai line
// String ryline ="";
// for (int j=0;j<11;j++)
// {
// int EtatRelais = TabLongueurOUT[0][j];
// ryline = ryline + String(EtatRelais);
// //numSortie = 53-i*2;
// digitalWrite(22+j, EtatRelais);
// }
// lcdModeIN.setCursor(0, 2);
// lcdModeIN.print("RY line: " + String(ryline));
//fin test cablage relai line
//test cablage relai pert
// for (int i=0;i<NB_RELAY_PERT;i++)
// {
// int EtatRelais = TabModeOUT[2][i];
// int numSortie = OUT_RY_PERT_D + i;
// digitalWrite(numSortie, EtatRelais);
// }
// //test cablage relai pert
break;
case 1 :
ModePert_n1();
break;
case 2 :
ModePert_n2();
break;
case 3 :
ModePert_n3();
break;
case 4 :
ModePert_n4();
break;
case 5 :
case 6 :
case 7 :
lcdModeOUT.clear();
lcd.clear();
break;
}
lcdModeOUT.clear();
lcdModeOUT.setCursor(0, 0);
lcdModeOUT.print("Conf pert OUT : " + String(ConfigRelaisPert));
lcdModeOUT.setCursor(0, 2);
lcdModeOUT.print("Conf line OUT : " + String(ConfigRelaisLong));
FCConfigRelaisPert();
FCConfigRelaisLong();
}
}
void ModePert_n0()
{
//Sélection la configuration des relais OUT pertubation et longueur
//selon le mode de perturbation et la longueur de ligne souhaitée
if (ModeLongueurIN <=11)
{
ConfigRelaisPert = 0;
ConfigRelaisLong = ModeLongueurIN;
}
if ((ModeLongueurIN >11)&(ModeLongueurIN <=22))
{
ConfigRelaisPert = 1;
ConfigRelaisLong = (ModeLongueurIN % 12)+1;
}
if ((ModeLongueurIN >22)&(ModeLongueurIN <=33))
{
ConfigRelaisPert = 2;
ConfigRelaisLong = (ModeLongueurIN % 23)+1;
}
if ((ModeLongueurIN >33)&(ModeLongueurIN <=44))
{
ConfigRelaisPert = 3;
ConfigRelaisLong = (ModeLongueurIN % 34)+1;
}
if ((ModeLongueurIN >44)&(ModeLongueurIN <=55))
{
ConfigRelaisPert = 4;
ConfigRelaisLong = (ModeLongueurIN % 45)+1;
}
}
void ModePert_n1()
{
//Sélection la configuration des relais OUT pertubation et longueur
//selon le mode de perturbation et la longueur de ligne souhaitée
if (ModeLongueurIN <=11)
{
ConfigRelaisPert = 5;
ConfigRelaisLong = ModeLongueurIN;
}
if ((ModeLongueurIN >11)&(ModeLongueurIN <=22))
{
ConfigRelaisPert = 6;
ConfigRelaisLong = (ModeLongueurIN % 12)+1;
}
}
void ModePert_n2()
{
//Sélection la configuration des relais OUT pertubation et longueur
//selon le mode de perturbation et la longueur de ligne souhaitée
if (ModeLongueurIN <=11)
{
ConfigRelaisPert = 7;
ConfigRelaisLong = ModeLongueurIN;
}
}
void ModePert_n3()
{
//Sélection la configuration des relais OUT pertubation et longueur
//selon le mode de perturbation et la longueur de ligne souhaitée
if (ModeLongueurIN <=11)
{
ConfigRelaisPert = 8;
ConfigRelaisLong = ModeLongueurIN;
}
if ((ModeLongueurIN >11)&(ModeLongueurIN <=22))
{
ConfigRelaisPert = 9;
ConfigRelaisLong = (ModeLongueurIN % 12)+1;
}
}
void ModePert_n4()
{
//Sélection la configuration des relais OUT pertubation et longueur
//selon le mode de perturbation et la longueur de ligne souhaitée
if (ModeLongueurIN <=11)
{
ConfigRelaisPert = 10;
ConfigRelaisLong = ModeLongueurIN;
}
}
void FCConfigRelaisPert()
{
//Pilote les sorties relais selon le mode de perturbation
int i = 0;
int EtatRelais = 0;
int numSortie = 0;
uint32_t poidsbitHigh =32768;
int valPertOUT = 0;
int Debut_Rel_Pert= 33;//port D33 ARD_002
for (i=0;i<NB_RELAY_PERT;i++)
{
EtatRelais = TabModeOUT[ConfigRelaisPert][i];
numSortie = OUT_RY_PERT_D + i;
digitalWrite(33+i, EtatRelais);
valPertOUT = valPertOUT + poidsbitHigh*EtatRelais;
poidsbitHigh = poidsbitHigh/2;
}
String ryline ="";
for (int j=0;j<NB_RELAY_PERT;j++)
{
int EtatRelais = TabLongueurOUT[ConfigRelaisPert][j];
ryline = ryline + String(EtatRelais);
//numSortie = 53-i*2;
//digitalWrite(22+j, EtatRelais);
}
lcdModeIN.setCursor(0, 3);
lcdModeIN.print("RP:" + String(ryline));
lcdModeOUT.setCursor(0, 1);
lcdModeOUT.print("R.P. OUT : " + String(valPertOUT,HEX));
}
void FCConfigRelaisLong()
{
//Pilote les sorties relais selon la longueur de ligne
int i = 0;
int EtatRelais = 0;
int numSortie = 0;
uint32_t poidsbitHigh =1024;
int valLongOUT = 0;
int Debut_Ligne_A= 11;//port D11 ARD_001
int Debut_Ligne_B= 22;//port D22 ARD_001
int Debut_Ligne_C= 33;//port D33 ARD_001
int Debut_Ligne_D= 11;//port D11 ARD_002
int Debut_Ligne_E= 22;//port D22 ARD_002
//ConfigRelaisLong
for (i=0;i<11;i++)
{
EtatRelais = TabLongueurOUT[ConfigRelaisLong][i];
//numSortie = 53-i*2;
valLongOUT = valLongOUT + poidsbitHigh*EtatRelais;
poidsbitHigh = poidsbitHigh/2;
//digitalWrite(numSortie, EtatRelais);
}
lcdModeOUT.setCursor(0, 3);
lcdModeOUT.print("R.L. OUT : " + String(valLongOUT,HEX));
// TabLigneUtil[11][5] =
// //Mode 0
// {{"UT","NC","NC","NC","NC"},//0 à 220m
// const int NB_RELAY_LONG = 16;
// int TabLongueurOUT[12][11] =
// {{0,1,1,0,0,0,0,0,1,1,0},//0
// String EtatLigne = "";
// for(i=0;i<5;i++)
// {
// EtatLigne = TabLigneUtil[ConfigRelaisPert][i];
// if (EtatLigne=="FULL")
// {
// if(i==1)
// {
// for (int j=0;j<11;j++)
// {
// EtatRelais = TabLongueurOUT[22+j][11];
// //numSortie = 53-i*2;
// digitalWrite(22+j, EtatRelais);
// }
// }
// }
// else if (EtatLigne=="NC")
// {
// EtatRelais = TabLongueurOUT[ConfigRelaisLong][0];
// }
// else if (EtatLigne=="UT")
// {
// // for(int j=0;j<11;j++)
// // {
// // if (valLongOUT ==0)
// // {
// // EtatRelais = TabLongueurOUT[ConfigRelaisLong][0];
// // //numSortie = 53-i*2;
// // //digitalWrite(numSortie, EtatRelais);
// // }
// // else
// // {
// // char data[4]="ARD1";
// // if (NameARD == "ARD_001")
// // {
// // EtatRelais = TabLongueurOUT[ConfigRelaisLong][j];
// // }
// // if (NameARD == "ARD_002")
// // {
// // EtatRelais = TabLongueurOUT[ConfigRelaisLong][j];
// // }
// // }
// // }
// }
// }
lcd.clear();
String cfline = "A:"+TabLigneUtil[ConfigRelaisPert][0]+",";
cfline = cfline + "B:"+TabLigneUtil[ConfigRelaisPert][1]+",";
cfline = cfline + "C:"+TabLigneUtil[ConfigRelaisPert][2]+",";
cfline = cfline + "D:"+TabLigneUtil[ConfigRelaisPert][3]+",";
cfline = cfline + "E:"+TabLigneUtil[ConfigRelaisPert][4];
// Print something
lcd.setCursor(0, 0);
//lcd.print("Hello, world!");
lcd.print(cfline);
//delay(500);
}
Mode perturbation (IN)
Longueur de ligne (IN)
RY1
RY11
RY10
RY9
RY8
RY7
RY6
RY5
RY2
RY4
RY3
20-1
20-2
20-3
20-4
20-5
60-1
60-2
RY56
RY57
RY58
RY59
RY60
RY61
RY62
RY63
RY64
RY65
RY66
RY67
RY68
RY69
RY70
RY71
EST 1
Line A
Line B
Line C
Line D
Line E
EST 1
EST 4
EST 3
EST 2
EST 5
PERT
EST 2
EST 3
EST 4
EST 5
PERT