Afficher des caractères venant du bluetooth sur SSD1306

Bonjour tout le monde, j'ai un petit projet avec un écran oled SSD1306 et un module bluetooth, je cherche à afficher des caractères provenant d'une application app inventor 2.
j'ai bien une donnée qui s'affiche mais pas celle qui est attendu ...
lorsque j'appuie sur un bouton j'envoie "connectée" depuis mon application android au module bluetooth, l'afficheur est censé simplement afficher ce que je reçois du module.

Le soucis c'est que ça m'affiche bien quelque chose mais pas ce que je lui est demander ...
voici mon bout de code arduino

if(bluetoothSerial.available())
  {
    display.clearDisplay();
    display.setCursor(0,0);
    display.println("Notifications :");
    Notification = bluetoothSerial.read();
    display.println(Serial.write(bluetoothSerial.read()));
    Serial.print(bluetoothSerial.read());
    display.display();
    while(vibrating_loop < 1)
    {
      digitalWrite(vibrator,HIGH);
      delay(100);
      digitalWrite(vibrator,LOW);
      vibrating_loop ++;
    }
    delay(3000);
  }
  else
  {
    display.clearDisplay();
    display.setCursor(0,0);
    display.println("Notifications :");
    display.println("Aucune");
    display.display();
    vibrating_loop = 0;
  }

ce code m'affiche "1" au lieu de "connectee" ...

    Notification = bluetoothSerial.read();
    display.println(Serial.write(bluetoothSerial.read()));
    Serial.print(bluetoothSerial.read());

vous lisez 3 fois le port série ? vous pensez avoir 3 fois la même chose ?

et avec ce code    display.println(Serial.write(bluetoothSerial.read()));vous pensez imprimer quoi sur l'écran ? (ce qui provient du BT ou le résultat de l'appel à Write?... (indice))

merci pour cette réponse mais si on pouvais se tutoyer ça serais plus sympa :wink:

merci déjà pour pointer du doigt ce qui ne vas pas, lire 3 fois le port série n'est pas vraiment utile ...

donc si je suis ton raisonnement j'affiche rien en vérité puisque j'écrit avec le serial du pc au lieu de lire ce qui sort du serial bluetooth ?

j'suis un vieux, le vouvoiement c'est plus naturel pour moi, mais c'est pas très important :slight_smile:

merci déjà pour pointer du doigt ce qui ne vas pas, lire 3 fois le port série n'est pas vraiment utile ...

c'est surtout pas approprié.. chaque fois que vous lisez le port série vous enlevez l'octet qui est en tête du buffer, vous ne lisez pas 3 fois le même... De plus, vous n'avez testé qu'un if(bluetoothSerial.available()) donc vous ne savez même pas s'il y en a plus d'un...

donc si je suis ton raisonnement j'affiche rien en vérité puisque j'écrit avec le serial du pc au lieu de lire ce qui sort du serial bluetooth ?

Quand vous faites: [color=blue]display.println[/color](Serial.[color=red]write[/color](bluetoothSerial.[color=purple]read[/color]()));vous appelez la méthode read sur votre instance Série BT, ce qui vous retourne ce qui se trouve (un octet éventuellement ou plus rien) dans le buffer Série associé. vous appelez la méthode write sur le port Série standard, ce qui a pour effet donc d'imprimer sur la console (ou ce qui est connect au port Série) l'équivalent de cet octet lu. Cette fonction write va retourner une valeur et la doc nous dit que l'appel retourne le nombre d'octets écrits. ici c'est 1.

donc ce que vous envoyez à display.println c'est la valeur 1... ce qui fait qu'il n'y a rien de surprenant et que votre affirmation

ce code m'affiche "1" au lieu de "connectee" ...

n'a pas lieu d'être :slight_smile:

Ah oui effectivement c'est complètement con XD
pour savoir combien d'octet se trouve dans le buffer du serial bluetooth, il me faudrait faire une boucle for dans ce cas et concaténer tout ce qui s'y trouve ?

A moins qu'il n'y est une façon plus simple de faire :slight_smile:

Merci de tes précisions, je vois que le raisonnement que j'avais était faux

j'ai un petit problème avec ma boucle for que je n'arrive pas à comprendre :

for(int i=0; i<bluetoothSerial.read(); i++)
{
NotificationBuffer = bluetoothSerial.read();

  • }*
    il ne me prends qu'un caractère sur 2
    Si quelqu'un voit le souci je suis preneur

