Badgeuse mqtt - Seeed studio ESP32 C3 - Home Assistant
Description¶
Conception et fabrication d'un module de badgeuse RFID avec communication MQTT.
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¶
Routage¶
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 :¶
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.