antivolTest — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by musabrous.

Components

Sketch code

#include <math.h>

#define PIN_PIR     4
#define PIN_LED     18
#define PIN_BUZZER  19

bool alarmeActive = false;
bool gpsActif = false;
bool deplacementSimule = false;

unsigned long debutAlarme = 0;
unsigned long debutGPS = 0;
unsigned long dernierMouvement = 0;
unsigned long dernierMessage = 0;

const unsigned long DUREE_ALARME = 30000;
const unsigned long DUREE_GPS = 300000;
const unsigned long DELAI_SANS_MOUVEMENT = 5000;

float latRef = 48.8566;
float lonRef = 2.3522;
float latActuelle = latRef;
float lonActuelle = lonRef;
float precisionGPS = 8.0;

void setup() {
  Serial.begin(115200);
  pinMode(PIN_PIR, INPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_BUZZER, OUTPUT);
  digitalWrite(PIN_LED, LOW);

  // Initialisation du buzzer avec la nouvelle API LEDC pour ESP32 Core 3.x
  // ledcAttach(pin, fréquence, résolution)
  ledcAttach(PIN_BUZZER, 2000, 8); // Fréquence de base 2000 Hz, résolution 8 bits
  ledcWriteTone(PIN_BUZZER, 0);     // 0 = pas de son au démarrage

  Serial.println("=================================");
  Serial.println("ETAPE 4 : Buzzer + LED + GPS (v3)");
  Serial.println("Surveillance...");
  Serial.println("=================================");
}

float calculerDistance(float lat1, float lon1, float lat2, float lon2) {
  float R = 6371000;
  float phi1 = lat1 * PI / 180.0;
  float phi2 = lat2 * PI / 180.0;
  float dPhi = (lat2 - lat1) * PI / 180.0;
  float dLambda = (lon2 - lon1) * PI / 180.0;
  float a = sin(dPhi/2) * sin(dPhi/2) + cos(phi1) * cos(phi2) * sin(dLambda/2) * sin(dLambda/2);
  float c = 2 * atan2(sqrt(a), sqrt(1-a));
  return R * c;
}

void loop() {
  int pir = digitalRead(PIN_PIR);
  bool pirHigh = (pir == HIGH);

  // --- Détection de mouvement ---
  if (pirHigh && (millis() - dernierMessage > 2000)) {
    dernierMessage = millis();
    Serial.println("MOUVEMENT DETECTE !");

    if (!alarmeActive) {
      Serial.println("   -> Alarme ON (LED + Buzzer)");
      alarmeActive = true;
      digitalWrite(PIN_LED, HIGH);
      ledcWriteTone(PIN_BUZZER, 1000); // Son de 1000 Hz
      debutAlarme = millis();
    }

    if (!gpsActif) {
      gpsActif = true;
      deplacementSimule = false;
      debutGPS = millis();
      latActuelle = latRef;
      lonActuelle = lonRef;
      Serial.println("   -> GPS reveille pour 5 minutes");
    }

    dernierMouvement = millis();
  }

  // --- Gestion de l'alarme ---
  if (alarmeActive) {
    if (millis() - dernierMouvement > DELAI_SANS_MOUVEMENT) {
      Serial.println("Mouvement arrete. Alarme OFF.");
      alarmeActive = false;
      digitalWrite(PIN_LED, LOW);
      ledcWriteTone(PIN_BUZZER, 0); // Arrêt du son
    }
    else if (millis() - debutAlarme > DUREE_ALARME) {
      static bool messagePersistantAffiche = false;
      if (!messagePersistantAffiche) {
        messagePersistantAffiche = true;
        Serial.println(">>> MOUVEMENT PERSISTANT APRES 30s !");
      }
    }
  }

  // --- Gestion du GPS ---
  if (gpsActif) {
    if (millis() - debutGPS > 15000 && !