Besoin d'aide sur RFID + Serveur Wifi (projet d'alarme)

Bonjour à tous,

Je planche sur un projet d’alarme diy mais mes lacunes en programmation me poussent à implorer votre aide, certainement une broutille pour les connaisseurs.

Je plante le décor :

j’ai une box domotique (domoticz) montée sur raspberry pi fonctionnelle. Elle interagit en wifi (et 433Mhz) avec mes objets connectés (en http://IP/COMMANDE)

Je bute sur un boitier d’alarme à base de nodemcu esp8266 sur lequel est branché un lecteur RFID

Le boitier doit écouter la lecture des badges/tag pour mettre en ou hors fonction l’alarme et en même temps faire office de serveur wifi en attendant les commandes de la box domotique (alarme on/off, ouverture de porte, etc).

Dans cet exemple la commande porte juste sur une led…

Je vous poste mon code en précisant que chacune des deux fonctions snifRfid et snifWifi fonctionne séparément, mais pas les deux en même temps, et c’est précisément ce dont j’ai besoin pour avancer.

Merci d’avance pour vos yeux éclairés

#include <ESP8266WiFi.h> 
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 4
#define RST_PIN 5


boolean alarme = false;

MFRC522 mfrc522(SS_PIN, RST_PIN);


const char* ssid = "maLivebox";
const char* password = "monMotDePasse";
 
int ledPin = 16; // GPIO16 = pin D0

WiFiServer server(80);


void setup() {
  Serial.begin(9600);
  delay(10);
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 
  // Connect to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
 
}


 void loop(){
 
 snifWifi();
 snifRfid();
 
 }
 
 void snifWifi() {
    // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Match the request
 
  
  if (request.indexOf("/ALARME=ON") != -1)  {
    digitalWrite(ledPin, HIGH);
    alarme = true;
  }
  if (request.indexOf("/ALARME=OFF") != -1)  {
    digitalWrite(ledPin, LOW);
    alarme = false;
  }

}

void snifRfid() {

 
 if (mfrc522.PICC_IsNewCardPresent()) 
  {
   
    // Select one of the cards
    if (mfrc522.PICC_ReadCardSerial()) 
    {
      
    //Show UID on serial monitor
    Serial.print("UID tag :");
    String content= "";
    byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    {
       Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
       Serial.print(mfrc522.uid.uidByte[i], HEX);
       content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
       content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    
    content.toUpperCase();

    if (content.substring(1) == "A1 B2 C3 D4") //change here the UID of the card/cards that you want to give access
    {
    delay(500);
    alarme = !alarme;
    Serial.println("BADGE DE SEB RECONNU");
    Serial.println();
    
    if (alarme == true){
    digitalWrite(ledPin, HIGH);
    Serial.println("ALARME ON");
    delay(5000);
   
    }
    if (alarme == false){
    digitalWrite(ledPin, LOW);
    Serial.println("ALARME OFF");
    delay(5000);
    
    }
   }
  }
 }
}

Salut,

je m’auto-réponds en remerciant Bricoleau et son “mini-ordonnanceur” qui permet d’alterner l’exécution du Rfid puis de l’écoute wifi.

Je continue de croire qu’il doit y avoir un moyen plus “propre” et/ou simple de coder tout ça, mais en attendant je peux continuer.

Je reste ouvert à toutes suggestions, raison pour laquelle je ne bascule pas sur résolu tout de suite :wink:

voila le code en l’état :

#include <Arduino.h>
#include "miniOrdonnanceur.h"
#include <ESP8266WiFi.h> 
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 4
#define RST_PIN 5
#define ledPin 16

boolean alarme = false;
const char* ssid = "maLiveBox";
const char* password = "monMotdePasse";

MFRC522 mfrc522(SS_PIN, RST_PIN);
WiFiServer server(80);

void debug(const char f[])
{
  char ligne[80];
  sprintf(ligne, "exec %s(), millis()=%lu", f, millis());
  Serial.println(ligne);
}
tache t2(setup2, 500);


void setup2()
{
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  t2.changerFonction(loop2a);
}
void loop2b()
{
  debug(__func__);
  snifWifi();
  t2.changerFonction(loop2a);
}


void loop2a()
{
  debug(__func__);
  snifRfid();
  t2.changerFonction(loop2b);
}



void setup()
{
  Serial.begin(9600);
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  ordonnanceur.lancer();
}


 void snifWifi() {
    // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
  return loop(); 
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Match the request
 

  if (request.indexOf("/ALARME=ON") != -1)  {
    digitalWrite(ledPin, HIGH);
    alarme = true;
  }
  if (request.indexOf("/ALARME=OFF") != -1)  {
    digitalWrite(ledPin, LOW);
    alarme = false;
  }

}

void snifRfid() {

 
 if (mfrc522.PICC_IsNewCardPresent()) 
  {
   
    // Select one of the cards
    if (mfrc522.PICC_ReadCardSerial()) 
    {
      
    //Show UID on serial monitor
    Serial.print("UID tag :");
    String content= "";
    byte letter;
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    {
       Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
       Serial.print(mfrc522.uid.uidByte[i], HEX);
       content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
       content.concat(String(mfrc522.uid.uidByte[i], HEX));
    }
    Serial.println();
    
    content.toUpperCase();

    if (content.substring(1) == "D2 DE A0 5D") //change here the UID of the card/cards that you want to give access
    {
    delay(500);
    alarme = !alarme;
    Serial.println("BADGE DE SEB RECONNU");
    Serial.println();
    
    if (alarme == true){
    digitalWrite(ledPin, HIGH);
    Serial.println("ALARME ON");
    delay(5000);
   
    }
    if (alarme == false){
    digitalWrite(ledPin, LOW);
    Serial.println("ALARME OFF");
    delay(5000);
    
    }
   }
  }
 }
}


void loop()
{
}