Dialogue entre deux arduinos

Bonsoir à tous,

Je suis confronté à un problème. J'ai une arduino qui récupère le signal d'une horloge DS3231. J'aimerais envoyer ce signal à une autre carte par liaison RS485.
Bon, la liaison entre les deux fonctionne (j'allume et éteind une led avec retour d'information comme test). Mais je bloque sur l'envoie du signal horloge. Je sais que le signal doit se composer de 7 octets, mais impossible des les envoyer.

Voici le code de mon emetteur (test avec des secondes):

#include <SoftwareSerial.h>
#define SSerialRX  11
#define SSerialTX  12
#define SSerialTxControl  13
#define RS485Transmit  HIGH
#define RS485Receive  LOW
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);
int byteReceive;
int byteSend;
int horloge;


void setup() 
{
  pinMode(SSerialTxControl, OUTPUT);
  
  digitalWrite(SSerialTxControl, RS485Transmit);
  RS485Serial.begin(4800);
  
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
}


void loop() 
{
  DateTime now = RTC.now();
  digitalWrite(SSerialTX, now.second());
  Serial.println(SSerialTX);
  delay(1000);
 }

Si je lis mon serial print qui est mon signal envoyé, je n'ai que des "12" qui s'affichent sur le moniteur série.

Auriez-vous une idée pour m'aiguiller ?

Merci d'avance :slight_smile:

bonjour,
ca ne serait pas quelque chose comme

  RS485Serial.println(now.second());

Si je fais :

Serial.println (now.second());

Je lis bien ce que ma carte récupère, mais je ne sais pas comment l'envoyer a l'autre carte.

si tu veux envoyer via SoftwareSerial il faut utiliser le serial déclaré.
donc teste ce que j'ai mis au dessus.

Tu remplaces Serial par RS485Serial puisque c'est le nom que tu as donnée à ta liaison série RS485

Si je fais

void loop() 
{
  DateTime now = RTC.now();
  RS485Serial.println(now.second());
  delay(1000);
 }

je n'ai rien qui s'affiche dans mon moniteur série de l'émetteur.

gg25:
Si je fais

void loop() 

{
  DateTime now = RTC.now();
  RS485Serial.println(now.second());
  delay(1000);
}



je n'ai rien qui s'affiche dans mon moniteur série de l'émetteur.

c'est normal que rien ne s'affiche dans la console.
tu confonds pas mal de choses en fait.
la liaison serie normal avec la console ET la liaison serie entre les deux arduino.
si tu veux afficher dans la console, il faut rajouter

Serial.println (now.second());
  RS485Serial.println(now.second());

sert a envoyer A L'AUTRE arduino les données.

si tu es certain que tout fontionne du coté de l'émetteur, penche toi sur ce que recoit le récepteur, il n'y a que de ce coté où tu pourras vérifier maintenant

Oui, je me suis rendu compte après que je m'étais trompé sur l'utilisation du Serial.

Voici mes deux codes,

emetteur

#include <SoftwareSerial.h>  // Inclure librarie "SoftwareSerial.h"
#define SSerialRX  11        // Broche 11 pour RX
#define SSerialTX  12        // Broche 12 pour TX
#define SSerialTxControl  13 // Broche 13 pour selection envoie ou reception
#define RS485Transmit  HIGH  // Etat haut pour transmission RS485
#define RS485Receive  LOW    // Etat bas pour reception RS485
#include <Wire.h>            // Inclure librairie "Wire.h"
#include <RTClib.h>          // Inclure librairie "RTClib.h"

RTC_DS1307 RTC;              // Declarer DS3231 comme DS1307

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);  // Assigner les broches RX et TX a RS485Serial
int byteReceive;
int byteSend;
int horloge;


void setup() 
{
  pinMode(SSerialTxControl, OUTPUT);  // Defnir SSerialTxControl comme port de sortie
  
  digitalWrite(SSerialTxControl, RS485Transmit);  // Indiquer que SSerialTxControl est en transmission
  RS485Serial.begin(4800);  // Demarrer liaison RS485 a 4800 bauds
  
  Serial.begin(9600);  // Demarrer Serial a 9600 bauds
  Wire.begin();  // Demarrer librairie "Wire"
  RTC.begin();  // Demarrer librairie "RTC"
}


void loop() // On souhaite recuperer l'heure du DS3132 et l'envoyer sur RS485Serial
{
  DateTime now = RTC.now();  // Lire l'heure du module
  RS485Serial.println(now.second());  // Envoyer les secondes sur RS485Serial
  delay(1000);  // Delais pour lire dans le moniteur serie (a enlever en fn de prototypage)
 }

recepteur :

#include <SoftwareSerial.h>  // Inclure librairie "SoftwareSerial.h"
#define SSerialRX  11        // Broche 11 pour RX
#define SSerialTX  12        // Broche 12 pour TX
#define SSerialTxControl  13 // Broche 13 pour selection envoie ou reception
#define RS485Transmit HIGH   // Etat haut pour transmission RS485
#define RS485Receive LOW     // Etat bas pour reception RS485
#include <Wire.h>            // Inclure librairie "Wire.h"
#include <RTClib.h>          // Inclure librairie "RTClib.h"

RTC_DS1307 RTC;              // Declarer DS3231 comme DS1307

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);  // Assigner les broches RX et TX a RS485Serial
int byteReceive;
int byteSend;


void setup()
{
  pinMode(SSerialTxControl, OUTPUT);  // Definir SSerialTxControl comme port de sortie
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Indiquer que SSerialTxControl est en reception
  RS485Serial.begin(4800);  // Demarrer liaison RS485 a 4800 bauds
  
  Serial.begin(9600);  // Demarrer Serial à 9600 bauds
  Wire.begin();  // Demarrer librairie "Wire"
  RTC.begin();  // Demarrer librairie "RTC"
}
  
  
void loop()  // On veut lire ce qui arrive sur RS485
{
  
  Serial.println(RS485Serial);  // Lire ce qui arrive sur RS485serial
}

Je n'obtiens que des 1 sur le moniteur série du récepteur.

Faudrait peut-être tester s'il y a des caractères qui sont arrivés avant de faire afficher.
Voir là: https://www.arduino.cc/en/Reference/SoftwareSerialAvailable

normal, tu confonds encore.
essaye ca

void loop()  // On veut lire ce qui arrive sur RS485
{
while (RS485Serial.available()>0)[
  
  Serial.println(RS485Serial.read());  // Lire ce qui arrive sur RS485serial
}

 }

C'est bien ?

void loop()  // On veut lire ce qui arrive sur RS485
{
  while (RS485Serial.available()>0)
  {
  Serial.println(RS485Serial.read());  // Lire ce qui arrive sur RS485serial
  }
}

C'est déjà un peu mieux, j'obtiens en boucle la suite :
13
10
98
111
110
106
111
117
114

c'est ce que j'avais marqué en code :wink:
maintenant, c'est à toi de voir ce qui est envoyé, nous, on est pas derrière ton écran :slight_smile:

Pourrais-tu m’expliquer le rôle de la boucle While ?

Peut-on afficher sur le moniteur série de l'émetteur ce que l'on envoie sur l'autre carte ? (Pour contrôler que tout est bon)

Tu fais un Serial.print de ce que tu veux voir.

Autrement ce que tu reçois en boucle c'est bonjour donc si c'est ce que tu envoies c'est bon. Sinon tu es en contact avec un alien qui veut discuter avec toi.