compteur de trafic de vehicule VL53 (capteur laser)

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

Il s’agit du même projet avec la bibliothèque Sparkfun qui est intéressante, mais les fonctions ne sont pas les mêmes avec des options plus importantes que celle de pololu.

voici le programme

#include <Wire.h>     //https://sparks.gogo.co.nz/ch340.html
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //A0, A1, A2 non shunter
#include <TimerOne.h>
#include <SparkFun_VL53L1X.h>   //https://github.com/sparkfun/SparkFun_VL53L1X_Arduino_Library
//#include <VL53L1X.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>
SFEVL53L1X distanceSensor; //A4:SDA vert A5:SCL// changement de code adaprter a la lecture de distance
#define led13 13
unsigned tempsaffiche=0;
float distance;
bool flagaffiche=1;
bool flagmesure=1;
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 c=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() {

  Wire.begin();
pinMode(led13, OUTPUT);
pinMode(3, OUTPUT);
lcd.init();
lcd.display();
lcd.backlight();
Serial.begin(9600); //sinon mettre 9600 bauds
Serial.println ("VL53L1X premier test");
Timer1.initialize(100000); // timer 1 à 100000 -> periode de 0.1s
Timer1.attachInterrupt(Routinetimer1); // attaches le sous programme Routinetimer1 as a timer
//overflow interrupt
 Wire.setClock(400000); // use 400 kHz I2C
//distanceSensor.setTimeout(500); //opérations de lecture abandonnées
distanceSensor.init();
//Vérifier cette partie du programme pour avoir une mesure en continue de la distance ainsi que vérifier le comptage https://learn.sparkfun.com/tutorials/qwiic-distance-sensor-vl53l1x-hookup-guide/all
if (distanceSensor.init() == false)
    Serial.println("Sensor online!");

} //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);

lcd.setCursor(0,0); //place de l'écriture sur le lcd
distanceSensor.startRanging();
distance = distanceSensor.getDistance(); 
lcd.print(distance/100);
lcd.print(" ");
distanceSensor.stopRanging();// essayer distance float et afficher la distance avec distance float
Serial.print("Distance(mm): ");
Serial.print(distance/100);
Serial.println();
//distanceFeet = distanceFeet*304.2;conversion pied en mm (inutile sur l'afficheur)

//lcd.print("   ");
 // modifiée
 lcd.setCursor(5,0);
 if(flagmesure==1) {lcd.print("S");}
 if(flagmesure==0) {lcd.print("f");}
 lcd.print(distanceSensor.getRangeStatus());
//modifiée
 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.setCursor(9,3);
