2 arduino uno en serie dans une maquette [Résolu]

Bonjour a tous

Je me présente, Thierry, pseudo Papy94, 57 ans et grand père depuis 3 semaines
Malheureusement, Je pense que je ne pourrais rien vous apporter et que je serais plutôt du type boulet car plutôt manuel, mais j’essayerais de rester discret

Je fais du modélisme ,dans les sous-marin, l’arduino NANO me plait bien pour sa taille, et me paraissait d’un abord facile d’après ce que j’avais lu sur le web

Mon but :
Avec un capteur de pression, gérer des sécurités profondeur maxi, faire monter et descendre les périscopes
Avec un accéléromètre, gérer ce qu’on appelle la pesée du sous-marin (garder niveau horizontal)
Mesurer la tension de ma batterie
Mesurer la température
Définir un niveau d’alarme
J’ai donc écrit un programme, en piochant à droite et à gauche sur le web
Ce programme fonctionne correctement, il ne respect surement pas les conventions d’écritures, mais comme je n’ai jamais appris et que passé les 50 ans les cellules du cerveau se barrent, il ne faut pas m’en vouloir

morceaux du programme explications du fonctionnement et code envois des données
je n'ai pas put coller tout le code de mon programme arduino émission qui fonctionne,je dépasse le nbre de lignes autorisé ,je le met en zip

/* --- Programme Arduino version 1.0.1--- 03/06/2013
 MMA7361 (A7)--> Arduino Nano--< 2 servos(D11,D12) , recepteur voie 8 = (A0)
 permet l'equilibrage automatique du soum si la voie 8 du recepteur est activee
 alimentation du MMA7361 ainsi que les 2 servos en 3.3 volts via l'arduino  niveau = 330
 alimentation du MMA7361 ainsi que les 2 servos en 5 volts via l'arduino    niveau = 570
 
 BMP085 (A4 & A5)(--> Arduino Nano--< servo ballast(D10) et periscope  , recepteur voie 6 = (A1)
 Permet de mettre le servo ballast en position vidange si profondeur maxi depassee, prend la main sur la voie6
 Permet de faire monter ou descendre le periscope en fonction de la profondeur
 
 Detecteur d eau (D5)--> Arduino Nano--< servo ballast(D10)   
 Permet de mettre le servo ballast en position vidange si entree d eau detectee, prend la main sur la voie6
 Permet de mettre le servo barre de plongee en position remontee si entree d eau detectee ou profondeur excesive, prend la main sur la voie3
 
 Relais et ILS--> Arduino Nano--< moteur pompe periscope
 2 Relais, (D8 & D9) pour commande et inversion du moteur pompe
 2 ILS, (D6 & D7) Fin de course du periscope,  coupe le moteur pompe periscope en fin de course
 Alimentation autre que par l'arduino nano,avec le 4,8 volts du recepteur par exemple

 Batterie (A4)--> Arduino Nano--<  Mesure tension
 permet de lire la tension de la batterie et d enclencher une action
    + batterie ---> 1 resistance 3k3 -|
                                      ---> Pin A6 Arduino
    - batterie ---> 1 resistance 1K1 -|
*/



