Envoyer une chaine de caractères de Arduino vers APP Inventor

Mon objectif est le suivant : prélever le niveau d'une batterie et l'envoyer pour l'afficher sur APP Inventor. Auriez-vous des idées pour le réaliser ?

Pour lire le pourcentage de la batterie sur la console Arduino j'ai pour l'instant le programme suivant :

const int BATTERYPIN = A0; 

const float TensionMax = 5;
const float TensionMin = 0;

void setup (); 

 Serial.begin(9600);

void loop()
float b = analogRead(BATTERYPIN); 

  int minValue = (1023 * TensionMin) / 5; 
  int maxValue = (1023 * TensionMax) / 5; 


  b = ((b - minValue) / (maxValue - minValue)) * 100;

  if (b > 100)
    b = 100; 

  else if (b < 0)
    b = 0;

  int value = b;
  Serial.println(value);
  delay(1000);

comment parlez vous à appInventor ? bluetooth ? wifi ? ....

en bluetooth, un module HC-05

j'ai rajouté ceci sur app inventor


mais étant un projet pour l'école, je n'ai pas eu l'occasion de l'essayer, pensez vous que cela puisse fonctionner ?

Bonjour Flvio

Si tu envoies ta valeur avec un:
bluetoothSerial.println(value);

Il faut lire une chaîne de caractères (en anglais):
image

Tu as déjà prévu un port spécifique pour ton HC-05?

A+
Cordialement
jpbbricole

je crois que le HC-05 est branché sur les ports 10 et 11

pour des raisons de clarté je préfère vous envoyez directement le programme complet que j'ai jusqu'à maintenant :

#include <SoftwareSerial.h>
#include <Duinoedu_SerialPlus.h>

//Tuto App inventor : https://lc.cx/Jksu
Duinoedu_SerialPlus  monSerialPlus;
String messageRecu = "" ;
// AIDE Gérer des échanges entre App inventor et Ardublock : https://lc.cx/oTLn


int pwm_b = 9;  //PWM control for motor outputs 3 and 4  
int dir_b = 8;  //direction control for motor outputs 3 and 4 



const int BATTERYPIN = A0; 

const float TensionMax = 5;
const float TensionMin = 0;

void setup()
{
  pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT); 
  monSerialPlus.branch(10,11); 
  monSerialPlus.begin(9600);
  digitalWrite(2 , LOW);
  digitalWrite(3 , LOW);

  pinMode(pwm_b, OUTPUT);
  pinMode(dir_b, OUTPUT);
  analogWrite(pwm_b, 0);

  Serial.begin(9600);
}

