#include <ESP32Servo.h>
// Capteurs PIR
const int pirPins[4] = {23, 22, 21, 19};
bool placeOccupee[4];
// Ultrason
const int trigPin = 16;
const int echoPin = 17;
// Servo
Servo barriere;
const int servoPin = 13;
// 7 segments (a à g)
const int segPins[7] = {25, 5, 0, 2, 15, 18, 4};
// Chiffres 0–4 pour affichage 7 segments
const byte chiffres[5][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1} // 4
};
void setup() {
Serial.begin(115200);
for (int i = 0; i < 4; i++) {
pinMode(pirPins[i], INPUT);
}
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
for (int i = 0; i < 7; i++) {
pinMode(segPins[i], OUTPUT);
}
// Spécifique à ESP32 : définir la fréquence et attacher
barriere.setPeriodHertz(50); // 50 Hz pour servo standard
barriere.attach(servoPin, 500, 2400); // Min et max en microsecondes
barriere.write(0); // Barrière fermée
}
void loop() {
int placesLibres = 0;
for (int i = 0; i < 4; i++) {
placeOccupee[i] = digitalRead(pirPins[i]);
if (!placeOccupee[i]) {
placesLibres++;
}
}
afficherNombre(placesLibres);
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duree = pulseIn(echoPin, HIGH);
float distance = duree * 0.034 / 2;
if (distance > 0 && distance < 20 && placesLibres > 0) {
barriere.write(90);
delay(3000);
barriere.write(0);
}
delay(1000);
}
void afficherNombre(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(segPins[i], chiffres[num][i]);
}
}