Arduino+4DSystem activer une partie ou l'autre d'un programme

Bonjour,
J’ai besoin d’aide pour mon projet de STI2D, mon projet est un bac de transport automatisé que l’on peut utiliser en mode " manuel" ou “autonome” je m’occupe de la partie manuel et mon collègue de la partie autonome.

Dans ma partie j’ai fais une application avec App Inventor, puis j’ai fait mon programme tout fonctionne bien après plusieurs essaies j’ai trouver le programme fonctionnel. Mais je suis maintenant confronté a un problème que je ne sais régler alors je viens vous demander de l’aide.

J’explique : J’ai besoin de compiler dans un programmes mon programme et celui de mon collègue, et je dois avec un écran ainsi que 4D System créer des boutons sur l’écran ( Manuel ou autonome ) et en fonction de ce que l’on choisit le programme arduino doit activer soit mon programme soit celui de mon collègue.

J’ai commencé a faire un programme basé sur un TP que nous avons effectuées mais le problème c’est que je peut activer un mode la première fois ensuite c’est comme-ci le programme restais bloqué sur la dernière info reçu, si par exemple je choisis mode manuel, le mode manuel s’active et si j’appuie sur un bouton par exemple pour avancer les moteurs vont avancer et jamais s’arrêter et impossible d’envoyer une autre information le programme reste sur la première reçu.

Demandez moi si vous avez besoin de plus d’infos car je ne sais pas trop quoi dire de plus…

Merci d’avance de vos réponses.

Voici mon programme actuelle :

#include <genieArduino.h>
#include <SoftwareSerial.h>

Genie genie;
SoftwareSerial DisplaySerial(2,3);      //SoftwareSerial mySerial(10, 11); // RX, TX
#define RESETLINE 4  // Change this if you are not using an Arduino Adaptor Shield Version 2 (see code below)



//Définition des entrées sorties
const int MOTEUR_GAUCHE = 13;
const int MOTEUR_DROIT = 12;
const int VITESSE_MGAUCHE = 11;
const int VITESSE_MDROIT = 3;
//Déclaration des variables
word w; //mot qui reçoit les trames émises




void setup()
{

// Configuration du moteur A (droit)
pinMode (12, OUTPUT); // Déclenche le canal du moteur
pinMode (9, OUTPUT); // Démarre le canal de frein

// Configuration moteur B (gauche)
pinMode (13,OUTPUT);
pinMode (8,OUTPUT);


Serial.begin(9600); //vitesse de transmission

DisplaySerial.begin(9600);
genie.Begin(DisplaySerial);

genie.AttachEventHandler(myGenieEventHandler); // Attach the user function Event Handler for processing events


pinMode(RESETLINE, OUTPUT);  // Set D4 on Arduino to Output (4D Arduino Adaptor V2 - Display Reset)
digitalWrite(RESETLINE, 1);  // Reset the Display via D4
delay(100);
digitalWrite(RESETLINE, 0);  // unReset the Display via D4

delay (100); //let the display start up after the reset (This is important)

genie.WriteContrast(1); 


}




void loop()
{  
   
genie.DoEvents(); // This calls the library each loop to process the queued responses from the display



}



void myGenieEventHandler(void)
{
genieFrame Event;
genie.DequeueEvent(&Event); // Remove the next queued event from the buffer, and process it below





if (Event.reportObject.cmd == GENIE_REPORT_EVENT)
{
  if (Event.reportObject.object == GENIE_OBJ_WINBUTTON)                 
 { 
    if (Event.reportObject.index == 0)                             
  {

recevoir();
if (w==1) // avancer
{
digitalWrite(MOTEUR_DROIT,HIGH);
analogWrite (VITESSE_MDROIT, 255); 
digitalWrite(MOTEUR_GAUCHE,HIGH);
analogWrite (VITESSE_MGAUCHE, 255);

}
if (w==2) // tourner à gauche
{
digitalWrite(MOTEUR_GAUCHE,LOW);
analogWrite (VITESSE_MGAUCHE, 0);
digitalWrite(MOTEUR_DROIT,HIGH);
analogWrite (VITESSE_MDROIT, 255);

}
if (w==3) // tourner à droite
{
digitalWrite(MOTEUR_GAUCHE,HIGH);
analogWrite (VITESSE_MGAUCHE, 255);
digitalWrite(MOTEUR_DROIT,LOW);
analogWrite (VITESSE_MDROIT, 0);

}
if (w==4) // arrêt
{
digitalWrite(MOTEUR_DROIT,LOW);
analogWrite (VITESSE_MDROIT, 0);
digitalWrite(MOTEUR_GAUCHE,LOW);
analogWrite(VITESSE_MGAUCHE, 0);   //Spins the motor on Channel A at half speed
}
if (w==5) // reculer
{
digitalWrite(MOTEUR_DROIT,LOW); // Inverser
analogWrite (VITESSE_MDROIT, 255);
digitalWrite(MOTEUR_GAUCHE,LOW); // Inverser
analogWrite (VITESSE_MGAUCHE, 255); // Tourne le moteur sur le canal A à pleine vitesse
}


}


if (Event.reportObject.index == 1)
{ 

// prog Alexis

}
}
}
}
  



