Page 1 sur 1

Télémetrie embarqué (problème)

Message non luPosté: Dim 21 Avr 2013 15:07
de jbsola31450
Bonjour à tous les codeurs!

Je suis lycéen au lycée de Saint-Orens de Gameville et dans le cadre d'un projet pour le Challenge Educ Eco 2103, qui se déroulera à Colomiers (31) en mai , je suis emmené à concevoir une télémétrie embarquée dans notre voiture/prototype tout éléctrique.

Les cartes Arduino utilisées sont :
-Arduino Mega 2560
-Power Screwshield de Snootlab (pour le branchement des capteurs)
-Memoire (pour le horodatage des données sur la carte SD)
-Shield GSM avec SM5100B de Sparkfun pour la communication des données
-un afficheur Deuligne 1.1 de Snootlab

Le but étant d'acquérir la tension/intensité, la température, et la position de la voiture sur le circuit grâce aux différents capteurs:

-1 capteur de tension/intensité de style "shunt" (SEN-09028)
-2 capteurs de température pour l'habitacle et le boitier de gestion éléctronique (LM35DTN)
-1 GPS pour la position et la vitesse ( Venus-GPS de Sparkfun)

L'autre point de ce projet et de pouvoir communiquer ces données... Grâce au shield GSM la carte Arduino Mega envera des SMS à un téléphone (ou même un site en php...si j'ai le temps) pour que l' équipe dans les stands soient au courant en direct des valeurs des capteurs, en ca

Cependant j'ai un petit souci ... dans mon programme le GPS est inexistant et la carte "saute" cette partie...Voici mon code ...

Code: Tout sélectionner
/*Programme Final Télémétrie REC 1 edition 2013
 dévellopée par Philippe Roques-Geoffroy et
 Jean-Baptiste Sola
 
 Permet de recevoir les données des capteurs à distance par
 liaison GSM avec aussi un horodatage des data sur une carte
 SD.
 
 Sont présent comme capteurs:
 -2 capteurs de température
 -1 GPS pour acquisition de la position et vitesse
 -1 un capteur de tension
 -1 capteur d' intensité
 
 
 */
//**********************Inclusion des librairies*******************

#include <Wire.h>
#include <Deuligne.h>
#include <SD.h>
#include <RTClib.h>
#include <SoftwareSerial.h>

//**********************Variable d' entrée*************************

int lec_tension = 2;
int lec_intensite =3;
int lec_temp=1;

//**********************Variable de Sortie*************************
const char pin_chipSelect = 53;



//*********************Variable de caractère***********************
byte celcius  [8]={
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000
};

//*******************Variable d'initialisation*********************
RTC_DS1307 RTC;
File fichier;
String datastring;
Deuligne lcd;
SoftwareSerial gpsSerial(0, 1);
const int sentenceSize = 80;
char sentence[sentenceSize];






//**********************Variable de Calcul*************************

int val_tension = 0;
int calc_tension = 0;

int val_intensite = 0;
int calc_intensite = 0;

int val_temp = 0;
int calc_temp = 0;



//********************VOID SETUP************************************

void setup() {
  pinMode(lec_tension, INPUT); 
  pinMode(lec_intensite, INPUT); 
  pinMode(lec_temp, INPUT);          //configuration des entrée des capteurs

  Serial.begin(9600);


  gpsSerial.begin(9600);


  Serial.print("Initialisation de la Carte SD...");
  pinMode(pin_chipSelect, OUTPUT);                         
  Wire.begin();
  RTC.begin();

  if (!SD.begin(pin_chipSelect))                           // Vérification de la présence de la SD card
  {                         
    Serial.println("Carte fausse ou absente");
    return;                                              // Si problème, sortir et bloquer l'exécution
  }

  Serial.println("Carte OK.");

  datastring = "\nReleve et horodatage des valeurs du capteur, selon horloge RTC\n---------\n ";

  fichier = SD.open("log1.txt", FILE_WRITE);               // Ouverture du fichier en mode Ecriture.

  if (fichier)                                             // Si le fichier existe déja, on écrira à la suite des données présentes.
  {

    fichier.println(datastring);

    fichier.close();

    Serial.println(datastring);              // dupliquer la donnée sur port série
  }

  else                                                     //Si problème à l'ouvertre, alors signaler l'erreur
  {                                                       
    Serial.println("erreur d'ouverture du fichier durant la configuration");
  } 


}

