Lire le port Série et exécuter une action

Bonjour à tous,

Voila après des tas de recherche je trouve pas mon bonheur.
Voici ce que je voudrais faire et qui est presque fonctionnel mais j'ai des gros problème de latence meme en changeant le Baud

_ ouvrir le port série
_ envoyer un caractère ASCII
_ exécuter une action exemple (relais 1, on)
Ca fonctionne mais pas toujours, il faut parfois que je relance le caractère plusieurs fois.

J'ai donc ajouter un retour d'etat de l'action via serialprintln...
Je me disais donc que si mon action ne fonctionne pas, comme par exemple pas de message serialprintl alor recommence l'action.

Es ce possible ? et comment si c'est possible? :confused:

Pour info c'est surement possible d'améliorer le code mais je débute et j'apprend aussi a me servir de visualstudio qui me permet de gérer ce projet.

Merci pour votre aide :slight_smile:

//définition des controles de la bonne communication relais
#define VERSION "Gestion dob - V0.1 - 13/03/2019 Raphaël Mahaut"
#define RELAIS1OPEN "Résistance primaire 1/2 en chauffe"
#define RELAIS2OPEN "Résistance primaire 2/2 en chauffe"
#define RELAIS3OPEN "Résistance secondaire en chauffe"
#define RELAIS4OPEN "Ventilation en marche"
#define RELAIS5OPEN "Scope sous tension"
#define RELAIS6OPEN "ASI 071 sous tension"
#define RELAIS7OPEN "ASI 174 sous tension"
#define RELAIS8OPEN "Résistance PO en chauffe"

#define RELAIS1FERME "Résistance primaire 1/2 coupée"
#define RELAIS2FERME "Résistance primaire 2/2 coupée"
#define RELAIS3FERME "Résistance secondaire coupée"
#define RELAIS4FERME "Ventilation coupée"
#define RELAIS5FERME "Scope hors tension"
#define RELAIS6FERME "ASI 071 hors tension"
#define RELAIS7FERME "ASI 174 hors tension"
#define RELAIS8FERME "Résistance PO coupée"

#include "DRV8825.h"



//partie Relais (a supprimer si pas besoins)
#define Relais1 2   //sortie 1 de la carte sur la PIN2
#define Relais2 9   //sortie 2 de la carte sur la PIN3
#define Relais3 10  //sortie 3 de la carte sur la PIN4
#define Relais4 11  //sortie 4 de la carte sur la PIN5
#define Relais5 12  //sortie 5 de la carte sur la PIN6
#define Relais6 A2   //sortie 6 de la carte sur la PIN7 
#define Relais7 A0   //sortie 7 de la carte sur la PIN8 
#define Relais8 A1  //sortie 8 de la carte sur la PIN10 // attention pas la PIN 9 réservé au servo
// ajouter le VCC de la carte relais sur le +5v de la carte arduino
// ajouter les GND de la carte relais sur le GND de la carte arduino



#define nbr_de_pas_moteur 200              //définition du nombre de pas moteur pour faire 1 tour
#define ouverture -1800            // nombre de pas pour aller chercher le prochain filtre -1800
#define fermeture 1800                  // nombre de Filtre dans la roue


// Declaration des pins du module dvb8825
#define DIR 3     // Pin sens de rotation "direction" 
#define STEP 4    // Pin de lancement du moteur "Step" 
#define ENBL 8    // Pin allumage 'Enable" 
#define MODE0 5
#define MODE1 6
#define MODE2 7

DRV8825 moteur(nbr_de_pas_moteur, DIR, STEP, ENBL, MODE0, MODE1, MODE2);

