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
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))
j'suis un vieux, le vouvoiement c'est plus naturel pour moi, mais c'est pas très important
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
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
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 :
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...
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