Programme_arduino_esclave 6.86 KB
#include <SoftwareSerial.h>

//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);
    }
  }
}