En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies pour vous proposer des contenus et services adaptés. Mentions légales.
 
Vous êtes ici :   Accueil » Tranferer et Parser
 
    Imprimer la page...
    Imprimer la section...
 

Tranferer et Parser

Transferer et Parser des données Arduino

2 Arduino NANO en série

06/2013

Le branchement

platine_08.jpg



3 câbles suffiront

  • 1 entre les masses de chaque carte  (carte 1 et carte 2)
  • 1 entre le TX de la carte 1 et le RX de carte 2
  • 1 entre le RX de la carte 1 et le TX de carte 2

Donc voici les codes que j'utilise pour avec ma 2ieme carte Arduino NANO

Les données que je veux recevoir sont:
_le numéro d'alarm
_le niveau (angle de mon soum)
_la profondeur du soum
_la temperature interne
_la tension batterie

c'est le numéro d’alarme reçu qui fait réagir ma 2ieme carte Arduino NANO
Alarm = 0 : RAS -> LedVerte();
Alarm = 1 : Periscope Haut -> LedVerte();
Alarm = 2 : Periscope Bas -> LedVerte();
Alarm = 3 : Accelerometre -> LedBleu();
Alarm = 4 : Profondeur Maxi -> Vidange(); LedBleu();
Alarm = 5 : Temperature -> Arret(); Vidange(); Remonte(); LedRouge();
Alarm = 6 : Batterie Faible -> Arret(); Vidange(); Remonte(); LedRouge();
Alarm = 7 : Perte de signal radio -> Arret(); Vidange(); Remonte(); LedRouge();
Alarm = 8 : Eau dans compartiment -> Arret(); Vidange(); Remonte(); LedRouge();

les autres paramètres seront simplement envoyés sur la carte SD, pour analyse

Sur ma 1ere carte Arduino NANO
mes variables sont déclarées comme ça:

int Alarm = 0;// variable pour Numero d alarm
int Val_X = 0;// variable pour angle X accelerometre 3 axes MMA7361 (sorties analogiques)
int Pression_Relative;// Difference de Pression entre la Surface et la Pression lut
float Tension = 0;//variable tension batterie

et j’envoie comme ça:

  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();

Pour la pression relative et le bmp.readTemperature,je multiplie par 100, pour envoyer un chiffre sans virgule
la trame envoyée ressemble donc a ceci : <1;-3;16;2294;531>
'<' = le début de la trame
'>' = la fin de la trame
';' = délimiteur des données


Sur ma 2ieme carte Arduino NANO

/*carte Nano RECEPTRICE
 arduino v1.0.1

 donnees (trame) recus : <1;-3;16;2294;531>
 '<' = le debut de la trame
 '>' = la fin de la trame
 ';' = delimitateur des donnees
*/

//----------
String Trame;              // Chaine pour contenir la Trame entrante
boolean TrameRecu = false; // si la Trame a ete recue dans son integralité
int NbrData = 4;           // Nombre de donnes qui seront recus   exemple: 5 valeurs : 1;-3;16;2294;531

//========================
void loop() {
  handleCommand();



} //FIN LOOP
//=======================


//************************* routines
void serialEvent(){
  while (Serial.available()) {// si recois des donnes
    char incomingByte = (char)Serial.read();
    if (incomingByte == '>') { // Fin de la Trame
       TrameRecu = true;
       return;
    }else if (incomingByte == '<'){ // Debut d une nouvelle Trame
       Trame = "";
       TrameRecu = false;
       return;
    }else{
      Trame += incomingByte;
      return;
    }
  }
}

void handleCommand() {
  if (!TrameRecu) return; // aucune Trame a parser
  int data[NbrData];     // un maximum de 5 nombres entiers de donnees
  char cmd[Trame.length()+1];
  Trame.toCharArray(cmd, Trame.length()+1);
  char *token = strtok(cmd, ";");

  for (int i = 0; i < NbrData+1; i++) { // mettre datas dans tableau
    if (token) {
      data[i] = atoi(token);
      token = strtok(NULL, ";");
    }
 }
//---Pour verif sur monitor de ce qui a ete recu
  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.print(data[3]/100);Serial.print(".");Serial.println(data[3]%100);
  Serial.print("data[4] = ");Serial.print(data[4]/100);Serial.print(".");Serial.println(data[4]%100);
  TrameRecu = false;// Drapeau pour dire que nous avons traite la commande
 }
//************************Fin routines

data[de 0 à 4] contient mes 5 données 1 -3 16 22.94 5.31
pour data[3 et 4],Je divise par 100, pour remettre la virgule

J'ai extrais le code de mon programme principal pour simplifier la compréhension, je ne pense pas avoir oublié de lignes, je n'ai pas testé ce programme court,mais cela fonctionne très bien avec le programme principal

bien sur , il y a surement une meilleur façon d’écrire ce code,mais cela fonctionne et cela me suffit


Date de création : 14/06/2013 @ 10h45
Page lue 13838 fois