Voici la réalisation d’un compteur de trafic de vehicule avec un VL53 (capteur de distance optique)
que l’on a mis dans boitier de déchet ménager posé dans une poubelle plaine.
un arduino nano a été utilisé avec un afficheur LCD pour verifier le bon fonctionnement
L’étude est ici
On a essayé dans différente configuration, mais parfois, il a fallut réajuster les distances de mesure.
Le compteur permet plus ou moins de distinguer le type de vehicule, sans trop d’erreur et d’avoir le nombre de vehicule par heure.
Par contre, il ne peut pour l’instant mesurer la vitesse.
Il faudrait placer un autre capteur VL 53 à une distance de 10m et faire une communication entre 2 arduinos pour connaitre la vitesse.
voici le programme
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //A0, A1, A2 non shunter
#include <TimerOne.h>
#include <VL53L1X.h> //https://github.com/pololu/vl53l1x-arduino/blob/master/examples/ContinuousWithDetails/ContinuousWithDetails.ino
#include <SoftwareSerial.h>
//#include <EEPROM.h>
VL53L1X sensor; //A4:SDA vert A5:SCL
#define led13 13
unsigned tempsaffiche=0;
bool flagaffiche=1;
bool flagmesure=1;
unsigned distance;
uint8_t counter1=0;
uint8_t heure=6;
uint8_t minuTe=0; //déclaration minute
uint8_t seconde; //déclaration seconde
unsigned To;
unsigned Time;
unsigned Time1;
unsigned totaleBike=0;
unsigned totaleCar=0;
unsigned totaletruck=0;
unsigned h7=0;
unsigned h8=0;
unsigned h9=0;
unsigned h10=0;
unsigned h11=0;
unsigned h12=0;
unsigned h13=0;
unsigned h14=0;
unsigned h15=0;
unsigned h16=0;
unsigned h17=0;
unsigned h18=0;
unsigned h20=0;
char BluetoothData;
// Interruptions tous les 0.1s fait par le timer1***********************************
void Routinetimer1() {
if ( digitalRead(led13)== 1 ) {digitalWrite(led13,LOW);} else {digitalWrite(led13,HIGH);}
counter1++;
if (counter1>=9) {seconde++;counter1=0;}
if(seconde>=59){seconde=0;minuTe++;}
if(minuTe>=59){minuTe=0;heure++;} //pas grave que 24h soit depassé
}//fin routineinterruption
void setup() {
pinMode(led13, OUTPUT);
pinMode(3, OUTPUT);
lcd.init();
lcd.display();
lcd.backlight();
Serial.begin(9600);
Timer1.initialize(100000); // timer 1 à 100000 -> periode de 0.1s
Timer1.attachInterrupt(Routinetimer1); // attaches le sous programme Routinetimer1 as a timer overflow interrupt
Wire.begin();
Wire.setClock(400000); // use 400 kHz I2C
sensor.setTimeout(500); //opérations de lecture abandonnées
sensor.init();
sensor.setDistanceMode(VL53L1X::Long);
sensor.setMeasurementTimingBudget(30000); //500000 50ms => 20Hz
sensor.startContinuous(30); //30ms
} //fin set up
void loop() {
SoftwareSerial BT(0, 1); // RX, TX mais il n'y a pas trop le choix sur la nano
BT.begin(9600);
//digitalWrite(led13,HIGH);
sensor.read(); //durée 42ms si 50
lcd.setCursor(0,0); //
lcd.print(sensor.ranging_data.range_mm);
lcd.print(" ");
lcd.setCursor(5,0);
if(flagmesure==1) {lcd.print("S");}
if(flagmesure==0) {lcd.print("f");}
lcd.print(sensor.ranging_data.range_status);
lcd.setCursor(8,0); lcd.print(Time1); lcd.print("T ");
lcd.setCursor(14,0); lcd.print(heure);lcd.print("h");lcd.print(minuTe);lcd.print("m");lcd.print(seconde);
lcd.setCursor(0,1);
lcd.print(h7); lcd.print(" ");
lcd.print(h8); lcd.print(" ");
lcd.print(h9); lcd.print(" ");
lcd.print(h10); lcd.print(" ");
lcd.print(h11); lcd.print(" ");
lcd.print(h12); lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(h13); lcd.print(" ");
lcd.print(h14); lcd.print(" ");
lcd.print(h15); lcd.print(" ");
lcd.print(h16); lcd.print(" ");
lcd.print(h17); lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(totaleBike); lcd.print("B ");lcd.print(totaleCar); lcd.print("C ");lcd.print(totaletruck); lcd.print("T "); //
//digitalWrite(led13,LOW);
if (sensor.ranging_data.range_mm<1000 && sensor.ranging_data.range_status==0 && flagmesure==1) { //1000
To=millis();
Time1=Time;
if (Time1<200) totaleBike++;
if (Time1>=200 && Time1<=3000) totaleCar++;
if (Time1>3000 && Time1<=10000) totaletruck++;
flagmesure=0; //comptage supplementaire apres une mesure > à 1.7m
if (heure>=0 && heure<=7) h7++;
if (heure==8) h8++;
if (heure==9) h9++;
if (heure==10) h10++;
if (heure==11) h11++;
if (heure==12) h12++;
if (heure==13) h13++;
if (heure==14) h14++;
if (heure==15) h15++;
if (heure==16) h16++;
if (heure>=17 && heure<=23) h17++;
}
if (sensor.ranging_data.range_mm>1700 && sensor.ranging_data.range_status==0 ) {Time=(millis()-To);flagmesure=1;}
if (sensor.ranging_data.range_status==2) {flagmesure=1;}
//envoie des données en bluetooth
/*
if (BT.available()){
BluetoothData=BT.read();
if(BluetoothData=='d') {BT.print("*B"+String(totaleBike)+"*"); BT.print("*C"+String(totaleCar)+"*"); BT.print("*C"+String(totaletruck)+"*"); } //envoie data au smathphone
if(BluetoothData=='z') {totaleBike=0;totaleCar=0;totaletruck=0; } //remise à zero des donnees
if(BluetoothData=='m') {minuTe++; } //mise des mintes
if(BluetoothData=='h') {heure++; } //mise des heures
BluetoothData=0;
}//fin BT available
*/
}//fin loop