Go Down

Topic: [HOWTO] Guida (più o meno) completa all'utilizzo di Moduli Bluetooth (Read 231385 times) previous topic - next topic

pichard0203

Una volta che sei connesso il collegamento è bidirezionale, quindi SI.

Guglielmo
Ora, sto utilizzando un semplice bottone, e vorrei che una volta premuto, inviasse una stringa al dispositivo bluetooth connesso. Posto il codice:


Code: [Select]

const int pinBottone = 9;
int statoBottone = 0;    
                      

void setup() {

 Serial.begin(9600);
 
 pinMode (pinBottone, INPUT);
}



void loop() {

 statoBottone = digitalRead (pinBottone);


 if (statoBottone == HIGH) {
  
  Serial.println ("1")
   delay (300);
 }
}


Premendo il bottone sul monitor seriale appare "1", ma al telefono la stringa non arriva. Viceversa, digitando "1" con la tastiera a monitor seriale aperto, la stringa viene correttamente ricevuta.
Come posso risolvere?

EDIT: ho provato ad utilizzare anche una flag ma nulla, la stringa viene scritta sul monitor non ricevuta dal cellulare. Eppure la seriale in una connessione bluetooth è condivisa...
Sapete aiutarmi?

Code: [Select]
const int pinBottone = 9;
int statoBottone= 0;   
                           
byte flag = false;

void setup() {
 
  Serial.begin (9600);

  flag = false;

  pinMode (pinBottone, INPUT);

}



void loop() {
 
  statoBottone = digitalRead (pinBottone);

  if (statoBottone == HIGH) {
   
   flag = true;
   
 }



if (flag) {
  Serial.println ("1")
  delay (300);
  flag = false;
 }


}

gpb01

Mai usare la vera seriale con i moduli BT ...
... prima di tutti ci si preclude la possibilità di fare debug tramite essa e tramite monitor seriale e poi ... abbiamo detto decine di volte che i moduli BT collegati direttamente sulla seriale, spessissimo funzionano male o non funzionano affatto.

Crea una seriale virtuale sul pin 10 (RX) e 11 (TX) con la libreria SoftwareSerial, collega a tali pin il modulo BT e vedi come va.

Ovviamnete ...

10 (RX) <--- TX Bluetooth
11 (TX) ---> RX Bluetooth
GND ------ GND Bluetooth

Guglielmo
Search is Your friend ... or I am Your enemy !

pichard0203

Ho creato una seriale virtuale come mi hai detto (spero di aver fatto tutto correttamente). Ma ancora nulla, il problema rimane. Sto utilizzando una shield itead

Code: [Select]
#include <SoftwareSerial.h>
#define BT_TX_PIN 10
#define BT_RX_PIN 11
SoftwareSerial bt =  SoftwareSerial(BT_RX_PIN, BT_TX_PIN);

const int pinBottone = 9; //questa variabile è costante
int statoBottone= 0;     /*questa variabile NON è costante
                            ma può variare il proprio valore*/
byte flag = false;

void setup() {

   bt.begin(9600);
 
  //dichiaro il pin del bottone come un input:
  pinMode (pinBottone, INPUT);
  //definisco modalità pin
}



void loop() {
 


  // legge la posizione/stato del bottone
  // da notare che la variabile "int" cambia ogni volta valore
 
  statoBottone = digitalRead (pinBottone);

  // verifica se il bottone viene premuto.
  // se viene premuto, viene rilevato un segnale HIGH:
  if (statoBottone == HIGH) {
   
   bt.println ("1");       /*la comunicazione bluetooth, una volta
                           avviata, è bidirezionale: basta quindi
                           scrivere una lettera sulla seriale, e
                           automaticamente verrà inviata la suddetta
                           stringa al dispositivo connesso. Viceversa,
                           nel caso in cui si debba mandare un segnale
                           AD arduino, la stringa comparirà sul monitor
                           Seriale. Il monitor seriale viene letto da
                           entrambi i dispositivi connessi. */
  delay (300);
 }
}

gpb01

1. hai fatto il debouncing del bottone? Perché altrimenti i "ribalzi" si sprecano

