Coffre à code ESP32 — ESP32 simulation

Coffre-fort à code : clavier 4x4, écran LCD 2004 I2C, deux LED et un servo qui ouvre la porte puis la referme après 10 secondes.

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

Components

Sketch code

#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
#include <WiFi.h>
#include <esp_now.h>

// ----- Clavier -----
const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {13, 12, 14, 27};   
byte colPins[COLS] = {26, 25, 33, 32};   
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int stepsPerRevolution = 200;  
Stepper myStepper(stepsPerRevolution, 5, 23, 15, 2);

const int LED_VERTE = 18;
const int LED_ROUGE = 4;
const int BUZZER_PIN = 19;

const String CODE = "1234";
const String CODE_DEVEROUILLAGE = "0000";
String saisie = "";
int tentativesEchouees = 0;
bool enAlarme = false;
bool afficherEnClair = false; 

// Variables pour le gaz reçu sans fil
bool alerteGazEnCours = false;
bool porteOuverteParGaz = false;

// Structure de message reçue
typedef struct struct_message {
  char alert[32];
} struct_message;

struct_message myData;

// FONCTION DE CALLBACK CORRIGÉE POUR ESP32 CORE V3.X
void OnDataRecv(const esp_now_recv_info *info, const uint8_t *incomingData, int len) {
  memcpy(&myData, incomingData, sizeof(myData));
  String msg = String(myData.alert);
  
  if (msg == "GAS_ALERT" && !porteOuverteParGaz) {
    alerteGazEnCours = true;
    porteOuverteParGaz = true;
    
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("!!! ALERTE GAZ !!!");
    lcd.setCursor(0, 1);
    lcd.print("Porte ouverte (0000)");
    digitalWrite(LED_VERTE, HIGH);
    myStepper.step(100); // Ouvre la porte en urgence
  } 
  else if (msg == "GAS_NORMAL") {
    alerteGazEnCours = false;
  }
}

void setup() {
  Serial.begin(115200);

  Serial.print("Adresse MAC de cet ESP32 (N2) : ");
  Serial.println(WiFi.macAddress());
  pinMode(LED_VERTE, OUTPUT);
  pinMode(LED_ROUGE, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  
  digitalWrite(LED_VERTE, LOW);
  digitalWrite(LED_ROUGE, LOW);
  digitalWrite(BUZZER_PIN, LOW);

  myStepper.setSpeed(60); 

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Entrez le code:");
  lcd.setCursor(0, 1);
  lcd.print("_");

  // Initialisation Wi-Fi en mode Station pour ESP-NOW
  WiFi.mode(WIFI_STA);
  if (esp_now_init() != ESP_OK) {
    Serial.println("Erreur init ESP-NOW");
    return;
  }

  // Enregistrer la fonction de réception
  esp_now_register_recv_cb(OnDataRecv);
}

void actualiserAffichageSaisie() {
  lcd.setCursor(0, 1);
  lcd.print("                    "); 
  lcd.setCursor(0, 1);
  if (saisie.length() == 0) {
    lcd.print("_");
  } else if (afficherEnClair) {
    lcd.print(saisie);
  } else {
    for (int i = 0; i < saisie.length(); i++) {
      lcd.print('*');
    }
  }
}

void alerteCourte() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("CODE INCORRECT");
  unsigned long debut = millis();
  while (millis() - debut < 5000) {
    digitalWrite(LED_ROUGE, HIGH);
    tone(BUZZER_PIN, 1000);
    del

More projects by yenihandresk