Communication entre arduino et un IHM

Bonjour à tous,

J'aimerais faire un transfert de message entre l'arduino et un IHM (Interface Homme Machine). L'IHM est considéré comme le maître et l'arduino comme l'esclave. Les message à transmettre sont du type 00, 01, 02, 03... .
Tant que l'arduino ne reçois pas de message, il fait rien. Dès qu'il reçois le message 00 de la part de l'IHM, il déclenche le test des tensions de référence qui se fait par la fonction run_tension_test que j'ai créée moi même.
Voilà ci-dessous le bout de code correspondant.

if (msg_recu = 00) // Si message reçu est égal à 00
  {
    run_tension_test = true ; // fonction de test des tensions de références initialement à false
  }

Ma question est comment associer le message reçu avec la communication serial de l'arduino ? Et aussi, j'avais déclaré msg_recu comme étant un entier mais cela ne marche pas.
Est ce que quelqu'un peut m'expliquer comment bien construire la syntaxe de la liaison que je souhaite établir ?

Je vous remercie d'avance pour vos réponse !

Bonsoir

Pour information : il y a sur la ligne suivante une incohérence entre le commentaire et le code qui le précède :

if (msg_recu = 00) // Si message reçu est égal à 00

Ecrire comme cela pour tester l'égalité :

if (msg_recu == 00) // Si message reçu est égal à 00

et bien sûr il faudrai connaître le type de la variable msg_recu... si c'est une String il faut des guillemets, si c'est une cString, il faut utiliser strcmp() (ou similaire). Si c'est un nombre, attention un nombre commençant par 0 est en octal.

Bonjour @al1fch , effectivement je me suis trompé en mettant un seul égal sur le forum mais j'avais bien mis == dans mon code arduino :slight_smile:

Bonjour @J-M-L ,

La variable msg_recu est un string. Mais le problème en est que je ne sais pas comment "liée" cette variable au Serial de l'aruino pour qu'il puisse identifier le message reçu...

C’est un bon tuto effectivement :slight_smile:

Je trouve le tuto très intéressant !

J'ai essayé de relier les message reçu au port série de la manière suivante:

Serial.readBytes(msg_recu);
  if (msg_recu == 00)
  {
    run_tension_test = true ;
  }

Je pensais qu'avec cette méthode, l'arduino pourrait lire le message reçu et lancer le test mais la première ligne de ce code pose problème...

Je crois que j'ai trouvé la bonne commande maintenant.

int msg_recu = Serial.available();
  if (msg_recu == 00)
  {
    run_tension_test = true ;
  }

Est ce que vous êtes d'acord avec moi ? :slight_smile:

non...

Serial.available() dit combien d'octets sont disponibles en lecture....

qu'est-ce que vous allez envoyer sur le port série ?

avez vous lu le tuto ? pourquoi ne pas le mettre en application ?

Bonjour victorelec

Si c'est une String, il faut la convertir en int

int msg_recu_index = msg_recu.toInt();

Ensuite sélectionner l'action à exécuter en fonction de l'index de la commande (msg_recu_index) avec un switch (msg_recu_index)

switch (msg_recu_index)
{
	case 0:
		// Qu faire si commande = 0
		break;
	case 1:
		// Qu faire si commande = 1
		break;
	case 2:
		// Qu faire si commande = 2
		break;
	default:
		// Qu faire si commande inconnue
	break;
}

Cordialement
jpbbricole

Petite note si nécessaire: attention toInt() va retourner 0 s'il 'arrive pas à décoder un entier et donc tout message erroné fera exécuter la commande 0

En utilisant strtol() sur msg_recu.c_str() on aura plus de latitude pour détecter une erreur éventuelle.

idéalement on se passera de la classe String comme dans le tuto.

Bonjour J-M-L

Il est vrai que dans ce genre de "mécanique" il faut éviter "00" comme commande.
Mon propos était surtout de démontrer comment passer d'une String à une sélection de fonction avec switch.

Elle a le mérite d'exister, et fonctionne très bien pour gérer des commandes entre un utilisateur et l'Arduino.

Cordialement
jpbbricole

jusqu'à ce qu'elle ne fonctionne plus très bien comme déjà discuté :wink:

Mon tuto montre comment gérer des commandes et propose même le code pour cela en s'en passant et éviter tous les problèmes associés.

Bonjour @jpbbricole et merci pour votre message. C'est très intéressant ! j'en tiens compte :slight_smile:

OK, c'est noté. Merci :slight_smile:

En matière de développement informatique on arrive rarement à réaliser de grandes chose en restant cantonné dans son petit code personnel et ses petites habitudes, sans apprendre des autres.

Bonsoir hbachetti

En langage Arduino, j'ai quasiment tout appris des autres, mais il faut aussi avoir son libre arbitre et ne pas tout prendre des "experts".
Je fais partie des gens, comme tu dis, qui développent "sur le coin de la table", qui sont quand même la majorité des pratiquants de ce forum et je ne pense pas faire du mauvais travail.
Maintenant quand à réaliser de "grandes choses" je ne sait pas ce que ça veut dire.

Cordialement
jpbbricole

Ton refus d'appliquer les conseils des "experts" et d'apprendre d'eux tendrait à prouver le contraire.

Tout simplement des projets complexes, y compris monstrueux, et en équipe.

Je pense que dans un bureau d'étude, si tu étais intégré dans une équipe de développeurs chevronnés et rigoureux, tu ne tiendrais pas la semaine.
Dans un projet sérieux, ton code serait examiné par les autres membres de l'équipe, et critiqué. En cas de refus de ta part d'appliquer les conseils des gourous, tu serais rapidement mis au placard, sur des projets de seconde zone.
J'ai connu certaines personnes à qui c'est arrivé :woozy_face:

Bonsoir hbachetti

C'est ce genre de propos qui me fait penser que tu est totalement en dehors de la réalité de ce qu'est le monde de l'Arduino :woozy_face:.

Bonne soirée
Cordialement
jpbbricole