pour votre question....

j'ai un petit problème avec ma boucle for que je n'arrive pas à comprendre :

c'est simple... vous lisez 1 octet dans le test de la boucle for (ce qui n'a absolument aucun sens) et un autre dans le corps...c'est un peu ballot :)... en plus vous ne testez pas s'ils sont dispo...

for(int i=0; i<[color=red]bluetoothSerial.read()[/color]; i++)
    {
      NotificationBuffer = [color=red]bluetoothSerial.read();[/color]
    }

Sujet traité avec originalité et humour.

@+

j'ai regarder ton tutoriel J-M-L, j'avoue ne pas avoir tout compris dans ce qui cloche dans mon code ... XD

Bonjour, je ne sais pas ce qui cloche dans ton code, mais comme j'ai fait la meme chose que toi il y a qqs jours, je te joins mon code issus du tuto de jml

#include <SoftwareSerial.h>
#include "U8glib.h";
String donnee_bluetooth;
String readString;

SoftwareSerial port_bluetooth(12, 13);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);


const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'

const char marqueurDeFin = '#';

boolean ecouter()
{
  static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
  boolean messageEnCours = true;

  while (port_bluetooth.available() && messageEnCours) {
    int c = port_bluetooth.read();
    if (c != -1) {
      Serial.print(F("Octet lu: 0x")); Serial.print(c, HEX); // ici c est un entier, on affiche le code ASCII en Hexadécimal
      Serial.print(F("\t[")); Serial.print((char) c); Serial.println(F("]"));
      switch (c) {
        case marqueurDeFin:
          Serial.println(F("Fin de chaine"));
          message[indexMessage] = '\0'; // on termine la c-string
          indexMessage = 0; // on se remet au début pour la prochaine fois
          messageEnCours = false;
          break;
        default:
          if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
          else Serial.println(F("j'ignore!"));
          break;
      }
    }
  }
  return messageEnCours;
}

void setup() {
  Serial.begin(115200);
  port_bluetooth.begin(9600);
    u8g.firstPage();
do {u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 22, "Bonjour !");
} while( u8g.nextPage());
delay(1000);
}

void loop() {
  if (! ecouter()) {
    // on a reçu le marqueur de fin
    Serial.print(F("Phrase: [")); Serial.print(message); Serial.println(F("]"));
    u8g.firstPage();
      do {
      u8g.drawStr(20, 20, message);
      }
       while( u8g.nextPage() );
  }

  // ici on peut faire autre chose

}

tu peux élaguer si tu n'as pas besoin de la console serie

il y a aussi le code si dessous qui fonctionne, il faut envoyer la lettre # suivi de ton texte via le Bluetooth

#include <SoftwareSerial.h>
#include "U8glib.h";

SoftwareSerial port_bluetooth(12, 13);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);

//Variables de control y/o lectura
char valor;
String estado;

void setup() {
Serial.begin(9600);
  port_bluetooth.begin(9600);
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_unifont);
    u8g.drawStr( 0, 22, "Bonjour !");
  } while ( u8g.nextPage());
  delay(1000);
}


void loop() {

  if (port_bluetooth.available())  //Si el puerto serie (Bluetooth) está disponible
  {
    valor = port_bluetooth.read(); //Lee el dato entrante via Bluetooth

    if (valor == '#')  //Si el dato entrante es una #
    {
      pantalla_LCD();  //Llama la función que muestra el mensaje en la pantalla LCD
    }
  }
}

void pantalla_LCD()
{
  delay(30);
  while (port_bluetooth.available())
  {
    char c = port_bluetooth.read();  //Lee el dato entrante y lo almacena en una variable tipo char
    estado += c;             //Crea una cadena tipo String con los datos entrates
  }
  if (estado.length() > 0)   //Se verifica que la cadena tipo String tenga un largo mayor a cero
  {
    u8g.firstPage();
    do {
      u8g.setPrintPos(0, 20);
      u8g.print( estado);
      Serial.print(estado);
    }
    while ( u8g.nextPage() );
    estado = "";            //Limpia la variable para posteriormente leer nuevos datos
  }
}

c'est pas de moi, je l'ai pompé qq part sur le net

Olivier

c'est bon j'ai réussi a afficher ce que je voulais sur mon ecran oled merci pour votre aide.