Stazione meteo bluetooth con HC-05 e lettura dati da Android

Buonasera, ho acquistato questo modulo Bluetooth hc-05 : http://s.aliexpress.com/fUbQNRJ7
Che devo usare x comandare un relè in seguito ad un comando da inviare da smartphone android. Ho provato ad effettuare i cablaggi e ad alimentarlo e riesco ad accoppiarlo con lo smartphone.
Ho qualche dubbio però, in quanto non riesco ad inviargli i comandi.

Questo modulo x farlo funzionare come voglio devo impostarlo come slave?

Lo sketch è questo:

#include <SoftwareSerial.h>
 
int rxPin = 10;
int txPin = 11;
SoftwareSerial bluetooth(rxPin, txPin);
 
String message; //string that stores the incoming message
const int Led = 13;
 
void setup()
{
  Serial.begin(9600); //set baud rate
  bluetooth.begin(9600); //set baud rate
  pinMode(Led,OUTPUT);
}
 
void loop()
{
  while(bluetooth.available()){
    message+=char(bluetooth.read());
  }
  if(!bluetooth.available())
  {
    if(message!="")
    {//if data is available
      if(message == "H"){
          digitalWrite(Led, HIGH);
          Serial.println("Led ON"); //show the data
          delay(20);
          message=""; //clear the data
       }
       else if(message == "L"){
          digitalWrite(Led, LOW);
          Serial.println("Led OFF"); //show the data
          delay(20);
          message=""; //clear the data
       }
    }
  }
}

e l'app questa: Arduino Bluetooth Controller

Purtroppo i comandi da Android ad Arduino non arrivano, avete delle idee?

Grazie

Guarda, per fare le prove, inizia con un qualche cosa di più semplice ... qualche cosa che fa semplicemente l'echo sul monitor seriale del bluetooth e viceversa.

Questo è ampiamente collaudato:

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

... quello che invi sul BT ti deve apparire sul monitor seriale, quello che scrivi nel monitor seriale deve arrivare via BT.

Se non funziona ... puoi buttare il modulo BT e prendere uno da un venditore migliore che dia almeno le specifiche, come QUESTO (... nel tuo non è neanche scritto se la basetta prevede o meno la logica per rendere il modulo 5V tolerant ... dato che gli HC-05 funzionano a 3.3V).

Guglielmo

Grazie Guglielmo, nel pomeriggio provo il tuo sketch. Comunque la basetta sul retro riporta
Vcc= 3.6 - 6 V

Inoltre è il modello HC05 / GW 0-40.

A dopo

droidprova:
Grazie Guglielmo, nel pomeriggio provo il tuo sketch. Comunque la basetta sul retro riporta
Vcc= 3.6 - 6 V

... purtroppo l'indicazione NON è sufficiente ... ci sono basette che adattano l'alimentazione e NON i segnali ... quindi bisogna sempre fare riferimento a quanto specifica il venditore.

Comunque prova e fammi sapere :wink:

Guglielmo

Dubbio ... ti sei ricordato di incrociare i segnali vero ?

HC-05 TX ----> SoftwareSerial RX
HC-05 RX <---- SoftwareSerial TX

Guglielmo

ok Guglielmo, con tuo sketch ottengo da monitor seriale:

--- Ports ready ---

e poi

H e L

come da comandi app ... Poi ho caricato il mio sketch e funziona alla grande. Forse non ho invertito i pin tx ed rx come dicevi tu. Insomma continuo ad essere niubbo, per questo ho bisogno del vostro sostegno.

Grazie ancora. Se servono altre prove su questa basetta dimmi pure.

Edit: visto che ci sono, incollo il link alla discussione dove propongo l'uso di una app fatta da me per accendere e spegnere una luce (o ciò che si vuole). Provata e funzionante: App Androino

Se tutto funziona e ricevi correttamente i comandi che invii ... BENE !!!

Buon lavoro e buona prosecuzione :wink:

Guglielmo

Ragazzi sto andando oltre con il programma.
In pratica sto cercando di fare una stazione meteo essenziale che invii i dati tramite BT al mio smartphone Android.
Dunque lato cablaggio e programma sensori è tutto ok (tranne il DHT22 che stampa il dato umidità sempre al 1%, forse è rotto).

Il fatto principale è che non so come procedere con la parte del software del BT.
In primis ho un dubbio: dovendo usare il modulo HC-05 per inviare i dati, quest'ultimo deve essere master o slave o è indifferente?

Poi come procedo con il mio sketch:

/*===================================================================
  Stazione meteo essenziale con misurazione della pressione barometrica, temperatura e umidità. I dati vengono stampati sulla seriale e via BT.
  Collegamenti del BMP180 ad Arduino:
  3.3 -> +3.3V
  Gnd -> GND
  SCL -> A5
  SDA -> A4
  Collegamenti del DHT22 ad Arduino:
  1 -> +5V
  2 -> D2
  3 -> vuoto
  4 -> GND
  ==================================================================== */

