Dans ce tutoriel, nous allons apprendre à utiliser un module Bluetooth pour envoyer et recevoir des données entre un téléphone portable et un Arduino. Bien que certains modèles d’Arduino intègrent le Bluetooth, de nombreux projets nécessitent l’utilisation de modules Bluetooth externes. Nous utiliserons ici le module nRF8001, qui consomme moins d’énergie que le module HC-05 couramment utilisé et peut se connecter facilement à des smartphones. Ce tutoriel explique comment connecter un Arduino UNO au module nRF8001, contrôler des LEDs via Bluetooth, et échanger des données avec un smartphone Android.
Matériel nécessaire
- Arduino UNO (ou compatible)
- Module Bluetooth nRF8001
- LEDs rouge, verte et bleue
- Résistances appropriées pour les LEDs (220Ω à 1kΩ)
- Écran LCD I2C (adresse 0x38, 16×2 caractères)
- Fils de connexion
- Breadboard
- Smartphone Android avec une application terminal Bluetooth (par exemple, « BlueTerm »)
Connexion du circuit

Le module nRF8001 utilise une interface SPI pour communiquer avec l’Arduino. Voici les connexions nécessaires :
- SCK (horloge SPI) → Pin 13 de l’Arduino
- MISO (Master In Slave Out) → Pin 12 de l’Arduino
- MOSI (Master Out Slave In) → Pin 11 de l’Arduino
- REQ (Request) → Pin 10 de l’Arduino
- RDY (Ready, doit être une broche d’interruption) → Pin 2 de l’Arduino
- RST (Reset) → Pin 9 de l’Arduino
- VCC → 3.3V ou 5V de l’Arduino (vérifiez les spécifications de votre module)
- GND → GND de l’Arduino
Les LEDs sont connectées comme suit :
- LED rouge → Pin 5
- LED verte → Pin 4
- LED bleue → Pin 3
On peut aussi connecter un écran LCD I2C, qui est connecté via les broches SDA (A4) et SCL (A5) de l’Arduino.
Note : Assurez-vous que les connexions SPI sont correctes, car elles ne sont pas négociables. Consultez la documentation d’Adafruit pour le nRF8001 pour plus de détails.
Code Arduino
Voici le code pour configurer la communication Bluetooth avec le module nRF8001, afficher des messages sur l’écran LCD, et contrôler les LEDs en fonction des données reçues via Bluetooth. Ce code est une adaptation de l’exemple « echodemo » fourni dans la bibliothèque Adafruit_BLE_UART.
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include "Adafruit_BLE_UART.h"
// Définition des broches pour le module Bluetooth
#define BLE_REQ 10
#define BLE_RDY 2 // Doit être une broche d'interruption (2 ou 3 sur UNO)
#define BLE_RST 9
Adafruit_BLE_UART BTLE = Adafruit_BLE_UART(BLE_REQ, BLE_RDY, BLE_RST);
// Configuration de l'écran LCD I2C
#define BL_ON 1
#define BL_OFF 0
#define ADDRESS 0x38
LiquidCrystal_I2C lcd(ADDRESS, 16, 2);
// Broches des LEDs
byte blueLED = 3;
byte redLED = 5;
byte greenLED = 4;
aci_evt_opcode_t laststatus = ACI_EVT_DISCONNECTED;
void setup(void) {
// Initialisation de l'écran LCD
lcd.init();
lcd.setBacklight(BL_ON);
lcd.setCursor(0, 0);
lcd.print("Bluetooth tests ");
// Initialisation de la communication série
Serial.begin(9600);
Serial.println(F("Bluefruit LE nRF8001 UART demo"));
// Configuration du module Bluetooth
BTLE.setDeviceName("Arduino"); // Nom du dispositif (7 caractères max)
BTLE.begin();
}
void loop() {
BTLE.pollACI(); // Vérifie les événements Bluetooth
aci_evt_opcode_t status = BTLE.getState();
if (status != laststatus) {
if (status == ACI_EVT_DEVICE_STARTED) {
Serial.println(F("* Publicité démarrée"));
}
if (status == ACI_EVT_CONNECTED) {
Serial.println(F("* Connecté !"));
lcd.setCursor(0, 1);
lcd.print("Connecté ");
}
if (status == ACI_EVT_DISCONNECTED) {
Serial.println(F("* Déconnecté ou publicité expirée"));
lcd.setCursor(0, 1);
lcd.print("Déconnecté ");
}
laststatus = status;
}
if (status == ACI_EVT_CONNECTED) {
// Vérifie les données reçues via Bluetooth
if (BTLE.available()) {
Serial.print("* ");
Serial.print(BTLE.available());
Serial.println(F(" octets disponibles depuis BTLE"));
while (BTLE.available()) {
char c = BTLE.read();
Serial.print(c);
if (c == 'r') digitalWrite(redLED, HIGH);
if (c == 'g') digitalWrite(greenLED, HIGH);
if (c == 'b') digitalWrite(blueLED, HIGH);
delay(100);
digitalWrite(redLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, LOW);
}
Serial.println();
}
// Vérifie les données envoyées depuis le moniteur série
if (Serial.available()) {
delay(10);
uint8_t sendbuffer[20];
uint8_t sendlength = 0;
while (Serial.available() && sendlength < 20) {
sendbuffer[sendlength] = Serial.read();
sendlength++;
}
if (Serial.available()) {
Serial.println(F("* Trop de données entrantes"));
}
if (sendlength > 0) {
BTLE.writeBuffer(sendbuffer, sendlength);
Serial.print(F("* Envoyé : "));
for (uint8_t i = 0; i < sendlength; i++) {
Serial.write((char)sendbuffer[i]);
}
Serial.println();
}
}
}
}
Instructions d’utilisation
- Connexion du circuit : Connectez le module nRF8001, les LEDs, et l’écran LCD à l’Arduino selon le schéma décrit ci-dessus.
- Installation des bibliothèques :
- installez la bibliothèque Adafruit_BLE_UART via le gestionnaire de bibliothèques de l’IDE Arduino.
- Installez la bibliothèque LiquidCrystal_I2C pour l’écran LCD.
- Téléversement du code : Connectez l’Arduino à votre ordinateur, ouvrez l’IDE Arduino, copiez le code ci-dessus, et téléversez-le sur la carte.
- Connexion Bluetooth :
- Activez le Bluetooth sur votre smartphone Android.
- Recherchez les appareils disponibles ; le module devrait apparaître sous le nom « Arduino ».
- Connectez-vous à l’aide d’une application terminal Bluetooth (par exemple, « BlueTerm »).
- Test de la communication :
- Envoyez les caractères ‘r’, ‘g’, ou ‘b’ depuis l’application pour allumer respectivement la LED rouge, verte, ou bleue pendant 100 ms.
- Tapez du texte dans le moniteur série de l’IDE Arduino (à 9600 bauds) pour l’envoyer au smartphone.
- Le texte envoyé depuis le smartphone apparaîtra dans le moniteur série, et l’état de la connexion sera affiché sur l’écran LCD.
Fonctionnement
Le module nRF8001 agit comme un port série UART via Bluetooth. Lorsqu’il est connecté, il permet une communication bidirectionnelle entre l’Arduino et le smartphone. Le code vérifie en continu les événements Bluetooth (connexion, déconnexion, réception de données) et met à jour l’écran LCD en conséquence. Les LEDs s’allument brièvement lorsqu’un caractère correspondant est reçu, et les données saisies dans le moniteur série sont transmises au smartphone.
Remarques
- Le module nRF8001 est plus économe en énergie que le HC-05 et compatible avec les smartphones modernes, contrairement au HC-05 qui peut poser des problèmes de connexion.
- Pour plus de détails sur le module nRF8001, consultez la documentation d’Adafruit.