void setup() 
{
  Serial.flush();
  Serial.begin(9600);  // Réglage pour le port USB, Ascom...
  MAISON();            //initialisation de la roue
  Serial.println(VERSION);
  moteur.disable();    //désactive le moteur et évite la chauffe
  //partie Relais (a supprimer si pas besoins)
  pinMode(Relais1, OUTPUT);   //déclaration en sortie1 de la PIN relais 
  pinMode(Relais2, OUTPUT);   //déclaration en sortie2 de la PIN relais 
  pinMode(Relais3, OUTPUT);   //déclaration en sortie3 de la PIN relais 
  pinMode(Relais4, OUTPUT);   //déclaration en sortie4 de la PIN relais 
  pinMode(Relais6, OUTPUT);   //déclaration en sortie5 de la PIN relais 
  pinMode(Relais7, OUTPUT);   //déclaration en sortie6 de la PIN relais 
  pinMode(Relais8, OUTPUT);   //déclaration en sortie7 de la PIN relais 
  pinMode(Relais5, OUTPUT);   //déclaration en sortie8 de la PIN relais 
  digitalWrite(Relais1,HIGH); // activer le relais1 HIGH ou désactive par LOW
  digitalWrite(Relais2,HIGH); // activer le relais2 HIGH ou désactive par LOW
  digitalWrite(Relais3,HIGH); // activer le relais3 HIGH ou désactive par LOW
  digitalWrite(Relais4,HIGH); // activer le relais4 HIGH ou désactive par LOW
  digitalWrite(Relais5,HIGH); // activer le relais5 HIGH ou désactive par LOW
  digitalWrite(Relais6,HIGH); // activer le relais6 HIGH ou désactive par LOW
  digitalWrite(Relais7,HIGH); // activer le relais7 HIGH ou désactive par LOW
  digitalWrite(Relais8,HIGH); // activer le relais8 HIGH ou désactive par LOW
}

void loop() 
{
  char c;

  if (Serial.available() >0) 
  {
   c = Serial.read();
    if (c == 'o') ouvre();  
    if (c == 'f') ferme();
  }
    if (Serial.available() > 0) { // si des données entrantes sont présentes
    char ser = Serial.read();
    switch(ser){


//commande des relais a supprimer su pas besoin
// ici il faut creer une fonction pour chaque action disponible en bas du scketch
// 2 void loop sont creer pour allumer (Void onPIN) ou éteindre (Void offPIN)
      case 'a':  onPin(Relais1); Serial.println(RELAIS1OPEN); break; //Résistance primaire 1/2 en chauffe
      case 'b':  onPin(Relais2); Serial.println(RELAIS2OPEN); break; //Résistance primaire 2/2 en chauffe
      case 'c':  onPin(Relais3); Serial.println(RELAIS3OPEN); break; //Résistance secondaire en chauffe
      case 'd':  onPin(Relais4); Serial.println(RELAIS4OPEN); break; //Ventilation en marche
      case 'e':  onPin(Relais5); Serial.println(RELAIS5OPEN); break; //Scope sous tension
      case 'i':  onPin(Relais6); Serial.println(RELAIS6OPEN); break; //ASI 071 sous tension
      case 'g':  onPin(Relais7); Serial.println(RELAIS7OPEN); break; //ASI 174 sous tension
      case 'h':  onPin(Relais8); Serial.println(RELAIS8OPEN); break; //Résistance PO en chauffe


      
      case '1': offPin(Relais1); Serial.println(RELAIS1FERME); break;
      case '2': offPin(Relais2); Serial.println(RELAIS2FERME); break;
      case '3': offPin(Relais3); Serial.println(RELAIS3FERME); break;
      case '4': offPin(Relais4); Serial.println(RELAIS4FERME); break;
      case '5': offPin(Relais5); Serial.println(RELAIS5FERME); break;
      case '6': offPin(Relais6); Serial.println(RELAIS6FERME); break;
      case '7': offPin(Relais7); Serial.println(RELAIS7FERME); break;
      case '8': offPin(Relais8); Serial.println(RELAIS8FERME); break;
      }}
}


//déclaration des voids de commande pour les relais 

//void ouverture
void onPin(int8_t pin) {
  digitalWrite(pin, LOW); 
}

//void fermeture
void offPin(int8_t pin) {
  digitalWrite(pin, HIGH);
}


//désactivation du moteur non utilisé
void MAISON()    
{
  moteur.disable();    // On désactive le moteur 
}

//programme ouverture
void ouvre() 
{
  int Move = ouverture;
  moteur.enable();
  moteur.setRPM(200);       //vitesse de rotation pour le moteur 200
  moteur.setMicrostep(1);
  moteur.move(Move); 
  moteur.disable();
  Serial.print(Move); 
  Serial.println("#");  
}