//******************VOID LOOP*************************************
void loop()
{
  //**************Initialisation du LCD Deuligne******************
  lcd.init();
  lcd.setCursor(0, 0);
  lcd.clear();
  lcd.setCursor(0, 0);

  //*****************Calcul de la Tension************************

  val_tension = analogRead(lec_tension);
  calc_tension = (val_tension*50)/650;

  //****************Calcul de l'Intensité************************
  val_intensite = analogRead(lec_intensite);
  calc_intensite = (val_intensite*90)/674;

  //****************Calcul Température***************************
  val_temp = analogRead(lec_temp);
  calc_temp = (val_temp*150/307);



  //****************Stockage Carte SD****************************



  //Acquisition de l'heure
  DateTime moment = RTC.now();
  datastring=String(moment.day(),DEC);
  datastring+='/';
  datastring+=String(moment.month(),DEC);
  datastring+='/';
  datastring+=String(moment.year(),DEC);
  datastring+=' ';
  datastring+=String(moment.hour(),DEC);
  datastring+=':';
  datastring+=String(moment.minute(),DEC);
  datastring+=':';
  datastring+=String(moment.second(),DEC);


  // lire la valeur du capteur et la mettre dans la chaine de caractères

  datastring += ("\t");  // préalablement remplie avec les données temporelles
  datastring += String(calc_temp);
  datastring += (" °C");
  datastring += ("\t");
  datastring += String(calc_tension);
  datastring += ("V");
  datastring += ("\t");
  datastring += String(calc_intensite);
  datastring += ("A");

  //************Ecriture des données sur carte SD*************************
  fichier = SD.open("data.txt", FILE_WRITE);

  if (fichier)
  {
    fichier.print(datastring);
    fichier.close();
    Serial.println(datastring);
    // dupliquer la donnée sur port série
  }
  else {
    Serial.println("erreur d'ouverture du fichier");
  }
  datastring =0;
  delay(2000);


  //**************************Géolocalisation****************************
  static int i = 0;
  if (gpsSerial.available())
  {
    char ch = gpsSerial.read();
    if (ch != '\n' && i < sentenceSize)
    {
      sentence[i] = ch;
      i++;
    }
    else
    {
      sentence[i] = '\0';
      i = 0;
      displayGPS();
    }
  }
}

//******************Geolocalisation**************************************
void displayGPS()
{
  char field[20];
  getField(field, 0);
  if (strcmp(field, "$GPRMC") == 0)
  {
    Serial.print("Lat: ");
    getField(field, 3);  // number
    Serial.print(field);
    getField(field, 4); // N/S
    Serial.print(field);

    Serial.print(" Long: ");
    getField(field, 5);  // number
    Serial.print(field);
    getField(field, 6);  // E/W
    Serial.println(field);
    delay(2500);
  }
}

void getField(char* buffer, int index)
{
  int sentencePos = 0;
  int fieldPos = 0;
  int commaCount = 0;
  while (sentencePos < sentenceSize)
  {
    if (sentence[sentencePos] == ',')
    {
      commaCount ++;
      sentencePos ++;
    }
    if (commaCount == index)
    {
      buffer[fieldPos] = sentence[sentencePos];
      fieldPos ++;
    }
    sentencePos ++;
  }
  buffer[fieldPos] = '\0';
}


Pour les curieux voici les photos de mon montage:


L'ensemble démonté...

Image

Image

Image

J'ai pris une platine pour l' installation de l' I2C sur la Arduino Mega

Image

Image

Image


Image

Le bazar montée avec le GPS !!
Image

en vous remercient d'avance pour vos réponse!! Cordialement Jean-Baptiste :lol: