Communication de variables entre 2 arduino nano

Bonjour à tous !
Dans le cadre d'un projet personnel, je dois faire communiquer des variables entre 2 arduino.
Je m'explique : J'ai un arduino avec un afficheur et un arduino avec des pinces ampèremétriques. Je souhaite communiquer les valeurs mesurés par les pinces à l'autre arduino. Au total, j'ai besoin de transférer 4 variables de type int (juste un nombre qui peut varier de 0 à 10 000) (toutes les 10 secondes environ) . Je ne sais pas trop comment m'y prendre, je débute en arduino.

Je précise que sur un de mes 2 arduino je n'ai que le pin 0 et 1 de disponibles
Merci beaucoup pour votre aide.

Bonjour REDox1248

Même pas A4 et A5, on pourrais faire communiquer les Arduino en i2C.
Sinon, avec uniquement D0 et D1, ça rends la chose plus pénible du fait que ce sont les Tx et Rx de la console (USB).
Pour ce qui est du transfert de tes variables le mieux est de les mettre dans une structure et de transférer cette dernière.

Cordialement
jpbbricole

si vous n'avez pas besoin des ports séries, vous pouvez utiliser D0/D1 (et GND) des 2 côtés pour créer une voie série entre les 2 cartes.

un petit protocole d'échange de données doit être conçu, ça pourrait effectivement être directement en binaire avec une structure ou Alors un protocole ASCII

Pour écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Bonjour REDox1248

J'ai retrouvé un exemple que j'avais fait, via les ports série de 2 Arduino Mega, mais c'est transposable sur Nano. Ca transmet une structure de données.

Cordialement
jpbbricole

Comme la discussion de ce fil l’avait expliqué - envoyer du binaire sans un peu de soin sur la synchro n’est pas très prudent

Merci à tous pour votre aide, j'y vois un peu plus claire.

J'ai regardé l'exemple de jpbbricole et j'ai quelques petites questions :

Pourquoi ajouter ces valeurs coté émetteur ?

		donneesAtransmettre.voltageA += 0.25;
		donneesAtransmettre.voltageB += 1.1;
		donneesAtransmettre.voltageC += 110.02;

Et pour utiliser les valeurs reçu (pour les afficher sur un ecran lcd par exemple, je peux utiliser ça ?
lcd.print(donneesAtransmettre.voltageA);

Et pour la communication on croise le tx et le rx des 2 arduino c'est bien ça ?

Dans tous les cas je teste ça demain et je vous tiens au courant.

Merci beaucoup

Edit : quand je compile le programme, j'obtiens l'erreur suivante
'Serial1' was not declared in this scope
, pourtant j'ai bien déclaré Serial1.begin(115200);

Edit 2: je savais pas que Serial1 = utilisé le 2eme port serie, il y en a qu'un seul sur l'arduino nano

C’était juste pour montrer que ça fonctionne et envoyer des valeurs différentes à chaque tour de loop()

Sinon oui et oui pour les questions (bien sûr il faut aussi connecter les GND)

Pour l’erreur c’est parce que le code était sur MEGA. Sur Uno La communication va se faire sur Serial, il n’y a qu’un seul port série (ne pas ouvrir le moniteur série donc si vous alimentez en USB depuis l’ordinateur )

Le challenge: si pour une raison quelconque un octet venait à se perdre, c’est très difficile de se ré synchroniser ensuite. Si le bavardage entre les 2 Arduinos n’est pas trop fréquent, on peut considérer qu’une pause assez longue dans la communication équivaut à une fin de message cependant

Bonsoir REDox1248

Tu n'as vraiment plus de ports de libre, même dans les analogiques (A0 à A5), pour faire un port série supplémentaire, avec SoftwareSerial?

Cordialement
jpbbricole

@jpbbricole alors non j'ai plus rien de libre mais c'est pas grave, je n'utilise pas la communication serie pour autre chose que televerser le programme donc pas de souci à utiliser le rx et tx.

@J-M-L Merci pour toutes ses infos (le gnd sera commun puisque alimenté via la même alim.
La pause est de 10 sec donc je pense que ça fera l'affaire.

Je n'ai pas la possibilité de tester aujourd'hui, je vous tiens au courant. Merci à tous,

Bonne journée.

OK - donc dans le code de @jpbbricole rajoutez juste une variable qui lit combien d’octets readBytes() à récupéré et comparez cela à la taille de la structure (opérateur sizeof). Ça traitera au moins le cas du timeout de readBytes() avec une structure incomplète.

Idéalement il faudrait rajouter un CRC dans la structure transmise pour vérifier que ce qui a été émis est cohérent avec ce qui est reçu. Et en cas d’erreur il faut décider ce que vous faites (ignorer la trame et attendre la suivante, la redemander etc)

Enfin soignez les câbles et leur connexion et choisissez un débit raisonnable surtout si vous avez des clones arduino avec un CH340. 115200 devrait aller - éventuellement le double - mais si votre structure est petite et que votre application n’est pas hyper gourmande en temps réel alors pas la peine d’aller plus haut.