//programme fermeture
void ferme() 
{
  int Move2 = fermeture;
  moteur.enable();
  moteur.setRPM(200);       //vitesse de rotation pour le moteur 200
  moteur.setMicrostep(1);
  moteur.move(Move2); 
  moteur.disable();
  Serial.print(Move2); 
  Serial.println("#");  
}

Bonjour,

Pourquoi il y a deux Serial.read() ?
Pourquoi le traitement 'o' et 'f' ne fait pas partie du switch ?
Si tu reçois un 'a' par exemple, il a de grandes chances d'être perdu puisqu'il va être lu par le premier Serial.read()

Kamill Merci <3

Affaire résolue et mon projet est maintenant hyper rapide
Je remet le code après un nettoyage et tenant de tes commentaires
Merci beaucoup

//définition des controles de la bonne communication relais
#define VERSION "Gestion dob - V0.1 - 13/03/2019 Raphaël Mahaut"
#define RELAIS1OPEN "Résistance primaire 1/2 en chauffe"
#define RELAIS2OPEN "Résistance primaire 2/2 en chauffe"
#define RELAIS3OPEN "Résistance secondaire en chauffe"
#define RELAIS4OPEN "Ventilation en marche"
#define RELAIS5OPEN "Scope sous tension"
#define RELAIS6OPEN "ASI 071 sous tension"
#define RELAIS7OPEN "ASI 174 sous tension"
#define RELAIS8OPEN "Résistance PO en chauffe"

#define RELAIS1FERME "Résistance primaire 1/2 coupée"
#define RELAIS2FERME "Résistance primaire 2/2 coupée"
#define RELAIS3FERME "Résistance secondaire coupée"
#define RELAIS4FERME "Ventilation coupée"
#define RELAIS5FERME "Scope hors tension"
#define RELAIS6FERME "ASI 071 hors tension"
#define RELAIS7FERME "ASI 174 hors tension"
#define RELAIS8FERME "Résistance PO coupéé"

#include "DRV8825.h"

//partie Relais (a supprimer si pas besoins)
#define Relais1 2   //sortie 1 de la carte sur la PIN2
#define Relais2 9   //sortie 2 de la carte sur la PIN3
#define Relais3 10  //sortie 3 de la carte sur la PIN4
#define Relais4 11  //sortie 4 de la carte sur la PIN5
#define Relais5 12  //sortie 5 de la carte sur la PIN6
#define Relais6 A2   //sortie 6 de la carte sur la PIN7 
#define Relais7 A0   //sortie 7 de la carte sur la PIN8 
#define Relais8 A1  //sortie 8 de la carte sur la PIN10 // attention pas la PIN 9 réservé au servo
// ajouter le VCC de la carte relais sur le +5v de la carte arduino
// ajouter les GND de la carte relais sur le GND de la carte arduino

#define nbr_de_pas_moteur 200              //définition du nombre de pas moteur pour faire 1 tour
#define ouverture -1800            // nombre de pas pour aller chercher le prochain filtre -1800
#define fermeture 1800                  // nombre de Filtre dans la roue

// Declaration des pins du module dvb8825
#define DIR 3     // Pin sens de rotation "direction" 
#define STEP 4    // Pin de lancement du moteur "Step" 
#define ENBL 8    // Pin allumage 'Enable" 
#define MODE0 5
#define MODE1 6
#define MODE2 7

DRV8825 moteur(nbr_de_pas_moteur, DIR, STEP, ENBL, MODE0, MODE1, MODE2);

