Projet

Général

Profil

Badgeuse mqtt - Seeed studio ESP32 C3 - Home Assistant

Description

Conception et fabrication d'un module de badgeuse RFID avec communication MQTT.

1771325890061.jpg 1771325890158.jpg 1771325890182.jpg 1771325890194.jpg

EDA

Réalisé sur le logiciel opensource KiCAD.

BOM

Id Footprint Quantity Designation Supplier and ref
U1 MODULE14P-SMD-2.54-21X17.8MM 1 MODULE-SEEEDUINO-XIAO-ESP32C3 Seeed Studio
R1,R2 R_1206_3216Metric_Pad1.30x1.75mm_HandSolder 2 R_Small Digikey
D2,D1 LED_D3.0mm 2 LED_Small Digikey
J1 PinHeader_1x08_P2.54mm_Vertical 1 Conn_01x08_Pin Digikey

La valeur des résistances dépend des leds utilisées, ici chacune des résistances est en série avec une led pour une valeur de 1000 Ohm.

schématique

carteRFID.png

Routage

carteRFIDboard.jpg carteRFIDboard3D.jpg carteRFIDboard3D-2.jpg

Fabrication

Fait sur la CNC 3 axes Roland SRM-20 du fablab en utilisant Mods à l'aide d'une fraise javelot.
Pour avoir plus d'information concernant l'utilisation de la fraiseuse, vous pouvez consulter la documentation d'Alexis Lepage réalisé lors de la FabAcademy pendant la semaine Electronic Production.
Les paramètres de la fraiseuse utilisé sont ceux de Dylan Heneck étudiant FabAcademy du Waag d'Amsterdam en 2025.

Code Arduino :

Téléchargement

Le code permet d'envoyer l'UID de la carte scannée en MQTT via le broker.
Le broker, ici Mosquitto sur Home assistant, renvoi une valeur d'autorisation. En fonction de cette valeur, les leds rouge ou verte s'allument.


#include <WiFi.h>
#include <MQTTPubSubClient.h>
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         6          // Configurable, see typical pin layout above
#define SS_PIN          20         // Configurable, see typical pin layout above
#define redLed_PIN      3
#define greenLed_PIN      4
MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

const char* ssid = "YourSSID";
const char* pass = "YourPWD";

WiFiClient client;
MQTTPubSubClient mqtt;

String uidToString(MFRC522::Uid *uid) {
    String out = "";
    for (byte i = 0; i < uid->size; i++) {
        if (uid->uidByte[i] < 0x10) out += "0";
        out += String(uid->uidByte[i], HEX);
        if (i < uid->size - 1) out += " ";
    }
    out.toUpperCase();
    return out;
}

void setup(){  
  pinMode(redLed_PIN, OUTPUT);
  pinMode(greenLed_PIN, OUTPUT);
  Serial.begin(115200);
  WiFi.begin(ssid, pass);  
  delay(2000);
  Serial.println("start");
  Serial.println("v1");
  SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();        // Init MFRC522
  delay(4);                // Optional delay. Some board do need more time after init to be ready, see Readme
    mfrc522.PCD_DumpVersionToSerial();    // Show details of PCD - MFRC522 Card Reader details
    Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
    Serial.print("connecting to wifi...");
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(1000);
    }
    Serial.println(" connected!");

    Serial.print("connecting to host...");
    while (!client.connect("BROKER_IP", 1883)) {
        Serial.print(".");
        delay(1000);
    }
    Serial.println(" connected!");

    // initialize mqtt client
    mqtt.begin(client);

    Serial.print("connecting to mqtt broker...");
    while (!mqtt.connect("cnc_UID", "CLIENT_LOGIN", "CLIENT_PWD")) {
        Serial.print(".");
        delay(1000);
    }
    Serial.println(" connected!");      

    mqtt.subscribe("/cnc/uid", [](const String& payload, const size_t size) {
        Serial.print("/cnc/uid ");
        Serial.println(payload);
    });

    mqtt.subscribe("/cnc/autorisation", [](const String& payload, const size_t size) {
        // on copie pour pouvoir modifier
        String msg = payload;
        msg.trim();  // enlève \n, \r, espaces
        Serial.print("[autorisation] payload='");
        Serial.print(msg);
        Serial.print("' len=");
        Serial.println(msg.length());

        if (msg == "1") {   
            Serial.println("-> autorisé, led verte");
            digitalWrite(greenLed_PIN, HIGH);
            digitalWrite(redLed_PIN, LOW);
        } else if (msg == "0"){
            Serial.println("-> non autorisé, led rouge");
            digitalWrite(greenLed_PIN, LOW);
            digitalWrite(redLed_PIN, HIGH);
        } else if (msg == "3"){ 
            Serial.println("-> Session terminée, leds eteintes");
            digitalWrite(greenLed_PIN, LOW);
            digitalWrite(redLed_PIN, LOW);
        }
    });

// to have a starting message
    mqtt.publish("/cnc/uid", "Connecté");

}

void loop(){

    mqtt.update();

    if (!mfrc522.PICC_IsNewCardPresent()) {
        delay(20);
        return;
    }

    if (!mfrc522.PICC_ReadCardSerial()) {
        // carte détectée mais erreur lecture UID
        return;
    }

    String uidStr = uidToString(&mfrc522.uid);
    Serial.print("Carte détectée UID = ");
    Serial.println(uidStr);

    mqtt.publish("/cnc/uid", uidStr.c_str());
    Serial.println("UID envoyé en MQTT sur /cnc/uid");

    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();

    delay(750);
}

API serveur

Afin de savoir si un utilisateur est autorisé à utiliser la machine pour laquelle il badge, le serveur Home Assistant a besoins d’effectuer une requête à notre serveur afin de récupérer les données de l'utilisateur concerné. Pour cela nous avons du concevoir une API permettant de communiqué avec la base de donnée. Par soucis de sécurité, nous ne pouvons pas communiquer la requête ici.
Le code de l'API a en grande partie été généré à l'aide de GPT 5.0.

Code Home assistant

Etait-ce utile? Oui Non Ajouté par Nicolas Kaufmann il y a 2 mois. Mis à jour il y a environ 2 mois.