Problème module bluetooth HC06 AppInventor

Bonjour,

Dans le cadre d’un projet avec mes élèves, ceux-ci doivent réaliser une serre domotisée. Les compétences à acquérir sont la lecture des données des capteurs par la biais d’une programmation.
Ainsi la première étape est de programmer le tout et la seconde est de réaliser une application android ou l’on récupère l’ensemble des informations.

Le matériel à disposition est :

  • Arduino Uno
  • HC06
  • DHT22
  • Sonde d’humidité pour le sol

Ainsi, mon problème est à ce stade : J’arrive à afficher l’ensemble des informations mais au bout d’un certains moment un message d’erreur apparaît :

Select list item : List index too large
Select list item : Attempt to get item number 3 of a list of length 2 : (Terre seche 20,60 *C)

Photo ci-joint.
Je précise que l’on souhaite avoir en direct, sans interruption, la valeur des capteurs

Je mets également ci-joint le code app inventor et arduino.

#include "DHT.h"
#define DHTPIN 2 
#define DHTTYPE DHT22   
#include <SoftwareSerial.h>


String messageRecu;
const int PinAnalogiqueHumidite = A0;   
int temp;  //Humidite su sol, mesure analogique

SoftwareSerial HC06(0,1);
DHT dht(DHTPIN, DHTTYPE);


void setup()

{
  Serial.begin(9600);
  HC06.begin(9600);  
  pinMode(PinAnalogiqueHumidite, INPUT);       //pin A0 en entrée analogique
  Serial.println("DHTxx test!");
  dht.begin();

}
 
void loop() {
   
  temp = analogRead(PinAnalogiqueHumidite);

  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();


  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t))
 {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  
if  (temp <= 400)
{
  Serial.print("Terre humide");   
}  
  else {
    Serial.print("Terre seche");  
 } 
      Serial.print("|");

 
 Serial.print(t);
  Serial.print(" *C ");
  
  Serial.print("|");
  
 Serial.print(h);
  Serial.print(" %\t");

      Serial.print("|");

  
delay(1000);
}

Merci pour votre aide.


Je précise que le message d'erreur apparaît que quand j'utilise sur app inventor une horloge. Si j'utilise un bouton en condition j'ai aucun soucis :

If button appuyé then afficher ...