lcd.print("ben");        
if (distance<1500 && distanceSensor.getRangeStatus()==0 && flagmesure==1)
{
 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 ( distance > 1800 && distanceSensor.getRangeStatus()==0)
{Time=(millis()-To);flagmesure=1;} 
if (distanceSensor.getRangeStatus()==2) {flagmesure=1;}
//envoie des données en bluetooth
//}//fin loop factice


//Nouveau programme bluetooth test 


  char recvChar;  
  //On lit caractere par caractere sur le BTSerie et on affiche sur le Terminal Serie  
  if (BTSerie.available()) {  
    recvChar = BTSerie.read();  
    Serial.print(recvChar);  
  }  
  // Serial.write(blueToothSerial.read());  
  if (Serial.available()) {  
    recvChar = Serial.read();  
    BTSerie.write(recvChar);  
  } 

  
//if (BT.available()){            // bleu = ground /    violet= VCC
//BluetoothData=BT.read();
//BT.write(c);
//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 tout programmes


//}//fin loop

Données apparentes sur la liaison série :

Est ce que pour la mesure de la vitesse, il est possible d’utiliser le son émis par un véhicule par l'intermédiaire de l’effet doppler ? via un micro et un ampli

ce qui permettra d'utiliser une seule carte Arduino.

Nous faisons actuellement des tests sur le traitement d'un signal sonore, relevé par un micro, pour voir s'il est possible de n'utiliser qu'un micro qui comprenait la fréquence perçue provenant d'un véhicule s'approchant et celle du même véhicule s'éloignant comme capteur sur notre carte Arduino.

Pour ne pas avoir à transporter un PC, ainsi que de ne pas avoir à utiliser un afficheur LCD, pour avoir accès aux informations voici un programme plus abouti que le précédent qui consiste à envoyer les données (la distance qui sépare le capteur de la cible en temps réel) via une liaison Bluetooth vers un téléphone Android. Il s’agit de l’application Bluetooth électronique keuwll qui servira de terminal sur le téléphone Android.

Pour la liaison avec l’application Bluetooth electronic : créer un panneau d’observation, ici un terminal suffira avant d’observer les données envoyées via la liaison Bluetooth.

N'oubliez pas d’activer le Bluetooth du smartphone puis d’appairer le Bluetooth (ici HC06) (dans les paramètres d’Android).

Ensuite via l'application:

bluetooth classic -> paired device -> HC06 (pour mon cas) -> connect -> done.

Pour finir run et l’application reçoit les données du capteur via la liaison Bluetooth.

voici la capture d'écran

Voici le programme qui permet l’envoi de données via Bluetooth :

#include <Wire.h>     //https://sparks.gogo.co.nz/ch340.html
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //A0, A1, A2 non shunter        //  20ms short range 33ms Long range 
#include <TimerOne.h>
#include <SparkFun_VL53L1X.h>   //https://github.com/sparkfun/SparkFun_VL53L1X_Arduino_Library
//#include <VL53L1X.h>         // uint16_t getIntermeasurementPeriod(); //Get time between measurements in ms : possbiliter d'installer un retard aux envois de donner sur la liaison bluetooth
#include <SoftwareSerial.h>
#include <EEPROM.h>
SFEVL53L1X distanceSensor; //A4:SDA vert A5:SCL// changement de code adaprter a la lecture de distance
#define led13 13
unsigned tempsaffiche=0;
float distance;
bool flagaffiche=1;
bool flagmesure=1;
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;
int duree = millis();

// Interruptions tous les 1s fait par le timer1***********************************
void Routinetimer1() {
//if ( digitalRead(led13)== 1 ) {digitalWrite(led13,LOW);} else {digitalWrite(led13,HIGH);}
seconde++;
if(seconde>=59){seconde=0;minuTe++;}
if(minuTe>=59){minuTe=0;heure++;} //pas grave que 24h soit depassé



}//fin routineinterruption


void setup() {

  Wire.begin();
pinMode(led13, OUTPUT);
pinMode(3, OUTPUT);
lcd.init();
lcd.display();
lcd.backlight();
Serial.begin(9600); //sinon mettre 9600 bauds
Serial.println ("VL53L1X premier test");
Timer1.initialize(1000000); // timer 1 à 100000 -> periode de 0.1s
Timer1.attachInterrupt(Routinetimer1); // attaches le sous programme Routinetimer1 as a timer
//overflow interrupt
 Wire.setClock(400000); // use 400 kHz I2C
//distanceSensor.setTimeout(500); //opérations de lecture abandonnées
distanceSensor.init();
//Vérifier cette partie du programme pour avoir une mesure en continue de la distance ainsi que vérifier le comptage https://learn.sparkfun.com/tutorials/qwiic-distance-sensor-vl53l1x-hookup-guide/all
if (distanceSensor.init() == false)
    Serial.println("Sensor online!");

} //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);

if (digitalRead(led13)==1) { digitalWrite(led13,LOW);} 
else{ digitalWrite(led13,HIGH);}


lcd.setCursor(0,0); //place de l'écriture sur le lcd
distanceSensor.startRanging();
distance = distanceSensor.getDistance(); 
lcd.print(distance);
lcd.print(" ");
distanceSensor.stopRanging();// essayer distance float et afficher la distance avec distance float
Serial.print("Distance(mm): ");
Serial.print(distance);
Serial.print(" ");

duree = millis() - duree;
Serial.print("Duree d'execution loop : ");
Serial.print(duree);
Serial.print(" ");

Serial.print("Times: ");
Serial.print(heure);Serial.print("h");Serial.print(minuTe);Serial.print("m");Serial.print(seconde);// affichage de l'heure sur le terminal (optionnel) 
Serial.print(" ");
Serial.println();
//distanceFeet = distanceFeet*304.2;conversion pied en mm (inutile sur l'afficheur)

//lcd.print("   ");
 // modifiée
 lcd.setCursor(5,0);
 if(flagmesure==1) {lcd.print("S");}
 if(flagmesure==0) {lcd.print("f");}
 lcd.print(distanceSensor.getRangeStatus());
//modifiée
 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.setCursor(9,3);
lcd.print("ben");        
if (distance<1500 && distanceSensor.getRangeStatus()==0 && flagmesure==1)
{
 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 ( distance > 1800 && distanceSensor.getRangeStatus()==0)
{Time=(millis()-To);flagmesure=1;} 
if (distanceSensor.getRangeStatus()==2) {flagmesure=1;}
//envoie des données en bluetooth
//}//fin loop factice



  
if (Serial.available()){            // bleu = ground /    violet= VCC
BluetoothData=Serial.read();
Serial.write(BluetoothData);
if(BluetoothData=='d') {Serial.print("*B"+String(totaleBike)+"*");
Serial.print("*C"+String(totaleCar)+"*"); Serial.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 tout programmes

Malheureusement il n’est pas possible de faire un copier coller des données vers un tableur. Cependant il est possible d’utiliser le Bluetooth du PC.

Ensuite nous avons rajouté une condition dans le programme afin de vérifier le temps d’exécution de celui-ci.

if (digitalRead(led13)==1) { digitalWrite(led13,LOW);}
else{ digitalWrite(led13,HIGH);}

Les lignes ajoutées ont pour but de changer l’état d’une LED à chaque fois que le programme recommence.

Puis grâce à un oscilloscope nous avons pu déterminer le temps de clignotements de la LED, et donc par extension, la durée d’exécution du programme :

Nous pouvons voir que la durée d’un état haut ou d’un état bas, et donc par extension la durée d’exécution du programme, est de 75 ms.

Ensuite, nous avons implantées ces lignes :

digitalWrite(led13,HIGH); //test de la durée de la prise de donnée par le capteur distanceSensor.startRanging(); distance = distanceSensor.getDistance(); digitalWrite(led13,LOW);

qui ont pour objectif d’allumer la LED seulement pendant le temps que le programme prend pour acquérir la donnée de la distance.

Puis, la encore nous avons utilisé l’oscilloscope pour déterminer le temps où la LED est allumée :

Nous pouvons voir que la durée d’allumage de la LED, et donc de la durée d’acquisition de la donnée , est d’environ 400 µs.

Un compteur de Traffic qui mesure la vitesse, ce serait intéressant pour faire des statistiques

Un très bel article sur la mesure de vitesse dans elektor utilisant l’effet doppler avec le circuit K-LC5 qui a un cout de 25 euros avec une précision à 0.3Km/h

https://rfbeam.ch/product?id=9

a la place, d’un PIC, est ce qu’un arduino pourrait etre suffisant ?







Bonjour

J'ai aussi fait un compteur de trafic auto, pour une petite rue, avec ce type de détecteur de mouvement HW-MS03
image
et j'ai aussi utilisé Bluetooth electronic comme interface Bluetooth, ce programme est à mon avis le meilleur interface Bluetooth pour smartphone, surtout le plus facile à intégrer aux projets Arduino du fait qu'il ne nécessite aucun ajout au programme, juste des chaînes de caractères reçues ou à envoyer sur le sérial.
Cerise sur le gâteau, avec l'option Remote Code, il génère un programme pour l'interface dessiné.
A essayer!

Cordialement
jpbbricole

bonjour,

JE souhaite faire la même chose avec des photocellule pour une barrière automatique qui est déjà connecté à un système de gestion de parking pour la sécurité et la détection du sens de passage j'avais rajouter des détecteurs de métaux

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