Récupération d'une chaine de caratères sur arduino nano via bluetooth & Projet

Bonjour à tous

Mon projet est une horloge avec une mise à jour via le smartphone.
Mon matériel :
arduino nano associé à un module émeteur/récepteur Bluetooth.
L'application android Inventor 2.
Pour le moment c'est du très basic tant que je n'aurai pas franchi l'étape suivant:

La chaine de caractères est bien envoyée de l'application Inventor 2 sur l'arduino nano via les ports 10 et 11.
(la chaine sera composée par la suite de l'heure, jour etc...).

Mon petit soucis est de l'afficher sur le moniteur d'arduino pour la contrôler, après je saurai la traiter.

Voci mon petit bout de code simpliste :

#include <SoftwareSerial.h>
SoftwareSerial port(10, 11); // declare un port série sur les pins 10 et 11
void setup()
{
  Serial.begin(9600); // ouvre le port en 9600 bauds
   Serial.println("port ouvert");
   
}
void loop()
{
  
  char commande;
  if(port.available())
    { 
    commande = port.read(); // acquisition par le port serie
    Serial.println(port.read()); // cela peut être aussi sous cette forme: Serial.println(commande);  
    
}}

L'ensemble de code d'inventor 2 est correcte, la connexion bluetooth est faite et la chaine est bien envoyée. Ci-dessous l'image de mon code:

Comme je vous le disait c'est très simpliste tant que je n'aurai pas traité cette chaine envoyée sur l'arduino et affiché dans le moniteur.
Il n'y a peut être pas grand chose à modifier mais là je bloque.
"Le bloque: joint > "sec" et secondes text sera mis en place après"

Je m'en remets donc à vous, et je remercie par avance de vos réponses

Cordialement

Bonjour,

Tu n'as pas initialisé le port SoftwareSerial

port.begin(9600);

Quand tu fais
  commande = port.read(); // acquisition par le port seriele caractère est enlevé du buffer série.
Il ne faut donc pas faire  Serial.println(port.read());
Mais obligatoirement  Serial.println(commande);
En fait il vaudrait mieux faire  Serial.print(commande);

Pour tester la liaison, avant de faire un programme, utilises un terminal bluetooth pour envoyer des caractères
Personellement j'utilise Bluetooth Terminal

Bonjour à tous

Après quelques heures de réflexion très tardives, j'ai pu enfin afficher des résultats dans le moniteur d'arduino,
pour me simplifier au lieu de travailler sur des chaines (traitement byte par byte) j'envoie via le smartphone et le bluetooth des valeurs numériques qui est en fin de compte les informations recherchées pour ma big horloge (heure, minute, seconde, jour, mois et année).
Ceci me permettra de faire des mises à jours en cas de dérive du module Clock DS1307.

Il me reste à traiter ces informations puis les afficher sur des digits réalisés avec des bandes leds RGB.

Du boulot en perspective, mais le plaisir de la bricole est là.

Je ne manquerais pas sur ce post de vous faire part de l'avancement de mon projet.

Bonjour Kamill

Je te remercie pour ta réponse, nos messages se sont croisés, comme tu peux le voir sur mon post précédent j'ai pu travailler avec des valeurs numériques.
Mais je modifierai et testerai ton conseil.

J'utilise une appli simpliste que j'ai créée pour cette occasion avec Inventor 2 en localhost

Merci encore

Bonjour,

Je me permets de rebondir sur ton post...j'avais posté ce post il y a quelques temps en expliquant que je lisais très bien l'octet envoyé par BT si le programme était court mais bien moins si le programme se rallongeait...sans reponse, dommage... :sob:

Par contre si tu peux me donner ton retour sur ton programme, qd il se sera étoffé et me dire si tu lis toujours bien les données envoyés en BT, ce serait sympa. :wink:

Bonsoir,

je post ici un bout d'algorithme qui permet de récupérer une chaines de caractères.

// Get VHF Radio buffer size
sizeOfVhfBuffer = VHF_Radio_SpiUartGetRxBufferSize();
// Check if data have been received
if (sizeOfVhfBuffer != 0) {
{
uint8 i;
// Save data
for (i = 0; i < sizeOfVhfBuffer; i++){
vhfRxBuffer = VHF_Radio_UartGetChar();

  • vhfRxBuffer[i+1] = '\0';*
  • }*
    *}[/quote] *

Hello Kamill et Ipg79

Pour ta modification c'est ok, je lis bien les donnés caractères après caractères reste bien sur à traiter les chaines avec un reconnaissance de fin de mots ou de lignes ou de manières différentes de nombreux exemples sont sur le net pour cela, merci encore.

Pas de soucis Ipg79, je ne manquerai pas de te donner des retours de mon programme mais soit patient.
Pour le moment j'ai réussi à traiter les chaines alpha/numériques en numérique avec la fonction, parseFloat dans mon bout de code cela donne :

heure = MonHorloge.parseFloat()

donc du numérique et c'est mon but recherché.

Cela ouvre à de nombreuses applications de carte du type arduino uno et nano (avec les données ici d'un smartphone sous android (gps, meteo, horloge etc..)

Je simplifierai mes deux codes (arduino et inventor 2) je les mettrais sur ce post en exemple pour tout les bidouilleurs.

Bonne journée à tous

Bonjour à tous

Comme je vous l'avait promis voici l'avancement de mes petits travaux de ma big horloge.
je vous mets ci-dessous mes codes simplifiés qui permettent de récupérer des chaine alpha/numériques et de les convertir en valeurs numériques, il y aussi la partie inventor2.

#include <SoftwareSerial.h>

SoftwareSerial MonHorloge(10, 11); // ouverture des ports RX et TX

void setup() {
  delay(10);
  Serial.begin(9600);
  MonHorloge.begin(9600);
}

int H(0), M(0), S(0); char pointeur; float heure; // Initialisation des variables

//------------- traitement des données reçues (heures, minutes et secondes) ----------------------------

void loop() {
  if (MonHorloge.available())
  {
    pointeur = MonHorloge.read(); // on attribue à la variable "pointeur"  la chaine reçue
    delay(50); heure = MonHorloge.parseFloat(); // converti en numérique
    switch (pointeur) {
      case 'H': H = heure;   case 'M': M = heure;  case 'S': S = heure;
     break;}   
 //---------------------------------------------------------------------------------------------   
    affiSp();
  }
}   // ================ Fin du void loop =======================

//-------- Sous-Programme affichage sur le moniteur -----------

void affiSp() {
  String chH = "";  String chM = ""; String chS = ""; String affiche = "";
  chH = String (H) + "Hr "; chM = String (M) + "Mn "; chS = String (S) + "Sec ";
  affiche = chH + chM + chS;
  Serial.println (affiche);   Serial.println ("--------------");
}
//---Ce sous-programme peut être supprimé, il n'est là que pour le contrôle des variables

Voilà pour la partie Arduino, maintenant passons a Invento2 :


L'interface est simpliste aussi il faut que je rajoute le bouton de déconnexion

Tout est ok et cela fonctionne bien, j'espère a avoir apporter un peu d'eau à vos moulins.
Ce matin j'ai repris le code pour l' adapter au module Clock DS 1307, de ce coté tout fonctionne bien, les mises à l'heure se font bien.

il ne me reste plus que la partie à réaliser du codage des digits construits à partir de bandes leds RGB.
En plus de la mise à l'heure, nous pourrons aussi en modifier la couleur et l'intensité.

Avec le bricolage des bandes leds, il reste encore un peu de pain sur la planche. :slight_smile:

Bonne journée à tous