#include //Déclaration des trois liaisons série soft de la brique esclave. La quatrième liaison est la liaison hard SoftwareSerial soft1(A3,A2); SoftwareSerial soft2(6,5); SoftwareSerial soft3(9,10); //Déclaration des pins pour handshake des quatre liaisons const int in1 = A5; const int out1 = A4; const int in2 = 8; const int out2 = 7; const int in3 = 11; const int out3 = 12; const int in4 = 2; const int out4 = 3; //Indique si un premier message a été reçu ou non int prem = 0; //Indique sur quelle liaison se trouve la brique maitre int papa = 0; //Potentiomètre, pour une potentielle utilisation future int potar = A0; //Id et type de la brique. A modifier si l'on veut changer l'un ou l'autre. char id = 0b00110001; void setup() { //Initialiser les quatres liaisons série, les pins du handshake en input/output, et mettre les valeurs par défaut sur les out. Serial.begin(9600); soft1.begin(9600); soft2.begin(9600); soft3.begin(9600); pinMode(in1,INPUT); pinMode(out1,OUTPUT); pinMode(in2,INPUT); pinMode(out2,OUTPUT); pinMode(in3,INPUT); pinMode(out3,OUTPUT); pinMode(in4,INPUT); pinMode(out4,OUTPUT); digitalWrite(out1,LOW); digitalWrite(out2,LOW); digitalWrite(out3,LOW); digitalWrite(out4,LOW); } void loop() { //Message qui sera envoyé par la brique String msg=""; //Variable stockant chaque octet reçu char inByte='a'; //Pour les délais int tps; int timeout; //Indique par quel port série le message a été reçu int fin1=0,fin2=0,fin3=0,fin4=0; //Lecture du pin handshake à high sur un des quatres port, ce qui veut dire qu'une demande de communication est envoyée. //Chacune des quatre sections qui suivent sont presque entièrement identiques, la seule variation est le port lu. if(digitalRead(in1)==HIGH){ //Protocole d'écoute sur une liaison série digitalWrite(out1,HIGH); soft1.listen(); timeout=0; tps=millis(); while(soft1.available()<=0 && timeout<1000){ timeout= millis() - tps; } if(timeout<1000){ fin1=1; while(inByte != '\n'){ inByte = soft1.read(); if(inByte !='\n'){ msg += inByte; delay(10); } } //Si c'est le premier message reçu, on attribue au port correspondant le statut de père, c'est dans cette direction qu'est la brique maitre. if(prem==0){ prem=1; papa=1; msg += id; if((id & 0xF0) ==0x60) msg += '{'; //char pour 123 //0x60 correspond à une brique if, insèrer ici le code pour lire un potentiomètre (valeur à comparer) else if((id & 0xF0) ==0x40) msg += 0b00000100; //0x40 correspond à une brique début while, insèrer ici le code pour lire un potentiomètre (nombre de boucles à exécuter) msg += '\n'; } else msg+= '\n'; } digitalWrite(out1, LOW); delay(50); } //Voir ci-dessus pour les détails else if(digitalRead(in2)==HIGH){ digitalWrite(out2,HIGH); soft2.listen(); timeout=0; tps=millis(); while(soft2.available()<=0 && timeout<1000){ timeout= millis() - tps; } if(timeout<1000){ fin2=1; while(inByte != '\n'){ inByte = soft2.read(); if(inByte !='\n'){ msg += inByte; delay(10); } } if(prem==0){ prem=1; papa=2; msg += id; if((id & 0xF0) ==0x60) msg += '{'; //char pour 123 else if((id & 0xF0) ==0x40) msg += 0b00000100; msg += '\n'; } else msg+= '\n'; } digitalWrite(out2, LOW); delay(50); } //Voir ci-dessus pour les détails else if(digitalRead(in3)==HIGH){ digitalWrite(out3,HIGH); soft3.listen(); timeout=0; tps=millis(); while(soft3.available()<=0 && timeout<1000){ timeout= millis() - tps; } if(timeout<1000){ fin3=1; while(inByte != '\n'){ inByte = soft3.read(); if(inByte !='\n'){ msg += inByte; delay(10); } } if(prem==0){ prem=1; papa=3; msg += id; if((id & 0xF0) ==0x60) msg += '{'; //char pour 123 else if((id & 0xF0) ==0x40) msg += 0b00000100; msg += '\n'; } else msg+= '\n'; } digitalWrite(out3, LOW); delay(50); } //Voir ci-dessus pour les détails else if(digitalRead(in4)==HIGH){ digitalWrite(out4,HIGH); timeout=0; tps=millis(); while(Serial.available()<=0 && timeout<1000){ timeout= millis() - tps; } if(timeout<1000){ fin4=1; while(inByte != '\n'){ inByte = Serial.read(); if(inByte !='\n'){ msg += inByte; delay(10); } } if(prem==0){ prem=1; papa=4; msg += id; if((id & 0xF0) ==0x60) msg += '{'; //char pour 123 else if((id & 0xF0) ==0x40) msg += 0b00000100; msg += '\n'; } else msg+= '\n'; } digitalWrite(out4, LOW); delay(50); } //Si on a reçu un message sur un port, on le renvoie sur tous. //Comme ci-dessus, les quatres sections suivantes sont identiques. if(fin1==1 || fin2==1 || fin3==1 || fin4==1){ //Si le père est dans cette direction, ou si le message ne provient pas de cette direction, on y envoie la chaine if((fin1==1 && papa == 1) || (fin1 == 0)){ //Début du protocole d'envoi timeout=0; tps = millis(); while(timeout<1000){ digitalWrite(out1,HIGH); timeout= millis() - tps; if(fin1==1) timeout=0; if(digitalRead(in1)==HIGH){ soft1.print(msg); soft1.flush(); timeout = 1001; } } digitalWrite(out1,LOW); //Fin de l'envoi série } //Identique à celui-ci dessus if((fin2==1 && papa == 2) || (fin2 == 0)){ timeout=0; tps = millis(); while(timeout<1000){ digitalWrite(out2,HIGH); timeout= millis() - tps; if(fin2==1) timeout=0; if(digitalRead(in2)==HIGH){ soft2.print(msg); soft2.flush(); digitalWrite(out2,LOW); timeout = 1001; } } digitalWrite(out2,LOW); } //Identique à celui-ci dessus if((fin3==1 && papa == 3) || (fin3 == 0)){ timeout=0; tps = millis(); while(timeout<1000){ digitalWrite(out3,HIGH); timeout= millis() - tps; if(fin3==1) timeout=0; if(digitalRead(in3)==HIGH){ soft3.print(msg); soft3.flush(); digitalWrite(out3,LOW); timeout = 1001; } } digitalWrite(out3,LOW); } //Identique à celui-ci dessus if((fin4==1 && papa == 4) || (fin4 == 0)){ timeout=0; tps = millis(); while(timeout<1000){ digitalWrite(out4,HIGH); timeout= millis() - tps; if(fin4==1) timeout=0; if(digitalRead(in4)==HIGH){ Serial.print(msg); Serial.flush(); digitalWrite(out4,LOW); timeout = 1001; } } digitalWrite(out4,LOW); } } }