Impossibilité de recevoir des données (Capteur de distance + GPS)

Bonjour,
Je possede un arduino UNO, 1 capteur de distance (TOF IR Distance Sensor (0.2~12m) for Arduino Wiki - DFRobot), 1 GPS NEO6MV2 ainsi qu'un écran LCD.
J'ai comme projet de développer un système permettant d'avertir d'une collision entre voiture.

!! ATTENTION : Ce projet est uniquement fait pour m'amuser et développer mes compétences en Arduino et ne remplacera en aucun cas ma viligance au volant de ma voiture !!

J'ai donc rédigé un code temporaire (pas fini du tout). L'objectif est de connaitre la vitesse de mon véhicule grace au GPS. Ensuite grace au capteur de distance, il est possible de déterminer la vitesse du véhicule devant => cela permet de prévoir une différence de vitesse et grace à la mesure de distance : connaitre dans combien arrive la collision.

Cependant, un problème se pose quand j'upload mon code. La led "L" est allumé et ne veut pas partir. Quand j'ai réussi, une fois à la faire partir (j'ai fait bouger l'arduino :astonished:), mon code s'est bien exécuté, mais je ne trouve aucun moyen pour l'éteindre (meme en utilsant la méthode décrite sur ce forum The L LED Keeps Itself On - Arduino Stack Exchange, ou d'autres propositions).
J'ai comme supposition que le manque de mémoire dynamique signalé par l'IDE est responsable de ce problème (sur le code global :92%). Le programme mesurant la distance est responsable de 74% de son utilisation. Je vous mets son code juste en dessous.
Mais du coup : connaissez-vous un moyen de réduire cette utilisation ?

Code capteur de distance :

#include"DFRobot_LIDAR07.h"
#define USE_IIC
DFRobot_LIDAR07_IIC  LIDAR07;

void setup() {
  Serial.begin(115200);
  while (!LIDAR07.begin()) {
    Serial.println("The sensor returned data validation error");
    delay(1000);
  }

  LIDAR07.startFilter();

  while (!LIDAR07.setMeasureMode(LIDAR07.eLidar07Continuous));

  while (!LIDAR07.setConMeasureFreq(100));

  LIDAR07.startMeasure();

}

void loop() {
  if (LIDAR07.getValue()) {

    Serial.print("Distance:"); Serial.print(LIDAR07.getDistanceMM()); Serial.println(" mm");
    //lcd.print(LIDAR07.getDistanceMM());
    //delay(100);
    //lcd.clear();
    //delay(100);
  }
}

Code global :

//LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
//FIN LCD

//Vitesse et distance
unsigned long myTime;
float distance1 = 20; //distance du véhicule devant nous à une première instance (en m)
float distance2 = 15; //distance du véhicule devant nous à une deuxième instance (en m)
float vitesse1 = 50; //vitesse de notre véhicule (en km/h)
float temps1 = 0; //première instance (en millisecondes)
float temps2 = 1000; //deuxième instance (en ms)
float diffvitesse; //différence de vitesse entre les 2 véhicules (en m/s)
float vitesse2; //vitesse du véhicule devant (en m)
float diffdistance; //différence de distance entre les 2 véhicules (en m)
float tempscollision; //temps avant une collision avec le véhicule devant (en s)
float test; //valeur utilisée pour les tests
//FIN Vitesse et distance

//Distance
#include"DFRobot_LIDAR07.h"
#define USE_IIC
DFRobot_LIDAR07_IIC  LIDAR07;
//Fin Distance


//Vitesse
#define GPSTX A3 //pin number for GPS TX output - data from Arduino into GPS
#define GPSRX A2 //pin number for GPS RX input - to Arduino from GPS

#include <Arduino.h>
#include <SoftwareSerial.h>
SoftwareSerial GPS (GPSRX, GPSTX);

#include <TinyGPS++.h>

TinyGPSPlus gps;

char data;
double latitude;
double longitude;
double alt; //altitude
double vitesse;
unsigned long nbre_sat;
//Fin Vitesse

void setup() {
  Serial.begin(115200);
  Serial.println(F("Demarrage"));

  //LCD
  lcd.begin(16, 2);
  //FIN LCD

  //Distance
#ifdef USE_IIC
  while (!LIDAR07.begin()) {
    Serial.println(F("The sensor returned data validation error"));
    delay(1000);
  }
#endif

  LIDAR07.startFilter();

  while (!LIDAR07.setMeasureMode(LIDAR07.eLidar07Continuous));

  while (!LIDAR07.setConMeasureFreq(100));

  LIDAR07.startMeasure();
  //Fin distance

  //Vitesse
  GPS.begin(9600);//start softserial for GPS at defined baud rate
  //Fin Vitesse
}


void loop() {
  while (GPS.available() > 0) {
    //Serial.write(GPS.read());
    data = GPS.read();
    gps.encode(data);
    if (gps.location.isUpdated())
    {
      latitude = gps.location.lat();
      longitude = gps.location.lng();
      alt = gps.altitude.meters();
      vitesse = gps.speed.kmph();
      nbre_sat = gps.satellites.value();

      Serial.println(" ");
      Serial.println("-------- DONNEES GPS DECODEES ------------");
      Serial.print(F("Vitesse (km/h)=")); Serial.println(vitesse);
      Serial.print(F("Nbre de satellites=")); Serial.println(nbre_sat);
    }
  }
  //if(LIDAR07.getValue()){

  //Serial.print("Distance:");Serial.print(LIDAR07.getDistanceMM());Serial.println(" mm");
  //lcd.print(LIDAR07.getDistanceMM());
  //delay(100);
  //lcd.clear();
  //delay(100);

}

//diffvitesse = (distance1 - distance2) / (temps2 - temps1);
//vitesse2 = vitesse1 - diffvitesse;
//diffvitesse = vitesse1 - vitesse2;
//tempscollision = distance2 / diffvitesse;

Je tiens à préciser que je n'ai pas mis de photos du montage étant donné qu'il est difficilement compréhensible et que je ne pense pas qu'il soit important dans ce cas. Tous les programmes (GPS, Distance et LCD) fonctionnent très bien indépendamment, il y a juste un problème quand je rassemble tout dans un meme programme.

Pour stocker des grandeurs physiques, telles qu'une vitesse, une distance, un temps... (tout ce qui s'exprime naturellement avec une unité : m, m/s, s ...), il faut utiliser le type float (ou double), mais sûrement pas le type int.
Si tu utilises des entiers (int), à la 1ère division tu va te faire avoir par un arrondi inattendu, genre 2/3 = .... zéro dans une division entre entiers. Ca fait mal, et on mets des plombes pour trouver l'erreur.

Par ailleurs, il n'est pas recommandé de suggérer le type de problème (ici, manque de mémoire), à moins bien sûr d'en être absolument sûr. En faisant cela, tu lances ceux qui vont répondre dans une direction qui n'est peut-être pas la bonne, et il faudra plus de temps pour cerner le problème.

Ah oui, de base mon code était majoritairement en float mais par tentative d'optimisation, j'ai passé ca en int, j'ai oublié de le rechanger avant de publier (sachant que cela ne m'a rien fait gagner).
Et c'est vrai, je ne suis pas sur du problème.
Merci pour ta réponse

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.