CardReader
CardReader
Cet exemple implémente un lecteur de cartes à puce sous divers configurations.
Voici une petite vidéo d'illustration : https://youtu.be/z-JG1IUT-2k
1) Lecteur de carte à puce RS232 sur un Wemos D1, système autonome
a) Matériel : Wemos D1 et lecteur de tag RDM6300
Lecteur de tag :
WeMos
Connections :
Wemos d1 port D2 (GPIO 4) vers RDM6300 Pin 1 (TX)
Wemos d1 port D3 (GPIO 0) vers RDM6300 Pin 2 (RX)
Alimentation du RDM6300 (GND et 5V)
b) Principe :
Le lecteur de carte envoie les ID des cartes à puce sur le Wemos, qui compare l'ID avec les ID autorisés et ouvre un relai si l'ID est présent.
De plus, une 'super-card' permet d'ajouter une carte supplémentaire
c) Le Config :
[General]
Device=CardReader1
Wifi_ssid=mySSID
Wifi_password=myPass
NTP_Server=0.fr.pool.ntp.org
FW_Server=fw.mirtos.org
FW_Port=8080
Led_enabled=1
RS232=1
RS232_STX=2
RS232_ETX=3
[Device]
Type=WEMOS
i2c_scl_pin=255
i2c_sda_pin=255
btn_count=0
btn_IO_1=255
rs2_in_pin=4
rs2_out_pin=0
rs2_on_hw=0
relay_count=1
relay_IO_1=5
[GVar]
Supercard=0300918BDBC2
Dans le config, on spécifie les IO utilisés et les diverses configurations.
Le module RS envoie le symbole 0x02 comme symbole de Start et 0x03 comme symbole de fin. Nous spécifions donc les deux symboles dans le config (RS232_STX=2 et RS232_ETX=3)
Dans le config, je mets aussi une variable globale pour l'ID de la 'Super Card' qui permet l'ajout de nouvelles cartes
Remarque : Si aucun Wifi n'est disponible (cas d'un lecteur isolé), l'information du Wifi (Wifi_ssid) peut être omise. Dans ce cas, l'heure ne sera pas disponible.
De plus, dans ce cas, c'est le fichier ap.xml qui sera appelé, au lieu du fichier main.xml.
d) le main.xml et/ou ap.xml:
<Sys>
<Start>Display(Hello world);</Start>
</Sys>
<B1>
<P>Display(Pressed);MI(RY(1,1);DP(Open);ST(1,5,s));</P>
<R>Display(Released);</R>
</B1>
<T>
<T01>RY(1,0);DP(Close);</T01>
</T>
<RS>
<M_..>IF(SEQ(GS(lastRSMsg),GG(Supercard)),AE(Card,Add),AE(Card,Check));</M_..>
</RS>
<Card>
<Add>IF(OR(SEQ(GS(prevRSMsg),GG(Supercard)),FII(card.txt,GS(prevRSMsg))),DP(Not added),FAD(card.txt,GS(prevRSMsg)));</Add>
<Check>IF(FII(card.txt,GS(lastRSMsg)),MI(RY(1,1),DP(Open),ST(1,5,s)),DP(Card KO));</Check>
</Card>
Le main.xml (ou l'ap.xml) devra répondre aux événements de la RS232 :
- Si un message arrive (quel qu'il soit => M_.. ) on vérifie s'il s'agit de la super-card :
IF(SEQ(GS(lastRSMsg),GG(Supercard)),AE(Card,Add),AE(Card,Check));
En fait je compare le dernier message reçu (GetSystem(LastRSMsg)) avec la variable globale (définie dans le config) de l'ID de la SuperCard. Si c'est las supercard, alors j'ajoute un événement pour l'ajout (Source 'Card' et event 'Add), sinon je check la carte (Ajout de l'événement Card/Check)
J'ai donc deux nouveaux événements :
- Add :
<Add>
IF(OR(SEQ(GS(prevRSMsg),GG(Supercard)),FII(card.txt,GS(prevRSMsg))),
DP(Not added),
FAD(card.txt,GS(prevRSMsg)));</Add>
Dans ce cas, je contrôle si la carte précédente (GS(prevRSMsg)) était soit la super carte (SEQ(GS(prevRSMsg),GG(Supercard))), soit déjà présente dans le fichier de carte (FII(card.txt,GS(prevRSMsg))), dans ce cas, je ne l'ajoute pas, sinon, je l'ajoute : FAD(card.txt,GS(prevRSMsg)) .
- Check :
<Check>
IF(FII(card.txt,GS(lastRSMsg)),MI(RY(1,1),DP(Open),ST(1,5,s)),DP(Card KO));
</Check>
Dans ce cas, je cherche dans le fichier la dernière carte (FII(card.txt,GS(lastRSMsg))), si elle est présente, je fais une action multiple (MI) où j'ouvre le relay no 1 (RY(1,1)) , j'affiche 'Open' (DP(Open)) et je starte un timer de 5 sec pour refermer le relay à l'échéance du timer (ST(1,5,s)).
Si la carte n'est pas trouvée, alors j'affiche Carte KO (DP(Card KO));
Comme un timer a été crée, j'ajoute l'événemetn <T><T0> pour le traitement de ce timer :
<T>
<T01>RY(1,0);DP(Close);</T01>
</T>
à L'échéance du timer, je referme le relai (RY(1,0);) et j'affiche 'Close' (DP(Close);)
Dans cet exemple, les événements liés aux sources 'Sys' et 'B1' ne sont pas utilisés et peuvent être retirés. Néanmoins le bouton B1, même s'il n'est pas cablé, peut être utilisé comme source d'événement (ainsi une page Web pourrait provoquer l'ouverture avec <a href="/EVENT?source=B1&event=P">event B1.P</a> )
Il est toujours possible d'éditer le fichier de carte dans l'interface Web :
e) index.htm
Il est possible d'offrir plus d'information sur la page web. Voici un exemple :
<html>
<head>
<link rel="icon" href="/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<meta http-equiv='refresh' content='10; URL=/' />
</head>
<body bgcolor='#CE6211' text='white' >
<font color='white' face='arial'>
<H2>My Door</H2></P>
Device:%S/Device%<BR><BR>
<a href="/EVENT?source=B1&event=P">Open</a><BR><BR>
<BR/><B>File system usage </B><BR/>
FS total Bytes:%S,FStB%<BR/>
FS used Bytes:%S,FSuB%<BR/>
FS free Bytes:%S,FSfB%<BR/>
<a href="/FILE">File access</a><BR/><BR/>
<BR/><B>Others</B><BR/>
<a href="/RESET">Reset!</a><BR/>
HW:%S,HW%<BR/>
SW:%S,SW%<BR/>
Version:%S,Version%<BR/><BR/>
Boot cnt:%S,BootCnt% <a href="/EXEC?fct=RBC();">raz</a><BR/>
IP:%S,IP%<BR/>
MAC:%S,MAC%<BR/>
AP:%S,SSID%<BR>
BootPath:%S,BootPath%<BR><BR>
LastEvent:%S,LastEvent%<BR>
LastEventMsg:%S,LastEventMsg%<BR>
WIE Card:%S,LastWIEMsg%<BR>
RS Card: %S,lastRSMsg% / %S,prevRSMsg% <BR><BR>
<BR/><B>Memory </B><BR/>
FreeHeap:%S,FreeHeap%<BR/>
ContStack:%S,ContStack%<BR/>
HFrag:%S,HFrag%<BR/>
FrBlkSize:%S,FrBlkSize%<BR/>
RstInfo:%S,RstInfo%<BR/><BR/>
</font>
</body>
</html>
Il est bon de mettre dans le config que la page à appeler lors de event/exec soit aussi index.htm :
[GVar]
...
event.htm=index.htm
exec.htm=index.htm
Améliorations possibles :
- Ajout du traitement d'un bouton pour l'ouverture de la porte (type 'sortie')
- Renvoi à une centrale par MQTT des passages et/ou des ajouts de cartes
- Dans un système connecté, on peut imaginer que le lecteur n'est pas l'ensemble des cartes initialement, si une carte non présente dans le fichier arrive, alors on demande en MQTT au central le passage, si c'est positif, un message MQTT ajoutera au fichier la carte qui sera alors connue localement
- Page web plus 'user friendly'
2) Lecteur de carte à puce RS232 sur un ESP32, système autonome
Ce système est identique au précédent avec uniquement un changement de processeur. Le processeur utilisé est un ESP32
La connectique sera la même que pour l'exemple WeMos précédent, c'est à dire
IO21 <=> D2 <=> vers RDM6300 Pin 1 (TX)
IO17 <=> D3 <=> vers RDM6300 Pin 2 (RX)
Le config sera alors changé ainsi :
rs2_in_pin=21
rs2_out_pin=17
rs2_on_hw=1
L'ESP32 bénéficie d'un second UART matériel, donc on l'utilise en spécifiant rs2_on_hw=1.
Ce qui donne :
[General]
Device=WeMos665
NTP_Server=0.fr.pool.ntp.org
Wifi_ssid=MySSID
Wifi_password=myPass
FW_Server=fw.mirtos.org
FW_Port=8080
RS232=1
RS232_STX=2
RS232_ETX=3
[Device]
Type=WEMOS_665
led_green_pin=2
btn_count=0
btn_IO_1=255
rs2_in_pin=21
rs2_out_pin=17
rs2_on_hw=1
relay_count=1
relay_IO_1=5
[GVar]
Supercard=0300918BDBC2
Le main.xml, lui, reste identique.
3) Lecteur de carte à puce RS232 sur un ESP32 (Wemos S2 mini), système autonome
Seule la config doit être adaptée par rapport à l'exemple précédent :
rs2_in_pin=33
rs2_out_pin=18
Le config, en entier, devient :
[General]
Device=S2Mini
NTP_Server=0.fr.pool.ntp.org
Wifi_ssid=MySSID
Wifi_password=MyPass
AP_password=MyPass
FW_Server=fw.mirtos.org
FW_Port=8080
RS232=1
RS232_STX=2
RS232_ETX=3
[Device]
Type=ESP32_S2
led_green_pin=15
btn_count=0
btn_IO_1=255
relay_count=0
relay_IO_1=255
rs2_in_pin=33
rs2_out_pin=18
rs2_on_hw=1
[GVar]
Supercard=0300918BDBC2
event.htm=index.htm
exec.htm=index.htm
Le main.xml, lui, reste identique.
4) Lecteur de carte à puce Wiegand sur un Wemos D1, système autonome
a) Matériel : Wemos D1 et lecteur de tag fournissant une interface Wiegad
b) Le principe est identique au lecteur RS232
c) Le Config :
[General]
Device=CardReader1
Wifi_ssid=mySSID
Wifi_password=myPass
NTP_Server=0.fr.pool.ntp.org
FW_Server=fw.mirtos.org
FW_Port=8080
Led_enabled=1
[Device]
Type=WEMOS
i2c_scl_pin=255
i2c_sda_pin=255
btn_count=0
btn_IO_1=255
wie_d0_pin=4
wie_d1_pin=0
relay_count=1
relay_IO_1=5
[GVar]
Supercard=00918BDB80
_rs_was=0300918BDBC2
Les lignes D0 et D1 du lecteur sont spécifiée sur wie_d0_pin=4 et wie_d1_pin=0
Attention, il y a une petite modification de forme de la lecture, il faut adapter le Supercard en conséquence.
d) main.xml devient (remplacement des RS en WIE) :
<Sys>
<Start>Display(Hello world);</Start>
</Sys>
<B1>
<P>Display(Pressed);MI(RY(1,1);DP(Open);ST(1,5,s));</P>
<R>Display(Released);</R>
</B1>
<T>
<T01>RY(1,0);DP(Close);</T01>
</T>
<WIE>
<W_..>IF(SEQ(GS(lastWIEMsg),GG(Supercard)),AE(Card,Add),AE(Card,Check));</W_..>
</WIE>
<Card>
<Add>IF(OR(SEQ(GS(prevWIEMsg),GG(Supercard)),FII(card.txt,GS(prevWIEMsg))),DP(Not added),FAD(card.txt,GS(prevWIEMsg)));</Add>
<Check>IF(FII(card.txt,GS(lastWIEMsg)),MI(RY(1,1),DP(Open),ST(1,5,s)),DP(Card KO));</Check>
</Card>
Créé avec HelpNDoc Personal Edition: Créer des documents d'aide PDF facilement