//************************* routines
void Data(){ //pour envoi serial 
  Serial.print(Alarm);Serial.print(";");
  Serial.print(Val_X - Ang_Milieu);Serial.print(";");
  Serial.print(Pression_Relative);Serial.print(";");
  Serial.print(bmp.readTemperature());Serial.print(";");
  Serial.print(Tension)
  Serial.println();

Avec ce programme, j’arrive à sortir sur le serial monitor la trame :
2;-5;565;21.36;7.65

Ce qui correspond à Alarm ;Niveau ;Profondeur ;Temperature ;Tension
3 entiers et 2 floats

J’aimerais rajouter un deuxième NANO relie en serial TX/RX et lui envoyer cette trame et la parser pour pouvoir faire réagir ce deuxième NANO avec les valeurs de la trame,

J’ai essayé le programme de SKYWOOD en essayant de le modifier (merci a lui pour ses exemples), mais je n’y arrive pas, un copain m’a envoyé un programme, mais il ne tourne pas correctement, erreur de variables, et les variables je n’y comprends rien, mon cerveau refuse

// DEFINITIONS
#define SIZE_INFOS 5 //Pour 5 infos de 0 Ã  4

// TABLEAUX GLOBAUX
byte tblInfos[SIZE_INFOS];  // Ici on déclare un tableau de 5 cases, de 0 à  4

//INITIALISATION
void setup() {
   Serial.begin(9600); //Port Tx / Rx par défaut
}

// BOUCLE
void loop() {
   
   //Reception des données
   receptionTrame();
   
   //Traitements
   //ici tblInfos[0] contiendra l'info 1
   //ici tblInfos[1] contiendra l'info 2
   //ici tblInfos[2] contiendra l'info 3
   //ici tblInfos[3] contiendra l'info 4
   //ici tblInfos[4] contiendra l'info 5
   
   delay(90ms);
}


// FONCTION : receptionTrame()
void receptionTrame() {
   int i = 0;
   char *inf[SIZE_INFOS];
   char *ptr, buffer[SIZE_INFOS];   //Buffer
   
   memset(buffer, 0, SIZE_INFOS);   //Mise à  0 du buffer
   
   //Si on a une trame
   if(Serial.available() > 0) {
      
      //Pour chaque caractères reçu
      while(Serial.available() > 0) {
         
         buffer[i] = Serial.read();   //Contenu "read()" dans le buffer
         delay(3);
         ++i;   //Incrémenter - Ici ne pas confondre avec i++.
      }
      
      //Parser les données
      inf[0] = strtok_r(buffer, ";", &ptr);   //Parse la chaine et sort la première info
      
      //Pour toutes les autres infos
      for(int j = 1; j < (SIZE_INFOS); j++) {
         cmds[j] = strtok_r(NULL, ";", &ptr); //Parse la chaine de nouveau et sort la commande suivante
      }
      
      //Transformer chaque commande en plaçant dans le tableau final les infos.
      for(int k = 0; k < (SIZE_INFOS); k++) {
         tblInfos[k] = atoi(cmds[k]);    //Ici Atoi transforme pour sortir du byte.
      }
   }
}

Le code du programme plante avec le cmds[j] ,variable pas déclarée, je ne sais pas quoi mettre comme variable,mes essais ce sont soldées par des echecs

Pouvez-vous m’aider en me guidant vers une solution, soit le programme de SKYWOOD modifié par ces soins pour recevoir ma trame, ou m’aider à corriger l’erreur cmds(y)

Merci d’avance, je vous avais dit que j’étais un boulet

_Platine_NANO_V1.zip (5.38 KB)

bonjour,
beau joujou que tu prépare :slight_smile:
essaye de mettre

for(int j = 1; j < SIZE_INFOS; j++)

je te remercie , mais cela ne change rien

Nano_Recepteur_Geek:52: error: 'cmds' was not declared in this scope
Nano_Recepteur_Geek:57: error: 'cmds' was not declared in this scope

tu ne déclare jamais ton tableau dans le code, tu utuilise cmds sans le déclarer

Je n'ai pas lu toute la discussion donc je ne sais pas trop ce que ça doit etre comme type et combien de chiffres il peut y avoir dedans mais tu dois déclarer un truc dans le genre :

int cmds[20]; //ici je téclare un tableu d'int avec de taille 20

Oui en effet,le tableau n’était pas déclaré,mais ce code comportait d'autres erreurs je pense

j'ai trouvé un autre code qui me satisfait pleinement
donc pour ceux qui comme moi galèrent,je met le code qui fonctionne

donc j’envoie de l'arduino nano emetteur:

 Serial.print("<");
  Serial.print(Alarm);Serial.print(",");
  Serial.print(Val_X - Ang_Milieu);Serial.print(",");
  Serial.print(Pression_Relative);Serial.print(",");
  Serial.print((bmp.readTemperature()*100),0);Serial.print(",");
  Serial.print((Tension*100),0);Serial.print(">");
  Serial.println();

ce qui correspond à : <6,-6,40,2321,470>

et en réception:

#include <SoftwareSerial.h>
SoftwareSerial serial(1, 0); // RX, TX pour Nano

String Trame; // une chaine pour contenir la Trame entrante
boolean TrameRecu = false; // si la Trame a ete recue dans son integralite
int NbrData = 4;
long Jours=0;
long heures=0;
long minutes=0;
long secondes=0;

void setup() {
  // mettre votre code d'installation ici, pour exécuter une fois:
Serial.begin(9600);
}

void loop() {
  // main loop
  handleCommand();
}

void serialEvent(){
  while (Serial.available()) {// obtenir l octet entrant a partir du flux en série
    char incomingByte = (char)Serial.read();
    if (incomingByte == '>'){ // marque la fin d une Trame
       TrameRecu = true;
       return;
    }else if (incomingByte == '<'){ // marque le debut d une nouvelle Trame
       Trame = "";
       TrameRecu = false;
       return;
    }else{
      Trame += incomingByte;
      return;
    }
  }
}

void handleCommand() {
  if (!TrameRecu) return; // aucune Trame pour gérer
  // variables pour contenir l id de la Trame et les données de Trame

  int data[NbrData]; // un maximum de 5 nombres entiers de données
  char cmd[Trame.length()+1];
  Trame.toCharArray(cmd, Trame.length()+1);
  char *token = strtok(cmd, ",");

  // data  
  for (int i = 0; i < NbrData+1; i++) {
    if (token) {
      data[i] = atoi(token);
      token = strtok(NULL, ",");
    }
 }
  
  // test
  CalculTemps();
  Serial.println(Trame);
  Serial.print("data[0] = ");
  Serial.println(data[0]);
  Serial.print("data[1] = ");
  Serial.println(data[1]);
  Serial.print("data[2] = ");
  Serial.println(data[2]);
  Serial.print("data[3] = ");
  Serial.println(data[3]);
  Serial.print("data[4] = ");
  Serial.println(data[4]);
  TrameRecu = false;// drapeau que nous avons traité la commande
}
//-------------- Calcul du temps pour affichage
void CalculTemps()
{
  //long Jours=0;
  //long heures=0;
  //long minutes=0;
  //long secondes=0;
  secondes = millis()/1000; //convect millisecondes en secondes
  minutes=secondes/60; //convertir secondes en minutes
  heures=minutes/60; //convertir minutes en heures
  Jours=heures/24; //convertir heures en Jours
  secondes=secondes-(minutes*60); // soustraire les secondes converties afin d'afficher 59 secondes max 
  minutes=minutes-(heures*60);    //soustraire les minutes converties afin d'afficher 59 minutes max
  heures=heures-(Jours*24);       //soustraire les heures converties afin d'afficher 59 heures max 
  Serial.print(heures);
  Serial.print(":");
  Serial.print(minutes);
  Serial.print(":");
  Serial.print(secondes); 
}//----FIN Calcul du temps pour affichage

et j'ai donc:
6,-10,25,2333,469
data[0] = 6
data[1] = -10
data[2] = 25
data[3] = 2333
data[4] = 469

merci pour votre aide