Sytsem de mot de passe Bluetooth

Bonjour je cherche a faire un système de mot de passe Bluetooth j'ai déjà ce code mais dans DATA il n'y a que le premier et le dernier caractère qui sont enregistré. La partie en commentaire permet d'afficher le caractère écrit par mon téléphone, il est correctement lu.
Quelqu'un peut m'aidé. Utilise un module DX-BT16 le TXD et brancher sur RX et le RXD sur TX.

:warning: La rédaction de votre message ne répond pas aux critères attendus. Il n'aura sans doute pas de réponse tant que vous n'aurez pas pris en compte et mis en application les recommandations listées dans "Les bonnes pratiques du Forum Francophone”


et nous ? on doit le deviner ?

Désolé je croyais avoir mis le code le voici :

//www.elegoo.com

#define LED 13    //Define 13 pin for LED
bool state = LOW; //The initial state of the function is defined as a low level
char getstr;      //Defines a function that receives the Bluetooth character
#define Password_Length1 6

char Data1[Password_Length1];
char nul[Password_Length1] = "";
char Master1[Password_Length1] = "88888";
byte data_count1 = 0, master_count1 = 0;
bool Pass_is_good;
char customKey;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

//Control LED sub function
void stateChange() {
  state = !state; 
  digitalWrite(LED, state);  
}

void loop() {
  //if(Serial.available())
  //{
    //The Bluetooth serial port to receive the data in the function
    //getstr = Serial.read(); 
    //Data1[data_count1] = getstr;
    //Serial.println(getstr);
    //Serial.println(Data1);
    //if(getstr == 'a'){
      //stateChange();
    //}
  //}
  if(Serial.available()){
    getstr = Serial.read();
    if (getstr == '#') {
      Serial.println("Code d'ouverture de la porte entré");
      Serial.print("Le code utilisé est : ");
      Serial.println(Data1);
    } else {
      if (getstr == '*') {
        Serial.println("Mot de pass D'ouverture éffacé");
        Data1[data_count1] = nul;
      } else {
        Data1[data_count1] = getstr;
        Serial.println(Data1[data_count1]);
        data_count1 =+ 1;
        Serial.println(Data1);
      }
    }
  }
  if (data_count1 > Password_Length1 -1) {
    Serial.println("Mot de passe d'ouverture trop long");
    Data1[data_count1] = nul;
    int Data1 = nul;
    data_count1 = 0;
  }
  if (customKey == '#') {
    if (!strcmp(Data1, Master1)) {
      Data1[data_count1] = nul;
    }
    else {
      if (!strcmp(Data1, nul)) {
        Serial.println("Rien n'est entré");
      }
    }
  }
}

pour que votreSerial.println(Data1); fonctionne il faut mettre un '\0' à la fin de la chaîne (et donc prévoir la place dans le tableau pour cela)

sinon vous ne pouvez pas faire cela pour vider une cString. (on affecte pas un tableau à un autre)

vous pouvez juste mettre le caractère nul au début Data1[0] = '\0'; ou alors effacer tout le tableau en mettant des 0 partout

memset(Data1, '\0', sizeof Data1); // https://www.cplusplus.com/reference/cstring/memset/

Désolé pour le blanc.
J'ai lu votre message mais je ne comprends pas bien comment faire ce que vous me dite.
Pouvez m'éclairer ?

Pour écouter un port série (ou gérer un flux asynchrone de manière générale) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Ok j'ai lue les différent message que vous avez envoyer sur se sujet mais sa ne ma pas avancé mon premier problème et que la fin du message n'est pas bien comprise pas la carte arduino. Voici le code :slight_smile:

#include <SoftwareSerial.h>

SoftwareSerial SSerial(4, 2); // RX, TX

void ecouter()
{
  if (SSerial.available()) {
    // on a au moins 1 octet en attente
    int c = SSerial.read(); // on lit la valeur. la fonction read retourne un entier: -1 en cas d'erreur sinon l'octet lu (dans l'octet de poids faible de l'entier)
    if (c != -1) { // s'il n'y a pas eu d'erreur de lecture
      Serial.print(F("Octet lu: 0x")); Serial.print(c, HEX); // ici c est un entier, on affiche le code ASCII en Hexadécimal
      switch (c) {
        case '\n':
          Serial.println(F(" caractere: [\\n]"));
          break;
        case '\r':
          Serial.println(F(" caractere: [t]"));
          break;
        default:
          Serial.print(F(" caractere: [")); Serial.print((char) c); Serial.println(F("]"));
          break;
      }
    }
  }
}

void setup() {
  Serial.begin(115200);
  SSerial.begin(9600);
}

void loop() {
  ecouter();

 // ici on peut faire autre chose

}

Et voici le resultat pour le message : Bien