// includo librerie
#include "DHT.h"
#include <Wire.h>
#include <BMP180.h>
#include <SoftwareSerial.h>

DHT dht;                             // Crea un'istanza per il sensore DHT22
BMP180 bmp;                          // Crea un'istanza per il sensore BMP180

int rxPin = 10;
int txPin = 11;
SoftwareSerial bluetooth(rxPin, txPin);

// variabili BMP180
float pressione;
float altitudine;
float temperatura;
float pressione_slm;

//variabile generale
float temp_media_sens;

void setup()
{
  Serial.begin(9600);
  bluetooth.begin(9600);
  dht.setup(2);                      // collego data DHT 22 al pin 2 di arduino
  Wire.begin();                      // Inizializza la seriale I2C per il sensore BMP180.
  bmp = BMP180();                    // Inizializza l' istanza per il BMP180.
  if (bmp.EnsureConnected())         // Controllo di connessione sul sensore BMP180.
  {
    bmp.SoftReset();
    bmp.Initialize();
  }
}
void loop()
{
  delay(dht.getMinimumSamplingPeriod());
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  pressione = bmp.GetPressure() / 100.0;
  temperatura = bmp.GetTemperature();
  pressione_slm = pressione + 21.6;                            // aggiungo 9 hPa x ogni 100 m di altitudine(ripetto a quota mare) dov'è ubicata la stazione meteo
  temp_media_sens = (temperature + temperatura) / 2;           // faccio la media della temperatura letta dai due sensori

  Serial.println("--------------------");
  Serial.print("Umidita' = ");
  Serial.print(humidity); 
  Serial.println(" %");
  Serial.print("Temperatura DHT22 = ");
  Serial.print(temperature);
  Serial.println(" C");
  Serial.print("Pressione stazione meteo = ");
  Serial.print(pressione);
  Serial.println(" hPa");
  Serial.print("Pressione SLM = ");
  Serial.print(temp_media_sens);
  Serial.println(" hPa");
  Serial.print("Temperatura BMP180 = ");
  Serial.print(temperatura);
  Serial.println(" C");
  Serial.print("Temperatura media sensori = ");
  Serial.print(temp_media_sens);
  Serial.println(" C");
  Serial.println("--------------------");
  delay(5000);
}

Dopo aver inserito la libreria serial, aver indicato i pin RX e TX la stampa BT sullo smartphone con che comando si fa?

Grazie 1000!

Il modulo HC-05 può fare sia da MASTER che da SLAVE ... di base, quando lo compri, arriva configurato come SLAVE che è quello che a te serve per collegarti al tuo SmatPhone, quindi ... NON toccarlo e lascialo com'è :wink:

Per il resto, una volta che hai istanziato la SoftwareSerial con la riga :

SoftwareSerial bluetooth(rxPin, txPin);

crei una porta seriale in cui, i vari metodi, invece di chiamarsi Serial.xxxxx() si chiamano bluetooth.xxxxx(), ma sono praticamete gli stessi, quindi, se sai usare la classe Serial, sai usare anche la SoftwareSerial.

Guglielmo

Grazie Guglielmo, funziona!
Non ci credo che in un pomeriggio ho abbozzato la mia prima stazione meteo.

droidprova:
Non ci credo che in un pomeriggio ho abbozzato la mia prima stazione meteo.

Guglielmo

Ho due problemi con il codice:

/*===================================================================
  Stazione meteo essenziale con misurazione della pressione barometrica, temperatura e umidità. I dati vengono stampati sulla seriale e via BT.
  Collegamenti del BMP180 ad Arduino:
  3.3 -> +3.3V
  Gnd -> GND
  SCL -> A5
  SDA -> A4
  Collegamenti del DHT22 ad Arduino:
  1 -> +5V
  2 -> D2
  3 -> vuoto
  4 -> GND
  ==================================================================== */

// includo librerie
#include "DHT.h"
#include <Wire.h>
#include <BMP180.h>
#include <SoftwareSerial.h>

DHT dht;                             // Crea un'istanza per il sensore DHT22
BMP180 bmp;                          // Crea un'istanza per il sensore BMP180

int rxPin = 10;
int txPin = 11;
SoftwareSerial bluetooth(rxPin, txPin);

// variabili BMP180
float pressione;
float altitudine;
float temperatura;
float pressione_slm;

//variabile generale
float temp_media_sens;