(Cette solution n'est pas envisageable car les valeurs ne sont pas en directs).

Bonjour

SoftwareSerial HC06(0,1);

Pourquoi avoir mélangé les E/S série et les réunissant sur les pins 0 et 1 ?
Attribuer au HC06 deux pins bien à lui en déplaçant le SoftwareSerial

Les Serial.print() sont envoyés par le HC06 a une application qui ne sait pas quoi en faire

al1fch:
Bonjour

SoftwareSerial HC06(0,1);

Pourquoi avoir mélangé les E/S série et les réunissant sur les pins 0 et 1 ?
Attribuer au HC06 deux pins bien à lui en déplaçant le SoftwareSerial

Les Serial.print() sont envoyés par le HC06 a une application qui ne sait pas quoi en faire

Je débute avec le bluetooth. J'ai donc récupéré un tutoriel sur internet pour m'en inspirer. Il branche le HC06 sur les pin 0,1. Ce n'est pas adapté ?
Je dois donc lui mettre deux pins bien distincts (genre 10,11) ?

Ça va résoudre le soucis ?

Merci.

exemple avec SoftSerial en 0 et 1 ? mauvaise pioche !

SoftSerial sert à créer un port série distinct du port série matériel (utilisant les pins 0 et 1)
Donc oui, attrribuer 2 pins disponibles pour dialoguer en 'SoftSerial' avec le HC06

Ne pratiquant pas du tout App Inventor je ne garantis pas que ça va suffire, mais ça ne peut qu'aider en évitant de 'mélanger les pinceaux'
Il y aura une séparation entre ce qui est pour le HC et ce qui est pour le PC

Tu as une idée de programme ?

Je dois mettre quoi pour définir les pins du HC06 ?

SoftwareSerial HC06(11,10);

C'est toujours a même commande après pour envoyer l'information ?
Serial.print () ?

Merci pour l'aide !

Salut,
Voici des extraits de code d’une station méteo qui envoie des données sur mon smatphone en BT

Déclaration BT

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(15, 14); // RX | TX

A mettre dans setup

BTSerial.begin(57600); // par defaut 9600
BTSerial.println("Station méteo");

La boucle emission de données vers smartphone

void BT ()
{
  
  if (BTSerial.available()) Serial.write(BTSerial.read());
  if (Serial.available()) BTSerial.write(Serial.read());
  //-----------------------------
  temp_Int = dht.readTemperature();
  temp_Int_int = int(temp_Int); 
  temp_Int_dec = int((temp_Int - temp_Int_int)*10.);
   //--------------------
  temp_Ext=(sensors.getTempCByIndex(0));
  temp_Ext_int = int(temp_Ext); 
  temp_Ext_dec = int((temp_Ext - temp_Ext_int)*10.);
  //------------------------
  int pression_atm_bt = ((bmp.readPressure()/100)+17);
  //--------------------------------
  sprintf(DataBT,"%u.%u%u.%u%u",temp_Ext_int,temp_Ext_dec,temp_Int_int,temp_Int_dec,pression_atm_bt ); 
  //Serial.println(DataBT);
  BTSerial.print(DataBT);
  
  
}

Je suis toujours en galère …
Je n’y arrive pas mais vraiment pas du tout !

#include <SoftwareSerial.h>

#include <DHT.h>
#include <rgb_lcd.h>

SoftwareSerial HC06(1,0);

int _ABVAR_1_sol = 0 ;
int _ABVAR_2_temp = 0 ;
DHT dht22_pin_2(2, 22);

int _ABVAR_3_hum = 0 ;
int _ABVAR_4_lum = 0 ;
boolean __ardublockDigitalRead(int pinNumber)
{
  pinMode(pinNumber, INPUT);
  return digitalRead(pinNumber);
}


rgb_lcd rgbLcd;
void __ardublockDigitalWrite(int pinNumber, boolean status)
{
  pinMode(pinNumber, OUTPUT);
  digitalWrite(pinNumber, status);
}


void setup()
{
  dht22_pin_2.begin();

  rgbLcd.begin(16,2);
  rgbLcd.setRGB(constrain(100,0,255),constrain(0,0,255),constrain(100,0,255));
   Serial.begin(9600);
  HC06.begin(9600);  
}

void loop()
{
  _ABVAR_1_sol = analogRead(0) ;
  _ABVAR_2_temp = dht22_pin_2.readTemperature() ;
  _ABVAR_3_hum = dht22_pin_2.readHumidity() ;
  _ABVAR_4_lum = ( 1023 - analogRead(1) ) ;
  if (!( __ardublockDigitalRead(3) ))
  {
    if (( ( _ABVAR_1_sol ) <= ( 400 ) ))
    {
      rgbLcd.setCursor(0, 0);
      rgbLcd.print("Terre seche" );

      rgbLcd.print("                ");
      __ardublockDigitalWrite(5, HIGH);
    }
    else
    {
      if (( ( ( _ABVAR_1_sol ) > ( 400 ) ) && ( ( _ABVAR_1_sol ) <= ( 720 ) ) ))
      {
        rgbLcd.setCursor(0, 0);
        rgbLcd.print("Terre humide" );
          rgbLcd.print("                ");
      }
      else
      {
        rgbLcd.setCursor(0, 0);
        rgbLcd.print("Terre innondee" );

        rgbLcd.print("                ");
      }
      __ardublockDigitalWrite(5, LOW);
    }
    rgbLcd.setCursor(0, 1);
    rgbLcd.print("Temperature :" );
    rgbLcd.print(_ABVAR_2_temp );
    rgbLcd.print("                ");
  }
  else
  {
    if (( ( _ABVAR_1_sol ) <= ( 400 ) ))
    {
      __ardublockDigitalWrite(5, HIGH);
      if (( ( _ABVAR_4_lum ) <= ( 300 ) ))
      {
        rgbLcd.setCursor(0, 0);
        rgbLcd.print("Soleil : Bon" );
        rgbLcd.print("                ");
      }
      else
      {
        if (( ( ( _ABVAR_4_lum ) > ( 300 ) ) && ( ( _ABVAR_4_lum ) <= ( 500 ) ) ))
        {
          rgbLcd.setCursor(0, 0);
          rgbLcd.print("Soleil : Faible" );
          rgbLcd.print("                ");
        }
        else
        {
          rgbLcd.setCursor(0, 0);
          rgbLcd.print("Soleil : Mauvais" );
          rgbLcd.print("                ");
        }
      }
    }
    else
    {
      if (( ( _ABVAR_4_lum ) <= ( 300 ) ))
      {
        rgbLcd.setCursor(0, 0);
        rgbLcd.print("Soleil : Bon" );
        rgbLcd.print("                ");
      }
      else
      {
        if (( ( ( _ABVAR_4_lum ) > ( 300 ) ) && ( ( _ABVAR_4_lum ) <= ( 500 ) ) ))
        {
          rgbLcd.setCursor(0, 0);
          rgbLcd.print("Soleil : Faible" );
          rgbLcd.print("                ");
        }
        else
        {
          rgbLcd.setCursor(0, 0);
          rgbLcd.print("Soleil : Mauvais" );
          rgbLcd.print("                ");
        }
      }
      __ardublockDigitalWrite(5, LOW);
    }
    rgbLcd.setCursor(0, 1);
    rgbLcd.print("Humidite : %" );
    rgbLcd.print(_ABVAR_3_hum );
    rgbLcd.print("                ");
  }


//=================================================================================================================
  if (( ( _ABVAR_1_sol ) <= ( 400 ) ))
    {
      Serial.print("Terre seche");
            Serial.print("|");
    }
    else
    {
      if (( ( ( _ABVAR_1_sol ) > ( 400 ) ) && ( ( _ABVAR_1_sol ) <= ( 720 ) ) ))
      {
       
        Serial.print("Terre humide");
                          Serial.print("|");
      }
      else
      {
        
        Serial.print("Terre innondee");
            Serial.print("|");
      }
    }

//=================================================================================================================

if (( ( _ABVAR_1_sol ) <= ( 400 ) ))
    {
      if (( ( _ABVAR_4_lum ) <= ( 300 ) ))
      {
        Serial.print("Soleil : Bon");
                    Serial.print("|");
      }
      else
      {
        if (( ( ( _ABVAR_4_lum ) > ( 300 ) ) && ( ( _ABVAR_4_lum ) <= ( 500 ) ) ))
        {
        
          Serial.print("Soleil : Faible");
                      Serial.print("|");
        }
        else
        {
          Serial.print("Soleil : Mauvais");
                      Serial.print("|");
        }
      }
    }

//=================================================================================================================

  Serial.print(_ABVAR_2_temp );
              Serial.print("|");
//=================================================================================================================
  Serial.print(_ABVAR_3_hum );
              Serial.print("|");

  delay( 1000 );
}

J’ai toujours le message d’erreur. J’ai essayé de modifier le programme mais rien à faire ça ne change rien. SI quelqu’un à une solution ce serait cool.

Merci

attribuer a SofwareSerial() des pins autres que 0 et 1.ça ne résoudra peut être pas tout mais c'est nécessaire

al1fch:
attribuer a SofwareSerial() des pins autres que 0 et 1.ça ne résoudra peut être pas tout mais c'est nécessaire

Oui mais quand je modifie 0,1 par d'autres valeurs ça ne fonctionne plus ...

attribuer a SofwareSerial() des pins autres que 0 et 1.ça ne résoudra peut être pas tout mais c'est nécessaire

Oui mais quand je modifie 0,1 par d'autres valeurs ça ne fonctionne plus ...

ET comment est branché le HC06 quand des valeurs différentes de 0 et 1 ont été choisies ?

al1fch:
Oui mais quand je modifie 0,1 par d'autres valeurs ça ne fonctionne plus ...

ET comment est branché le HC06 quand des valeurs différentes de 0 et 1 ont été choisies ?

Il faut bien brancher sur deux pins différents mais c'est le code quand je branche sur d'autre pins que je ne comprends pas ...

Bien étudier ligne à ligne l'exemple donné par Hameau

c'est possible de m'éclaircir ces 3 points SVP ?

void BT ()
{
  
  if (BTSerial.available()) Serial.write(BTSerial.read());
  if (Serial.available()) BTSerial.write(Serial.read());
  sprintf(DataBT,"%u.%u%u.%u%u",temp_Ext_int,temp_Ext_dec,temp_Int_int,temp_Int_dec,pression_atm_bt ); 
  

//Serial.println(DataBT);
  BTSerial.print(DataBT);
  
  
}

De plus, pourquoi avons nous BT devant chaque élément ?

Merci pour le temps consacré aux réponses !

c'est un choix du programmeur qui a choisi de faire figurer les lettres BT pour tour ce qui est BlueTooth, c'est court et ça évoque bien la chose...
Mettez partout WXYZ à la place de BT, ce sera moins clair......

al1fch:
c'est un choix du programmeur qui a choisi de faire figurer les lettres BT pour tour ce qui est BlueTooth
mettez partout WXYZ à la place de BT, ce sera moins clair......

Merci

Concernant ces deux lignes c'est possible d'éclairer svp ?

if (BTSerial.available()) Serial.write(BTSerial.read());
if (Serial.available()) BTSerial.write(Serial.read());

sprintf(DataBT,"%u.%u%u.%u%u",temp_Ext_int,temp_Ext_dec,temp_Int_int,temp_Int_dec,pression_atm_bt );

en gros

if ( BTSerial.available() ) :
Si des données sont disponibles en provenance du BlueTooth (=port série sofware)

*Serial.write__________**(BTSerial.read()); *
envoies sur le terminal__ la premiére donnée disponible

C'est bien expliqué sur cette page au paragraphe : 'On m'a parlé ?'
Ce site de tutoriels est à utiliser et faire utiliser systématiquement

pour sprintf : chercher sur le web des explications sur sa syntaxe, comme celle -ci

Salut,
pour gfougeray, j’ai mis en lien le code complet de ma station méteo avec connexion BT vers un smartphone.

Et en fichier joint le code arduino.

@+

Station_meteo_TFT_v5_opti.ino (9.08 KB)