19:36:52.995 -> Octet lu: 0x42 caractere: [B]
19:36:53.029 -> Octet lu: 0x69 caractere: [i]
19:36:53.029 -> Octet lu: 0x65 caractere: [e]
19:36:53.029 -> Octet lu: 0x6E caractere: [n]

Quand le reglage et sur : Les deux, NL et CR

le réglage où ? sur le moniteur série Arduino ?
ça ce serait pour envoyer quelque chose sur Serial depuis le moniteur série, un CR / LF sera ajouté à ce que vous tapez.

Ici Ce qui compte c'est ce qu'envoie l'émetteur sur SSerial (le port virtuel). ici on dirait qu'il n'envoie que 4 lettres, 'B' 'i' 'e' et 'n' et puis rien d'autre

(qui est l'émetteur ?)

Le réglage est dans le moniteur série Arduino ?
Le but étant de lire un message quelque sois sa taille.
Sur le port série classique quand j'écris dans le moniteur quelque sois la taille du message a la fin le moniteur écrit //r //n .
C'est ce que je voudrais qu'il fasse sur le SSerial.
Lémeteur et le module Bluetooth DX-BT16 le TXD.

oui mais QUI demande à ce module d'émettre "Bien" ? est-ce qu'il lui demande aussi d'émettre le CR et le LF ? si ce n'est pas demandé, ce n'est pas étonnant que ce ne soit pas reçu...

C'est mon téléphone grâce a l'application Minew UART mais ça fait la même chose avec EFR Connect et BLE Scanner. (Application Android)
Si je ne test que sur c'est application c'est que les autres ne peuvent pas se connecter au module Bluetooth.

c'est que ça n'envoie que ce que vous avez tapé alors... pas de fin de trame.
c'est possible de taper un passage à la ligne dans le texte à envoyer dans vos apps ? par exemple un texte sur 3 lignes ?

Oui dans l'appli Minew UART si j'écris :

texte
rien

Cela ne fonctionne pas mais si je fait:

Texte
Texte1 ou rien
Texte2

Cela fonction dans le moniteur Arduino il ecrit bien :

Texte 
Texte1 ou rien
Texte2

Il semble que l’appli électrice (ou le composant) ne fonctionne pas bien donc…

Si vous voulez éliminer le défaut possible sur software serial (mais à 9690 bauds pour ce volume de données je n’y crois pas) il faut connecter le module BT sur un port série hardware. Sur la Uno c’est compliqué parce que vous perdez le moniteur série - avec une MEGA c'est simple

J'ai aussi une carte mega.
Pouvez vous m'expliquer comment faire.

vous branchez le module sur les pins de Serial3 (au lieu des pins 2 et 4)

le TX3 (pin 14 de la MEGA) va au RX du module
le RX3 (pin 15 de la MEGA) va au TX du module
Vous connectez les GND et l'alimentation comme pour l'autre (je suppose que vous avez un module compatible 5V)

et dans le code il suffit de modifier SSerial pour dire que c'est Serial3

//#include <SoftwareSerial.h>
//SoftwareSerial SSerial(4, 2); // RX, TX

#define SSerial Serial3

void ecouter()
{
  if (SSerial.available()) {
    // on a au moins 1 octet en attente
    int c = SSerial.read(); // on lit la valeur. la fonction read retourne un entier: -1 en cas d'erreur sinon l'octet lu (dans l'octet de poids faible de l'entier)
    if (c != -1) { // s'il n'y a pas eu d'erreur de lecture
      Serial.print(F("Octet lu: 0x")); Serial.print(c, HEX); // ici c est un entier, on affiche le code ASCII en Hexadécimal
      switch (c) {
        case '\n':
          Serial.println(F(" caractere: [\\n]"));
          break;
        case '\r':
          Serial.println(F(" caractere: [t]"));
          break;
        default:
          Serial.print(F(" caractere: [")); Serial.print((char) c); Serial.println(F("]"));
          break;
      }
    }
  }
}

void setup() {
  Serial.begin(115200);
  SSerial.begin(9600);
}

void loop() {
  ecouter();
}

Je confirme mon module bluetooth est bien un module 5V.
Mais ça ne fonctionne pas mieux.
Donc je ne sais pas.

soit le module ne fonctionne pas bien, soit l'app sur le smartphone ne fonctionne pas bien...
Vous alimentez le tout avec assez de puissance je suppose ?

D'accord bas je pense que sa doit être l'application ne demande pas d'allé a la ligne.
S'avez-vous quelle message en temps normal l'application envoi pour allé a la ligne ?

les caractères ASCII CR (carriage return, code ASCII 13decimal) et/ou LF (line feed, code ASCII 10decimal)

On les notes '\r' pour le CR et '\n' pour le LF en programmation, c'est le test que vous voyez dans le code

        case '\n':
          Serial.println(F(" caractere: [\\n]"));
          break;
        case '\r':
          Serial.println(F(" caractere: [t]")); // devrait dire CR [\\r]
          break;