explication détaillée

bonjour,
j’ai un code à adapter à mon instalation pour un lecteur RFID.
J’aimerai comprendre le code ligne par ligne pour pouvoir l’adapter et surtout évoluer sur l’arduino.
merci

#include <SPI.h>
#include <Ethernet.h>
#include <Wiegand.h> 

#define SERRURE 4 /* PIN sur lequel est connecté le relai */
#define LUMIERE 9 /* PIN sur lequel la lumière du clavier est connectée */
#define pirPIN 6

int pirState = LOW;
int pirVal = LOW;

String wgPINCODE ="";

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0x0E, 0xBE, 0xFE, 0x32, 0x12, 0x99 };

#include <PubSubClient.h>
long stayon = 500;

void callback(char* topic, byte* payload, unsigned int length);

const char* mqtt_server = "192.168.x.t";
const char* mqtt_input = "porte/input";
const char* mqtt_output = "porte/output";
IPAddress ipEth(192, 168, x, y);
IPAddress ipDNS(192, 168, x, z);
IPAddress subnet(255, 255, 255, 0);

void callback(char* topic, byte* payload, unsigned int length);

WIEGAND wg;
EthernetClient ethClient;
PubSubClient client(mqtt_server, 1883, callback, ethClient);
long lastMsg = 0;

char message_buff[100];

void setup() {
  Serial.begin(115200);
  setup_eth();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  wg.begin(2,3); /* vert et blanc sur sont 2 et 3 */
  pinMode(SERRURE, OUTPUT);
  pinMode(LUMIERE, OUTPUT);
  pinMode(pirPIN, INPUT);
  digitalWrite(SERRURE, LOW);   
  digitalWrite(LUMIERE, HIGH);  
}

void setup_eth() {

/*  
   if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
  }
*/
  Ethernet.begin(mac, ipEth, ipDNS);

  Serial.println(Ethernet.localIP());
  
}

void callback(char* topic, byte* payload, unsigned int length) {
  payload[length] = '\0';
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  String message((char*)payload);

  if (message == "open") {
    digitalWrite(SERRURE, HIGH);   
    digitalWrite(LUMIERE, LOW);   
    delay(stayon);
    digitalWrite(SERRURE, LOW);   
    digitalWrite(LUMIERE, HIGH);   
  } 
  if (message == "confirm") {
    digitalWrite(LUMIERE, LOW);   
    delay(stayon);
    digitalWrite(LUMIERE, HIGH);   
  }
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("GarageWiegand")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.subscribe(mqtt_input);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }

  pirVal = digitalRead(pirPIN);

  
  if (pirVal == HIGH) { // check if the input is HIGH
 //         Serial.println("pirVal  High!");

    delay(150);
    if (pirState == LOW) {
      Serial.println("Motion detected!");
      client.publish(mqtt_output,"moveon");
      // We only want to print on the output change, not state
      pirState = HIGH;
    }
  }
  else {
 //             Serial.println("pirVal  low!");

    if (pirState == HIGH) {
        Serial.println("Motion stopped!");
        client.publish(mqtt_output,"moveoff");
        pirState = LOW;
    }
  }
  
  if(wg.available()) {
    if ( wg.getWiegandType() == 8 || wg.getWiegandType() == 4 )
       {
          unsigned long wgCODE = wg.getCode();
          if  (wgCODE == 13 )
            {
              char wgCodeChar[16];
//              sprintf(wgCodeChar, "%s", wgPINCODE);
              wgPINCODE.toCharArray(wgCodeChar, 16);
              client.publish(mqtt_output,wgCodeChar);
              Serial.println(wgPINCODE);
              Serial.println(wgCodeChar);
              wgPINCODE = "";
            }
          else if ( wgCODE == 27 )
            {
              wgPINCODE = "";
            }
          else
          {
            wgPINCODE+= String(wgCODE);
            if (wgPINCODE.length() > 15 )
              wgPINCODE = "";
          }
       }
       else
       {
          unsigned long wgCode = wg.getCode();
          char wgCodeChar[16];
          sprintf(wgCodeChar,"%lu",wgCode); 
          Serial.println(wgCodeChar); 
          Serial.println(wg.getCode());
          client.publish(mqtt_output,wgCodeChar);
       }
  }
  client.loop();
}

Bonjour,

Pas de doublon sur le forum.
Merci de supprimer l'autre fil de discussion que tu as créé.

pardon si quelqu'un peut m'aider a mettre du commentaire ça serait top
merci beaucoup

Bonjour

J'aimerai comprendre le code ligne par ligne pour pouvoir l'adapter et surtout évoluer sur l'arduino.
merci

Comprendre ligne par ligne un programme de plus de 170 lignes demande du temps et du travail.
Commenter vient ensuite. Il y a un gros travail personnel à faire, le forum pouvant servir a clarifier de points particuliers, pas à fournir une explication détaillée de la totalité du programme.

Essaies déjà de répérer et te documenter sur les fonctionnalités du programme:
-détection de présence PIR
-interface Wiegang
-liaison Ethernet avec la box
-échange de messages par le protocole MQTT (pub, sub, la fonction callback qui traite les messages reçus...)

Chreches à comprendre l'enchaînement des actions dans la fonction loop()

Il faut tout de même comprendre un minimum et ne pas essayer de piocher des morceaux de programme tout fait a droite a gauche, et de faire des copier coller.