void loop()
{
  messageRecu = monSerialPlus.readText(DUINOEDU_NE_PAS_MEMORISER ) ;
  if (( (  String(messageRecu) ) == (  String("LED:1") ) ))
  {
    digitalWrite(2 , HIGH);
    digitalWrite(3 , LOW);
    
    digitalWrite(dir_b, LOW);  
    analogWrite(pwm_b, 255);
    
    messageRecu = """" ;
    
  }
  if (( (  String(messageRecu) ) == (  String("LED:0") ) ))
  {
    digitalWrite(3 , HIGH);
    digitalWrite(2 , LOW);
    
    digitalWrite(dir_b, HIGH);      
    analogWrite(pwm_b, 255);
   
  
    messageRecu = """" ;
  }
  if (( (  String(messageRecu) ) == (  String("LED:2") ) ))
  {
    digitalWrite(3 , LOW);
    digitalWrite(2 , LOW);
    analogWrite(pwm_b, 0);
    messageRecu = """" ;
    
    
  }

   float b = analogRead(BATTERYPIN); 

  int minValue = (1023 * TensionMin) / 5; 
  int maxValue = (1023 * TensionMax) / 5; 


  b = ((b - minValue) / (maxValue - minValue)) * 100;

  if (b > 100)
    b = 100; 

  else if (b < 0)
    b = 0;

  int value = b;
  Serial.println(value);
  delay(1000);
 
}

le but est de controler un moteur ainsi que de renvoyer le poucentage de la batterie, mais ici le arduino "n'envoie" pas réellement la valeur du pourcentage de la batterie au module bluetooth

Bonjour Flvio

Oui, c'est ce qui se fait, en général, avec SoftwareSerial.h

Dans ton code tu as:
delay(1000);
Ce n'est pas très bon, c'est bloquant, surtout si tu attends des données du BT.

Pour la transmission, tu as 2 options:

#include <SoftwareSerial.h>
#include <Duinoedu_SerialPlus.h>

Perso, j'obterai pour le "standard" SoftwareSerial.h.

Peux tu me mettre ton fichier MIT (AIA à compresser) en ligne.

Veux tu un programme adapté?

A+
Bonne journée
jpbbricole

les 2 bibliothèques proviennet de Ardublock , je ne les ai pas choisis moi mais tout fonctionne comme ça, je ne sais juste pas comment envoyer la valeur du pourcentage de la batterie au module Bluetooth, qui sera ensuite afficher sur mon application

cependant je ne peux pas vous envoyer le fichier aia car je suis considéré comme nouvel utilisateur

Comme ceci:
monSerialPlus.println(value);
A lire sur MAI comme chaîne de caractère:
image

Fais moi une copie d'écran où tu envoies les LED:0, par exemple.

A+
jpbbricole

j'essayerai de voir si cela fonctionne quand j'aurais accès au matériel


sur app inventor j'ai simplement ça pour envoyer l'instruction de mettre en marche le moteur et la LED

OK, je n'ai rien à redire, si tes LED fonctionnent ainsi.
Est ce qu'il y a un temps de latence entre le click sur le bouton et l'allumage de la LED?

très léger mais oui, mais ce n'est qu'une histoire de dixième de seconde

bonjour @jpbbricole, après avoir essayer ce que vous m'avez conseillé (bien que l'ayant légérement modifié) j'ai réussi à afficher le pourcentage de la batterie, mais je suis confronté à un nouveau problème.
Je souhaiterais modifié la couleur de l'affichage en fonction du niveau de batterie, mais je n'y arrive pas

je n'arrive pas à faire comparer la valeur de la batterie avec des valeurs limites tel que 50 ou 20, la valeur de la batterie est de 0 car elle correspond au nombre d'octets disponibles
Je suis conscient que ici le problème provient d'app inventor et non d'arduino, mais je me permets de vous demander de l'aide

Bonjour Flvio

Peux tu me mettre le fichier AIA (à zipper) et ton sketch, ça me ferai gagner du temps :wink:

A+
jpbbricole

comme la dernière fois, je suis considéré comme nouvel utilisateur donc je ne peux malheureusement pas vous fournir le fichier AIA, et que voulez vous dire par sketch ?

Je ne pensai pas que ca durai si longtemps, ce délais :woozy_face:
Tu as bien zippé l'AIA et copié et collé le zip dans le forum?
Ou essaies de me l'envoyer en message privé.

C'est le fichier INO qui est le programme de l'Arduino.
Copier l'entier du programme dans le presse-papier, dans le message cliquer sur l'icône <code> et y coller le presse papier.

Je crois que c'est au bout d'un certain nombre de posts — continuez à discuter un peu et ça devrait le faire :)

@jpbbricole je crois que je ne peux même pas envoyer de message privé à qui que ce soit, cepedant voici le programme arduino complet :

#include <SoftwareSerial.h>
#include <Duinoedu_SerialPlus.h>

//Tuto App inventor : https://lc.cx/Jksu
Duinoedu_SerialPlus  monSerialPlus;
String messageRecu = "" ;
// AIDE Gérer des échanges entre App inventor et Ardublock : https://lc.cx/oTLn


int pwm_b = 9;  //PWM control for motor outputs 3 and 4  
int dir_b = 8;  //direction control for motor outputs 3 and 4 



const int BATTERYPIN = A0; 

const float TensionMax = 5;
const float TensionMin = 0;

void setup()
{
  pinMode( 2 , OUTPUT);
  pinMode( 3 , OUTPUT); 
  monSerialPlus.branch(10,11); 
  monSerialPlus.begin(9600);
  digitalWrite(2 , LOW);
  digitalWrite(3 , LOW);

  pinMode(pwm_b, OUTPUT);
  pinMode(dir_b, OUTPUT);
  analogWrite(pwm_b, 0);

  Serial.begin(9600);
}

void loop()
{
  messageRecu = monSerialPlus.readText(DUINOEDU_NE_PAS_MEMORISER ) ;
  if (( (  String(messageRecu) ) == (  String("LED:1") ) ))
  {
    digitalWrite(2 , HIGH);
    digitalWrite(3 , LOW);
    
    digitalWrite(dir_b, LOW);  
    analogWrite(pwm_b, 255);
    
    messageRecu = """" ;
    
  }
  if (( (  String(messageRecu) ) == (  String("LED:0") ) ))
  {
    digitalWrite(3 , HIGH);
    digitalWrite(2 , LOW);
    
    digitalWrite(dir_b, HIGH);      
    analogWrite(pwm_b, 255);
   
  
    messageRecu = """" ;
  }
  if (( (  String(messageRecu) ) == (  String("LED:2") ) ))
  {
    digitalWrite(3 , LOW);
    digitalWrite(2 , LOW);
    analogWrite(pwm_b, 0);
    messageRecu = """" ;
    
    
  }

   float b = analogRead(BATTERYPIN); 

  int minValue = (1023 * TensionMin) / 5; 
  int maxValue = (1023 * TensionMax) / 5; 


  b = ((b - minValue) / (maxValue - minValue)) * 100;

  if (b > 100)
    b = 100; 

  else if (b < 0)
    b = 0;

  int value = b;
  Serial.println(value);
  monSerialPlus.println(value);
  delay(1000);
  monSerialPlus.print(String(value))
}

Bonjour Flvio

Ton problème provient d'un mélange des genres, en l'occurrence, des String et des int.
image

Quand tu fais:
monSerialPlus.println(value);
si value vaut 50, tu envoies un mot de 2 caractères composé d'un 5 et d'un 0
pour envoyer une valeur de 50, il faut faire
monSerialPlus.write(value);

Dans ton programme MAI, tu compares des integer, alors que tu reçois des String.

Dans cette partie, sans rien changer dans le sketch Arduino:
image
remplace le module bleu par ceci:
image
image

pour comparer ta réception.

A+
Bonne soirée
jpbbricole

mais de mémoire quand j'essayais avec monSerialPlus.write(value) je n'arrivais pas à téléverser le programme vers la carte Arduino

si vous aviez mis le point virgule à la fin de cette commande alors ça devrait fonctionner.