Le cahier des charges indique qu’une seule lampe est susceptible d’être allumée à la fois. Lorsque l’un des interrupteurs [I1, I2] est actionné (I1=1, I2=0 ou bien I1=0, I2=1), alors on allume la lampe qui lui correspond avec une priorité égale. Un GRAFCET à séquences multiples semble le plus adapté à notre automatisme. La Figure illustre un GRAFCET de la commande des lampes.
bool Etapes[NumEtapes]; word Inputs[NumIn]; word Outputs[NumOut]; bool Trans[NumTrans];
void setup() { // Initialisation du port série - Affichage des états des étapes Serial.begin(9600);
// Initialisation des étapes & les E/S InitStateIO(Etapes, NumEtapes, Inputs, NumIn, Outputs, NumOut); }
void loop() { // 1. Activation des sorties SetOutputs(Etapes, Outputs);
// 2. Lecture des entrées GetInputs(Inputs);
// 3. Calcul des transitions ComputeTrans(Etapes, Trans);
// 4. Mise à jour des étapes SetupStates(Etapes, Trans);
// Observation des états des lampes Serial.print("Lampe_1= ");Serial.print(Outputs[0]); Serial.print(", Lampe_2= ");Serial.println(Outputs[1]); //delay(100); }
void InitStateIO(bool *Etapes, word numEtapes, word *Inputs,word numIn, word *Outputs, word numOut) { // Désactivation des étapes for(word i=0;i<numEtapes;i++) Etapes[i]=false;
// Activation d'une ou plusieurs étapes par défaut Etapes[0]=true;
// Initialisation des entrées for(word i=0;i<numIn;i++) Inputs[i]=false;
// Initialisation des sorties for(word i=0;i<numOut;i++) Outputs[i]=false;
// Init des pins des entrées pinMode(2, INPUT); pinMode(3, INPUT);
// Init des pins des sorties pinMode(4, OUTPUT); pinMode(5, OUTPUT); }
// Mise à jour des sorties Arduino digitalWrite(4,Outputs[0]); // Logique négative:!Outputs[0] digitalWrite(5,Outputs[1]); // Logique négative:!Outputs[1] }