// Projet ESP32 avec ILI9341 tactile, capteur de distance, et 3 LEDs
// Comportement :
// - Capteur détecte la voiture => enregistre l'heure
// - Bouton tactile pour lancer un compte à rebours de 1 min (LED orange)
// - Si la voiture part avant 1 min => LED verte
// - Si 1 min est dépassée => LED rouge
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>
#include <SPI.h>
// Pins
#define TFT_CS 15
#define TFT_DC 2
#define TFT_RST 4
#define TOUCH_CS 5
#define LED_ORANGE 12
#define LED_RED 14
#define LED_GREEN 27
#define TRIG_PIN 33
#define ECHO_PIN 32
// Durée de réparation (en millisecondes)
#define REPAIR_DURATION 60000
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
XPT2046_Touchscreen ts(TOUCH_CS);
unsigned long detectionTime = 0;
unsigned long repairEndTime = 0;
bool repairStarted = false;
bool vehiclePresent = false;
void setup() {
Serial.begin(115200);
pinMode(LED_ORANGE, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
tft.begin();
ts.begin();
ts.setRotation(1);
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
drawButton();
}
void loop() {
checkDistance();
checkButton();
updateLEDs();
}
void checkDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2;
if (distance < 10 && !vehiclePresent) {
vehiclePresent = true;
detectionTime = millis();
Serial.println("Voiture détectée");
}
if (distance >= 10 && vehiclePresent && repairStarted) {
// Voiture partie avant fin => LED verte
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
repairStarted = false;
vehiclePresent = false;
}
}
void checkButton() {
if (ts.touched() && vehiclePresent && !repairStarted) {
TS_Point p = ts.getPoint();
if (p.x > 100 && p.x < 300 && p.y > 100 && p.y < 200) {
Serial.println("Bouton pressé");
repairStarted = true;
repairEndTime = detectionTime + REPAIR_DURATION;
digitalWrite(LED_ORANGE, HIGH);
}
}
}
void updateLEDs() {
if (repairStarted && millis() > repairEndTime) {
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_RED, HIGH);
repairStarted = false;
}
}
void drawButton() {
tft.fillRect(100, 100, 200, 100, ILI9341_BLUE);
tft.setCursor(130, 140);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Start Timer");
}