void setup() 
{
  Serial.flush();
  Serial.begin(9600);  // Réglage pour le port USB, Ascom...
  MAISON();            //initialisation de la roue
  Serial.println(VERSION);
  moteur.disable();    //désactive le moteur et évite la chauffe
  //partie Relais (a supprimer si pas besoins)
  pinMode(Relais1, OUTPUT);   //déclaration en sortie1 de la PIN relais 
  pinMode(Relais2, OUTPUT);   //déclaration en sortie2 de la PIN relais 
  pinMode(Relais3, OUTPUT);   //déclaration en sortie3 de la PIN relais 
  pinMode(Relais4, OUTPUT);   //déclaration en sortie4 de la PIN relais 
  pinMode(Relais6, OUTPUT);   //déclaration en sortie5 de la PIN relais 
  pinMode(Relais7, OUTPUT);   //déclaration en sortie6 de la PIN relais 
  pinMode(Relais8, OUTPUT);   //déclaration en sortie7 de la PIN relais 
  pinMode(Relais5, OUTPUT);   //déclaration en sortie8 de la PIN relais 
  digitalWrite(Relais1,HIGH); // activer le relais1 HIGH ou désactive par LOW
  digitalWrite(Relais2,HIGH); // activer le relais2 HIGH ou désactive par LOW
  digitalWrite(Relais3,HIGH); // activer le relais3 HIGH ou désactive par LOW
  digitalWrite(Relais4,HIGH); // activer le relais4 HIGH ou désactive par LOW
  digitalWrite(Relais5,HIGH); // activer le relais5 HIGH ou désactive par LOW
  digitalWrite(Relais6,HIGH); // activer le relais6 HIGH ou désactive par LOW
  digitalWrite(Relais7,HIGH); // activer le relais7 HIGH ou désactive par LOW
  digitalWrite(Relais8,HIGH); // activer le relais8 HIGH ou désactive par LOW
}

void loop() 
{
  if (Serial.available() >0){
  char c = Serial.read();
  if (c == 'o') ouvre();  
  if (c == 'f') ferme();
  switch(c){

// 2 void loop sont creer pour allumer (Void onPIN) ou éteindre (Void offPIN)
      case 'a':  onPin(Relais1); Serial.println(RELAIS1OPEN); break; //Résistance primaire 1/2 en chauffe
      case 'b':  onPin(Relais2); Serial.println(RELAIS2OPEN); break; //Résistance primaire 2/2 en chauffe
      case 'c':  onPin(Relais3); Serial.println(RELAIS3OPEN); break; //Résistance secondaire en chauffe
      case 'd':  onPin(Relais4); Serial.println(RELAIS4OPEN); break; //Ventilation en marche
      case 'e':  onPin(Relais5); Serial.println(RELAIS5OPEN); break; //Scope sous tension
      case 'i':  onPin(Relais6); Serial.println(RELAIS6OPEN); break; //ASI 071 sous tension
      case 'g':  onPin(Relais7); Serial.println(RELAIS7OPEN); break; //ASI 174 sous tension
      case 'h':  onPin(Relais8); Serial.println(RELAIS8OPEN); break; //Résistance PO en chauffe

      case '1': offPin(Relais1); Serial.println(RELAIS1FERME); break;
      case '2': offPin(Relais2); Serial.println(RELAIS2FERME); break;
      case '3': offPin(Relais3); Serial.println(RELAIS3FERME); break;
      case '4': offPin(Relais4); Serial.println(RELAIS4FERME); break;
      case '5': offPin(Relais5); Serial.println(RELAIS5FERME); break;
      case '6': offPin(Relais6); Serial.println(RELAIS6FERME); break;
      case '7': offPin(Relais7); Serial.println(RELAIS7FERME); break;
      case '8': offPin(Relais8); Serial.println(RELAIS8FERME); break;

      }}
}

//déclaration des voids de commande pour les relais 
//void ouverture
void onPin(int8_t pin) {
  digitalWrite(pin, LOW); 
}

//void fermeture
void offPin(int8_t pin) {
  digitalWrite(pin, HIGH);
}

//désactivation du moteur non utilisé
void MAISON()    
{
  moteur.disable();    // On désactive le moteur 
}

//programme ouverture
void ouvre() 
{
  int Move = ouverture;
  moteur.enable();
  moteur.setRPM(200);       //vitesse de rotation pour le moteur 400
  moteur.setMicrostep(1);
  moteur.move(Move); 
  moteur.disable();
  Serial.print(Move); 
  Serial.println("Porte Ouverte");  
}

//programme fermeture
void ferme() 
{
  int Move2 = fermeture;
  moteur.enable();
  moteur.setRPM(200);       //vitesse de rotation pour le moteur 400
  moteur.setMicrostep(1);
  moteur.move(Move2); 
  moteur.disable();
  Serial.print(Move2); 
  Serial.println("Porte fermée");  
}