Connexion Bluetooth entre 2 nano 33 iot ko si IDE fermé

Bonjour les passionnés !
Comme le titre du sujet l'indique, j'ia un soucis avec la connexion Bluetooth des Nano 33 IOT.
J'ai fait un programme avec la librairie ArduinoBLE qui fonctionne très bien. Enfin presque !

J'ai les deux nano qui se connectent ensemble. Le central (emétteur) a 2 boutons. Le peripherial (récepteur, ou périphérique) a 3 LED.
-1 qui s'allume quand la connexion est établie
-1 pilotée par le premier bouton du central
-1 pilotée par le second bouton du central

La connexion fonctionne, elle est stable, les commandes sont rapides. Bref, j'étais content de moi !
Sauf que je constate que si l'IDE Arduino est fermé, la connexion entre les nano ne se fait pas.
Pour résumer:

-Les 2 arduinos sont connectés au pc, leur sketch respectif ouvert pour lire les logs. Tout fonctionne.
-Je ferme l'IDE, la connexion ne se fait plus
-Si je connecte les 2 arduinos ensemble et que je ferme ensuite IDE, là pas de soucis, la connexion déjà établie ne se coupe pas
-Si je connecte un des arduinos à un autre pc, que j'ouvre le sketch dessus, ça fonctionne. Les arduinos se connectent

En gros, les arduinos ont besoin d'être connectés au pc avec l'IDE et le sketch en écoute pour que la connexion bluetooth s'établisse.

Quelqu'un a eu le problème ou a une idée ? Pour moi, une fois le programme téléversé, l'arduino est censé être autonome et éxécuter son code.

Pour info, j'ai désactivé le bluetooth de l'ordinateur, et ça fonctionne, donc ça passe bien par les puces bluetooth des arduinos !

Merci pour vos retours :slight_smile:

Bonjour et bienvenue,

Merci de prendre quelques minutes pour lire les bonnes pratiques du forum francophone et les appliquer.

Ce serait bien de poster ton code pour que l'on puisse t'aider.

Bonjour et merci pour le retour.

J'ai bien pris note des bonnes pratiques. Il m'a semblé que le titre était parlant et le descriptif également, si ce n'est pas le cas, j'en suis navré et je développerai en fonction des retours sans aucun soucis.
J'ai également pris le temps de me présenter en m'inscrivant.

Concernant le code, voici le code du Serial:

#include <ArduinoBLE.h>

// Variables des composants
const int buttonLed1 = 2; // pin utilisee pour le bouton 1
int buttonLed1OldState = HIGH; //int de gestion de l'etat du bouton 1 
const int buttonLed2= 3; // pin utilisee pour le bouton 2
int buttonLed2OldState = HIGH; //int de gestion de l'etat du bouton 2 

void setup() {
  Serial.begin(9600);
  while (!Serial);
  // Configure les boutons 
  pinMode(buttonLed1, INPUT_PULLUP);
  pinMode(buttonLed2, INPUT_PULLUP);
  // Initialisation du Bluetooth® Low Energy
  BLE.begin();
  if (!BLE.begin()) {
    Serial.println("Demarrage du module Bluetooth® Low Energy echoue!");
    while (1);
  }
  Serial.println("Bluetooth® Low Energy Central");
  // Demarrage du scan des peripheriques ayant l'UUID
  BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
}

void loop() {
  // Check si un peripherique a bien ete trouve
  BLEDevice peripheral = BLE.available();

  if (peripheral) {
    Serial.print("Detection a l'adresse ");
    Serial.print(peripheral.address());
    Serial.print(" '");
    Serial.print(peripheral.localName());
    Serial.print("' ");
    Serial.print(peripheral.advertisedServiceUuid());
    Serial.println();

    if (peripheral.localName() != "LED") {
      return;
    }
    // Fin du scan
    BLE.stopScan();
    controlLed(peripheral);
    BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
  }
}

void controlLed(BLEDevice peripheral) {
  // Connexion
  Serial.println("Connexion ...");

  if (peripheral.connect()) {
    Serial.println("Connecte");
  } else {
    Serial.println("Echec de la connexion");
    return;
  }

  // Lecture des attributs
  Serial.println("Recuperation des attributs ...");
  if (peripheral.discoverAttributes()) {
    Serial.println("Attributs recuperes");
  } else {
    Serial.println("Recuperation des attributs en echec!");
    peripheral.disconnect();
    return;
  }
  // Lecture des caracteristiques
  BLECharacteristic gateCharacteristic = peripheral.characteristic("19b10001-e8f2-537e-4f6c-d104768a1214");

  if (!gateCharacteristic) {
    Serial.println("Le peripherique n'a pas l'UUID  !");
    peripheral.disconnect();
    return;
  } else if (!gateCharacteristic.canWrite()) {
    Serial.println("Le peripherique n'a pas de profil correct");
    peripheral.disconnect();
    return;
  }

    // Tant que connectee
  while (peripheral.connected()) {
    // Int memorisant les etats des boutons
    int button1State = digitalRead(buttonLed1);
    int button2State = digitalRead(buttonLed2);

    if (buttonLed1OldState != button1State) {
      buttonLed1OldState = button1State;
      if (button1State) {
        Serial.println("Bouton LED 1");
        // Envoi de la valeur "1" pour changer l'etat de la LED 1
        gateCharacteristic.writeValue((byte)0x01);
      } 
    } else if (buttonLed2OldState != button2State) {
      buttonLed2OldState = button2State;
      if (button2State) {Serial.println("Bouton LED 2");
        // Envoi de la valeur "2" pour changer l'etat de la LED 2
        gateCharacteristic.writeValue((byte)0x02);
      } 
    }
  }
  Serial.println("deconnectee");
}