bonjour,
merci
j’ai donc bossé.
je récupère le code du bagde en MQTT
je lis pas mal de chose sur le moniteur série.
j’aimerai lire une variable que j’ai créé en mqtt au lieu du code mais je bloque.
qui s’y connait bien?
merci

#include <SPI.h>
#include <Ethernet.h>
#include <Wiegand.h> 

#define ALARME 4 /* PIN sur lequel est connecté le relai */
#define LUMIERE_V 9 /* PIN sur lequel la lumière verte du clavier est connectée */
#define LUMIERE_R 8 /* PIN sur lequel la lumière rouge du clavier est connectée */
#define BIP 7 /* PIN sur lequel le Bip est connectée */

String wgPINCODE ="";

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0x0E, 0xBE, 0xFE, 0x32, 0x12, 0x99 };

#include <PubSubClient.h>
long stayon = 500;

void callback(char* topic, byte* payload, unsigned int length);

const char* mqtt_server = "192.168.1.43";
const char* mqtt_input = "porte/output";
const char* mqtt_output = "porte/output";
int etat_alarme ;



IPAddress ipEth(192, 168, 1, 71);
IPAddress ipDNS(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);

void callback(char* topic, byte* payload, unsigned int length);

WIEGAND wg;
EthernetClient ethClient;
PubSubClient client(mqtt_server, 1883, callback, ethClient);
long lastMsg = 0;

char message_buff[100];

void setup() {
  Serial.begin(115200);
  setup_eth();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  wg.begin(2,3); /* vert et blanc sur sont 2 et 3 */
  pinMode(ALARME, OUTPUT);
  pinMode(LUMIERE_V, OUTPUT);
  pinMode(LUMIERE_R, OUTPUT);
  pinMode(BIP, OUTPUT);
  digitalWrite(ALARME, HIGH);   
  digitalWrite(LUMIERE_V, HIGH);
  digitalWrite(LUMIERE_R, HIGH); 
  digitalWrite(BIP, HIGH);   
}

void setup_eth() {

/*  
   if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
  }
*/
  Ethernet.begin(mac, ipEth, ipDNS);

  Serial.println(Ethernet.localIP());
  
}

void callback(char* topic, byte* payload, unsigned int length) {
  payload[length] = '\0';

  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    
  }
    Serial.println();
  String message((char*)payload);
 


  if (message == "5141807" || message == "2712" ||  message == "5164119" ){
    digitalWrite(ALARME,LOW);
     etat_alarme = 1;
    Serial.print("Etat de l'alarme: [" );
    Serial.print(etat_alarme);
    Serial.println("] ");
    digitalWrite(LUMIERE_V, LOW);
    digitalWrite(BIP, LOW);  
        delay(150);
    digitalWrite(ALARME, HIGH);
     etat_alarme = 0;
    Serial.print("Etat de l'alarme: [" );
    Serial.print(etat_alarme);
    Serial.println("] ");
    digitalWrite(BIP, HIGH);  
      delay(1500);
    digitalWrite(LUMIERE_V, HIGH); 
  } 
     else  {
    digitalWrite(LUMIERE_R, LOW);    
    digitalWrite(BIP, LOW);    
        delay(110);
    digitalWrite(BIP, HIGH);
        delay(110);  
    digitalWrite(BIP, LOW);    
        delay(110);
    digitalWrite(BIP, HIGH);
        delay(110);  
    digitalWrite(BIP, LOW);    
        delay(110);
    digitalWrite(BIP, HIGH);
        delay(110);  
    digitalWrite(BIP, LOW);    
        delay(110);
    digitalWrite(BIP, HIGH);
        delay(120);  
    digitalWrite(BIP, LOW);    
        delay(110);
    digitalWrite(BIP, HIGH);
    digitalWrite(LUMIERE_R, HIGH);
      
       
  }
   
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("GarageWiegand")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.subscribe(mqtt_input);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }

  if(wg.available()) {
    if ( wg.getWiegandType() == 8 || wg.getWiegandType() == 4 )
       {
          unsigned long wgCODE = wg.getCode();
          if  (wgCODE == 13 )
            {
              char wgCodeChar[16];
//              sprintf(wgCodeChar, "%s", wgPINCODE);
              wgPINCODE.toCharArray(wgCodeChar, 16);
              client.publish(mqtt_output,wgCodeChar);
              Serial.println(wgPINCODE);
              Serial.println(wgCodeChar);
              wgPINCODE = "";
            }
          else if ( wgCODE == 27 )
            {
              wgPINCODE = "";
            }
          else
          {
            wgPINCODE+= String(wgCODE);
            if (wgPINCODE.length() > 15 )
              wgPINCODE = "";
          }
       }
       else
       {
          unsigned long wgCode = wg.getCode();
          char wgCodeChar[16];
          sprintf(wgCodeChar,"%lu",wgCode); 
          Serial.println(wgCodeChar); 
          Serial.println(wg.getCode());
          Serial.println(etat_alarme);
          client.publish(mqtt_output,wgCodeChar);
             
       }
  }
  client.loop();
}

j'aimerai lire une variable que j'ai créé en mqtt au lieu du code mais je bloque.

Vous ne fournissez pas assez d'information.

La voyez vous qui s'imprime lorsque la fonction void callback(char* topic, byte* payload, unsigned int length)est appelée ?

Notez que c'est un peu ballot de dupliquer une cString en String et de perdre de la mémoire  String message((char*)payload);uniquement pour faire des tests == ensuite.... la fonction strcmp() (et autres strstr()) vous permettent de travailler directement avec votre cString.