2. hai messo una resistenza di pull-down per tenerlo normalmente a LOW? Altrimente è floating ed oscilla in continuazione tra LOW ed HIGH

3. nel modo che hai fatto, con il pin HIGH viene trasmesso in continuazione 0x31 0x0D (il carrattere 1 ed il Carriage return) ovvero due caratteri ed il tutto ripetuto ogni 3 decimi di secondo. E' questo che vuoi.

In ogni caso, se i collegamente sono fatti come si deve ed il BT è connesso ... DEVE funzionare ! Prova con un semplice emulatore di terminale BT per cellulare ...

Guglielmo
Search is Your friend ... or I am Your enemy !

pichard0203

#514
Mar 12, 2018, 10:56 pm Last Edit: Mar 12, 2018, 11:28 pm by pichard0203 Reason: Aggiunta di un allegato
1. hai fatto il debouncing del bottone? Perché altrimenti i "ribalzi" si sprecano

2. hai messo una resistenza di pull-down per tenerlo normalmente a LOW? Altrimente è floating ed oscilla in continuazione tra LOW ed HIGH

3. nel modo che hai fatto, con il pin HIGH viene trasmesso in continuazione 0x31 0x0D (il carrattere 1 ed il Carriage return) ovvero due caratteri ed il tutto ripetuto ogni 3 decimi di secondo. E' questo che vuoi.

In ogni caso, se i collegamente sono fatti come si deve ed il BT è connesso ... DEVE funzionare ! Prova con un semplice emulatore di terminale BT per cellulare ...

Guglielmo
1. Ho aggiunto il debouncing allo sketch. Lo allego sotto.

2. La resistenza di pull-down c'era già prima.

Questo sketch è il "debounce" presente negli Esempi, con l'aggiunta di un Serial.println e un bt.println:

Code: [Select]
#include <SoftwareSerial.h>
#define BT_TX_PIN 10
#define BT_RX_PIN 11
SoftwareSerial bt =  SoftwareSerial(BT_RX_PIN, BT_TX_PIN);

// constants won't change.
// set pin numbers:
const int buttonPin = 3;    
const int ledPin = 13;      

// Variables will change:
int ledState = HIGH;        
int buttonState;            
int lastButtonState = LOW;  


unsigned long lastDebounceTime = 0;  
unsigned long debounceDelay = 50;    

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

 Serial.begin (9600);
 bt.begin(9600);

  digitalWrite(ledPin, ledState);
}

void loop() {
  
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {

    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  digitalWrite(ledPin, ledState);
  Serial.println (ledState);    //<<<<<< QUESTO VIENE SCIRTTO
  bt.println (buttonState);     //<<<<<< QUESTO NON VIENE RICEVUTO DAL CELLULARE

  lastButtonState = reading;
}


Premendo il bottone, il Led cambia stato e viene scritto sul monitor seriale il Serial.println MA con il terminale bluetooth sul cellulare non viene ricevuto il bt.println

Allego lo screen dell'emulatore Android. La connessione è stabilita ma non viene ricevuto il segnale.

Non riesco a spiegarmi come sia possibile. Ho creato bene la seriale virtuale?

gpb01

Fai una prova ...
... al posto di questa riga:

Code: [Select]
bt.println (buttonState);     //<<<<<< QUESTO NON VIENE RICEVUTO DAL CELLULARE
... metti questo:

Code: [Select]
if (buttostate) bt.println ("High");
else bt.println ("Low");

... e dimmi se cambia qualche cosa.

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

... Sto utilizzando una shield itead ...
Non avevo notato questa affermazione ...
... quindi NON stai usando un modulino HC-5 che colleghi tu, stai usando una shield ... QUALE shield itead (metti il link)?   E su quali pin hai impostato la comunicazione sulla shield?

Guglielmo
Search is Your friend ... or I am Your enemy !

pichard0203

Grazie Guglielmo!
Ho provato con un modulino HC-06 e credo che il problema fosse nelle impostazioni della shield (ancora settate alle condizioni di fabbrica) perché ora funziona davvero tutto. Non è stato nemmeno necessario modificare le due righe di codice. Ti ringrazio ancora.

Riccardo

Go Up