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?
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).
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.
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
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?
Il modulo HC-05 può fare sia da MASTER che da SLAVE ... di base, quando lo compri, arriva configurato come SLAVEche è quello che a te serve per collegarti al tuo SmatPhone, quindi ... NON toccarlo e lascialo com'è
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.
/*===================================================================
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
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 ?
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
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 ?
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.
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.
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 ... :
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