void setup()
{
  Serial.begin(9600);
  bluetooth.begin(9600);
  dht.setup(2);                      // collego data DHT 22 al pin 2 di arduino
  Wire.begin();                      // Inizializza la seriale I2C per il sensore BMP180.
  bmp = BMP180();                    // Inizializza l' istanza per il BMP180.
  if (bmp.EnsureConnected())         // Controllo di connessione sul sensore BMP180.
  {
    bmp.SoftReset();
    bmp.Initialize();
  }
}
void loop()
{
  delay(dht.getMinimumSamplingPeriod());
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  pressione = bmp.GetPressure() / 100.0;
  temperatura = bmp.GetTemperature();
  pressione_slm = pressione + 21.6;                            // aggiungo 9 hPa x ogni 100 m di altitudine(ripetto a quota mare) dov'è ubicata la stazione meteo
  temp_media_sens = (temperature + temperatura) / 2;           // faccio la media della temperatura letta dai due sensori
 
    Serial.println("--------------------");
    Serial.print("Umidita' = ");
    Serial.print(humidity);
    Serial.println(" %");
    bluetooth.print(humidity);
    Serial.print("Temperatura DHT22 = ");
    Serial.print(temperature);
    Serial.println(" C");
    Serial.print("Pressione stazione meteo = ");
    Serial.print(pressione);
    bluetooth.print(pressione);
    Serial.println(" hPa");
    Serial.print("Pressione SLM = ");
    Serial.print(temp_media_sens);
    Serial.println(" hPa");
    Serial.print("Temperatura BMP180 = ");
    Serial.print(temperatura);
    bluetooth.print(temperatura);
    Serial.println(" C");
    Serial.print("Temperatura media sensori = ");
    Serial.print(temp_media_sens);
    Serial.println(" C");
    Serial.println("--------------------");
    delay(5000);
  
}

1° quando ricevo i dati sullo smartphone, questi restano impressi per un solo secondo, poi spariscono e dopo il delay di 5000 ricompaiono per un secondo e cosi via all'infinito. Si può sistemare questa cosa? E come?

2° vorrei attivare il ciclo di stampa sia serial che bluetooth, solo se c'è connessione tra il modulo HC-05 e uno smartphone. Pensavo ad un if

if (Serial.available()){
xxxxxxxxx
}

ma non va. Come sistemo?

Grazie

Per il mio 2° quesito, è corretto usare questo: https://www.arduino.cc/en/Reference/SoftwareSerialAvailable ?

Grazie

  1. tu li trasmetti i dati ogni 5 secodni (nel loop() c'è un bel delay(5000)) ... chi sul tuo smatphone li cancella non saprei dirtelo ... con che programma li ricevi e li visualizzi ?

  2. NO, quella ti dice solo se ci sono dei caratteri disponibili da leggere, ma NON ha nulla a che vedere con la connessione.

Se vuoi sapere se il modulo BT è connesso o meno ... la cosa si complica ...

2.1 devi mandare il modul in modalità comandi AT
2.2 in tale modalità il modulo NON lavora a 9600 ma a 38400
2.3 devi sapere usare bene i comandi AT onde non creare problemi

  1. Non è più semplice che il programma che devi avere sullo smatphone invi lui un carattere per dire che è connesso e che gli puoi inviare i dati e che, se non ricevi tale carattere, lo ritieni sconnesso e non gli mandi nulla ?

  2. Altrimenti, se ben ricordo, sul HC-05, quando è connesso, il LED lampeggia in modo diverso ...
    ... portando il segnale su un pin digitale di Arduino e misurando il tempo tra un lampeggio ed un altro, puoi sapere se è connesso o meno.

Guglielmo

I dati li ricevo con una app che ho scritto io tramite app inventor, al massimo per fare delle prove più "serie" hai un' app valida e pluri testata, da suggerirmi?

Per l'altra questione ho capito. lascio perdere perchè non voglio complicarmi la vita.

Grazie

droidprova:
I dati li ricevo con una app che ho scritto io tramite app inventor, al massimo per fare delle prove più "serie" hai un' app valida e pluri testata, da suggerirmi?

Se l'hai scritta tu dovresti capire perché, una volta ricevuti, poi vengon cancellati dallo schermo ... ::slight_smile:
Arduino sicuramente NON è, dato che alla fine della trasmissione dell'ultima Serial.println("--------------------"); fa un delay(5000); e quindi ... per 5 secondi è bloccato !

Se vuoi vedere i dati che arrivano con certezza ... usa un semplice emulatore di terminale Bluetooth ...
... io ho sempre usato QUESTA con cui ricevo ed invio comandi ... è gratuita e funziona benissimo :slight_smile:

Guglielmo

Grazie

vorrei attivare il ciclo di stampa sia serial che bluetooth, solo se c'è connessione tra il modulo HC-05 e uno smartphone.

Per controllare se l'HC-05 è connesso, c'e' l'apposito pin STATE
http://www.martyncurrey.com/hc-05-fs-040-state-pin/

Brunello:
Per controllare se l'HC-05 è connesso, c'e' l'apposito pin STATE ...

VERO, oltretutto il modulo che lui ha comprato porta anche fuori il segnale :slight_smile:

Guglielmo