Et maintenant le code du périphérique:

#include <ArduinoBLE.h>

BLEService gateService("19B10000-E8F2-537E-4F6C-D104768A1214"); // Bluetooth® Low Energy LED Service
// Bluetooth® Low Energy LED Switch Characteristic - custom 128-bit UUID, read and writable by central
//UUID qui sera recherche par le serial afin de se connecter
BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin1 = 8; // pin utilisee pour la LED1
const int ledPin2 = 7; // pin utilisee pour la LED2
const int ledTest = 9; // pin utilisee pour la LED de voyant de connexion
bool lightLed1 = false; //booleen de gestion de l'etat de la LED1
bool lightLed2 = false; //booleen de gestion de l'etat de la LED2

void setup() {
  Serial.begin(9600);
  while (!Serial);
  // Initialisation des LED en output mode
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledTest, OUTPUT);
  // Initialisation du Bluetooth® Low Energy
  if (!BLE.begin()) {
    Serial.println("Demarrage du module Bluetooth® Low Energy echoue!");
    while (1);
  }

  // Definition du nom local et du service UUID:
  BLE.setLocalName("LED");
  BLE.setAdvertisedService(gateService);
  // Ajout du characteristic au service
  gateService.addCharacteristic(switchCharacteristic);
  // Ajout du service au module BLE
  BLE.addService(gateService);
  // Definition de la valeur initiale du caracteristic
  switchCharacteristic.writeValue(0);
  // start advertising
  BLE.advertise();
  Serial.println("BLE Peripheral");
  Serial.print(" service UUID = ");
Serial.println(gateService.uuid());
}

void loop() {
  // ecoute des peripheriques Bluetooth® Low Energy avec qui se connecter:
  BLEDevice central = BLE.central();
  // Si un appareil central est connecte au peripherique:
  if (central) {
    Serial.print("Connecte au : ");
    digitalWrite(ledTest, HIGH);
    // Log de l'adresse MAC :
    Serial.println(central.address());

    while (central.connected()) {
      // Si  envoie un signal
      // utiliser la valeur pour contrôler les composants
      if (switchCharacteristic.written()) {
        //On log les valeurs reçues dans le signal (la valeur est sur une ligne à part car le serial ne gère pas bien les tableaux de bytes)
        Serial.println("Valeur recue:");
        Serial.println(switchCharacteristic.value());
        //Si on recoit 1, on change l'etat de la LED 1
        if (switchCharacteristic.value() == 1) { 
          lightLed1 = !lightLed1;
          digitalWrite(ledPin1, lightLed1);
        } else if (switchCharacteristic.value() == 2 ){ //Si on recoit 2, on change l'etat de la LED 2
          lightLed2 = !lightLed2;
          digitalWrite(ledPin2, lightLed2); 
        }
      }
    }
    // En cas de deconnexion , eteindre la LED temoin
    Serial.print(F("Deconnexion : "));
    digitalWrite(ledTest, LOW);
    Serial.println(central.address());
  }
}

Je ne comprend pas pourquoi un code téléversé a besoin que l'arduino soit connecté à l'IDE pour fonctionner correctement, et mes recherches n'ont pas identifié de cas similaire. Je suis un peu dans l'impasse :grin:

Je n'ai jamais joué avec cette carte mais il n'est pas impossible que le while (!Serial); bloque le code.
Sur cette carte c'est un USB natif pas un circuit externe et l'USB n'étant pas connecté Serial ne peut jamais démarrer.

Bonsoir

c'est le cas .... si le code d'exige pas explicitement une connection :wink:

Quelle est l'utilité dans ton cas de while(!Serial) ?
Que t'apporte de bon cette ligne qui ressemble .......fort à une attente (sans fin) de connection?

Bonjour,

Merci pour vos suggestions !
En effet, j'avais omis cette ligne, qui en fait attends bien d'avoir le Serial d'initialisé afin de log tous les échanges...
Ca défilait devant moi et je le loupais à chaque fois !

Le Serial ne peut pas démarrer avec cette carte si l'IDE n'est pas en écoute dessus. Et la suite du code ne s'éxecute pas.

Après avoir commenté, bingo, tout fonctionne, je suis d'ailleurs surpris de la distance que peut parcourir le signal :slight_smile:

En tout cas, si ça peut servir, cet exemple de code fonctionne très bien pour de la connexion Bluetooth, je vais passer sur une carte BLE, je testerai qu'il y en a bien comptabilité entre les modèles.

Merci pour votre aide ! :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.