//  //procédure qui lit les trames de la tablette
void recevoir(){
if (Serial.available()) {
w=Serial.read();
Serial.flush();
}
}

bonjour,
code entre balise code </>

fais un SerialPrintln(w) pour voir le retour de ce que tu recois

 recevoir();
if (w==1) // avancer

mais à mon avis ca serait un truc du genre

 recevoir();
if (w=="1") // avancer
..
..
...
if (w=="2")

Bonjour,

Cette partie du programme c'est ma partie, je l'ai testé seule, elle fonctionne parfaitement, c'est comme si le bouton sur l'écran découpais le loop c'est a dire qu'a chaque fois que j'appuie sur une flèche directionnelles qui est sur mon application il faut que je clique pour activer le mode manuel, ça active la dernière infos reçu et ça stock les suivantes pour les faire une par une c'est à dire a chaque fois que j'active et désactive le mode manuel ça fait les direction une par une et moi je voudrais pouvoir faire les direction en directe comme une télécommande quoi.

Merci de votre réponse rapide tout de même.

points et retour à la ligne feront une explication plus compréhensible pour nous, merci.

si tu veux que lorsque tu appuie sur le mode manuel et qu’il le reste tant que tu ne l’as pas désactivé, il faut une variable le lui indiquant.

explique un peu mieux en faisant un diagramme par exemple de ce que tu veux faire, car c’est flou.

PS
edite ton 1er post pour mettre le code entre balise code </> pour plus de lisibilité

Bonjour, excusez moi pour la mise en page, j’ai édité mon post.

J’ai aussi mis en pièce jointe une image de mon diagramme qui ne concerne que mon programme.

Alors voila mon programme fonctionnel testé et approuvé :

//Définition des entrées sorties
const int MOTEUR_GAUCHE = 13;
const int MOTEUR_DROIT = 12;
const int VITESSE_MGAUCHE = 11;
const int VITESSE_MDROIT = 3;
//Déclaration des variables
word w; //mot qui reçoit les trames émises


void setup(){
// Configuration du moteur A (droit)
pinMode (12, OUTPUT); // Déclenche le canal du moteur

  
// Configuration moteur B (gauche)
pinMode (13,OUTPUT);



Serial.begin(9600); //vitesse de transmission
}

void loop () {
  
  recevoir();
if (w==1) // avancer
{
digitalWrite(MOTEUR_DROIT,HIGH);
analogWrite (VITESSE_MDROIT, 255);
digitalWrite(MOTEUR_GAUCHE,HIGH);
analogWrite (VITESSE_MGAUCHE, 255);

}
if (w==2) // tourner à gauche
{
digitalWrite(MOTEUR_GAUCHE,LOW);
analogWrite (VITESSE_MGAUCHE, 0);
digitalWrite(MOTEUR_DROIT,HIGH);
analogWrite (VITESSE_MDROIT, 255);

}
if (w==3) // tourner à droite
{
digitalWrite(MOTEUR_GAUCHE,HIGH);
analogWrite (VITESSE_MGAUCHE, 255);
digitalWrite(MOTEUR_DROIT,LOW);
analogWrite (VITESSE_MDROIT, 0);

}
if (w==4) // arrêt
{
digitalWrite(MOTEUR_DROIT,LOW);
analogWrite (VITESSE_MDROIT, 0);
digitalWrite(MOTEUR_GAUCHE,LOW);
analogWrite(VITESSE_MGAUCHE, 0);   //Spins the motor on Channel A at half speed
}
if (w==5) // reculer
{
digitalWrite(MOTEUR_DROIT,LOW); // Inverser
analogWrite (VITESSE_MDROIT, 255);
digitalWrite(MOTEUR_GAUCHE,LOW); // Inverser
analogWrite (VITESSE_MGAUCHE, 255); // Tourne le moteur sur le canal A à pleine vitesse
}


}
//procédure qui lit les trames de la tablette
void recevoir(){
if (Serial.available()) {
w=Serial.read();
Serial.flush();
}
}
//The end

Ma question est de savoir comment faire pour combiner mon programme et un autre, et avec 4D System et un écran LCD choisir quel programme activer.

C’est à dire de faire un bouton qui activerais mon programme et un autre bouton pour activer le programme de mon collègue (je n’ai pas encore son programme en ma possession).

Avec le premier programme que j’ai mis pour essayer donc de combiner les programme lorsque que j’active le mode manuel c’est pour un seul évènement que je dois activer et désactiver pour passer a l’information suivante.

Je vais essayer de déclaré la variable de cet évènement pour essayer de le mémoriser et qu’il n’y est plus besoin d’activer/désactiver pour changer l’information reçu.

Merci de vos réponses.