Go Down

Topic: [ RISOLTO ]Settare PWM da SerialMonitor + Bluetooth (Read 10023 times) previous topic - next topic

gpb01

#30
Nov 02, 2013, 03:11 pm Last Edit: Nov 02, 2013, 03:15 pm by gpb01 Reason: 1
Allora ...
... ho preso un HC-05 ed ho fatto un po' di prove ...

1. Arduino (TX) -> HC-05 (RX) : funziona e, cosa simpatica, funziona anche in parallelo alla USB XD ... se, con la USB attaccata, tramite il serial monitor scrivi qualche cosa (che quindi entra sul RX di Arduino) ... lo vedi indietro sia sul serial monitor che ... sul bluetooth connesso ;)

2. HC-05 (TX) -> Arduino (RX) : effettivamente NON funziona ... comunque si alimenti Arduino :(

Ora, dato che, come dice Leo :

Quote
lo dimostra il fatto che a scheda Arduino agganciata al PC con cavetto seriale tu puoi dialogare con una periferica seriale tramite i pin D0 e D1.


... e che quindi, come io sapevo, se non si usa la USB si possono usare i pin 0 e 1 come RX, TX della seriale, il dubbio che mi viene è che sia un problema di tensioni ... difatti l'HC-05 lavora a 3.3v e non vorrei non ce la facesse a pilotare il pin RX in ingresso ad Arduino ...  :smiley-roll:

Guglielmo

Edit : pin che, come visibile nello schema, è sempre collegato al TX del 16U2 tramite una resistenza ....
Search is Your friend ... or I am Your enemy !

dxcoco2


gpb01


Quindi? come mi muovo?


... con la SoftwareSerial e scrivendoti una piccola routine per gestire l'arrivo di più caratteri terminati da un ... CR ? ;)

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

dxcoco2

Azz...ritorno al punto di partenza allora...in rete non sono riuscito a trovare niente.
Non è molto facile!!!

gpb01

#34
Nov 02, 2013, 03:29 pm Last Edit: Nov 02, 2013, 03:31 pm by gpb01 Reason: 1
Dai che non è difficile ... ti do i vari passi ... prova a scrivere una routine che li implementa (adesso, per prova, fallo con la seriale normale, poi lo modifichi per la SoftwareSerial ...)

1. ti crei un char array di X caratteri dove X è in numero massimo di caratteri che pensi di ricevere + 1
2. ti crei un indice dell'array che inizializzi a 0 (il primo carattere) e metti nella posizione 0 dell'array il valore 0x00

3. nel loop() controlli se c'è un carattere disponibile sulla seriale (Serial.available())
3.1. se non c'è prosegui a girare nel loop ed a fare le tue cose
3.2 se invece c'è lo confronti con il terminatore che ti aspetti (es. CR)
3.2.1 se è il terminatore (es. CR) allora la tua stringa è completata e la puoi elaborare
3.2.2 se NON è il terminatore ...
3.2.2.1 metti il carattere ricevuto nell'array alla posizione dell'indice
3.2.2.2 incrementi l'indice e poi scrivi nell'array 0x00 (intanto termini la stringa, tanto poi ci scrivi sopra)
3.2.2.3 controlli che l'inicie non sia arrivato alla fine dell'array (troppi caratteri ricevuti ... devi elaborarli)

e il giro si ripete ... che dici ? Non è difficile no ?

Guglielmo


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

dxcoco2

Ti ringrazio Gguglielmo ma....io sono un pochino acerbo e per  capire ho isogno di vedere esempi...andrebbe già bene un link dove fanno vedere simili utilizzi di codice...cosi non riesco proprio!

gpb01


Ti ringrazio Gguglielmo ma....io sono un pochino acerbo e per  capire ho isogno di vedere esempi...andrebbe già bene un link dove fanno vedere simili utilizzi di codice...cosi non riesco proprio!


Ma ... l'esempio ce l'hai ... la SerialCommand fa esattamente questo ... te l'ho detto dall'inizio ;)

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

leo72


gpb01

#38
Nov 02, 2013, 04:16 pm Last Edit: Nov 02, 2013, 04:19 pm by gpb01 Reason: 1

... e ho bisogno di vedere esempi...andrebbe già bene un link dove fanno vedere simili utilizzi di codice...cosi non riesco proprio!


OK, e speriamo che serva da punto di partenza per tutti quelli che hanno lo stesso tuo problema ...
... l'ho buttata giù velocemente, quindi è solo un esempio che va poi adattato alle specifiche esigenze ;)

Code: [Select]

#define MAXCHAR  32
#define TERCHAR  0x0D

char inputString[MAXCHAR + 1];
char inChar;
byte strIndex;

void setup() {
 strIndex = 0;
 inputString[strIndex] = 0x00;
 //
 Serial.begin(9600);
}

void loop() {
 //
 if (Serial.available()) {
   inChar = Serial.read();
   // se si vogliono vedere in HEX i caratteri che si ricevono
   // togliere il commento alla riga seguente
   // Serial.println(inChar, HEX);

   if (inChar == (char) TERCHAR) {
     // è arrivato il carattere terminatore, si pu` elaborare la stringa
     // In questo esempio semplicemente la si stampa ...
     Serial.println(inputString);
     //
     // finito il suo uso la si ripulisce per un uso successivo
     strIndex = 0;
     inputString[strIndex] = 0x00;
   }

   // NON è arrivato il carattere terminatore, si memorizza il carattere ricevuto
   // e si sposta il fine stringa ...
   inputString[strIndex] = inChar;
   strIndex++;

   if (strIndex > MAXCHAR) {
     // ... NON c'è pi` spazio nella stringa ... bisogna elaborarla e svuotarla
     // In questo esempio semplicemente la si stampa ...
     Serial.println(inputString);
     //
     // e la si ripulisce per un uso successivo
     strIndex = 0;
     inputString[strIndex] = 0x00;
   }
 }
}


... prova a vedere se capisci quello che fa e se riesci ad adattarla ;)

Guglielmo

Edit : giusto per chiarezza, MAXCHAR è quanti caratteri al massimo potrà essere lunga la stringa in arrivo. Da mettere con precisione per evitare di sprecare preziosa memoria; TERCHAR è il carattere terminatore che ci si aspetta di ricevere ... l'ho messo a CR (0x0D) ma si può usare un qualsiasi altro carattere
Search is Your friend ... or I am Your enemy !

dxcoco2

Grazie mille Guglielmo...adesso comincio "a vedere la luce"!
Per far si che funzioni nel mio caso devo dirigere cio che invio sui pin 10 e 11 sulla serial monitor giusto?

gpb01


Grazie mille Guglielmo...adesso comincio "a vedere la luce"!
Per far si che funzioni nel mio caso devo dirigere cio che invio sui pin 10 e 11 sulla serial monitor giusto?


No, devi usare la stessa logica, solo che invece di usare la Serial.xxxxx come ho fatto io, ti creerai con la SoftwareSerial una tua seriale (es. mySerial) e dovrai leggere da quella (... e se vuoi mandare qualche cosa al BT anche scrivere su quella). ;)

Naturalmente ti resta libera la Serial.xxxx che potrai usare per messaggi di debug, input da tastiera, ecc. ecc.

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

dxcoco2


gpb01

#42
Nov 02, 2013, 04:56 pm Last Edit: Nov 02, 2013, 04:59 pm by gpb01 Reason: 1

via non capisco ci rinuncio!


Ma cosa non capisci ???

Il mio esempio riceve i dati dalla seriale (quella vera, pin 0,1) ... ora, a te serve usare il BT con la SoftwareSerial ... dovrai quindi cambiare le mie chiamate che leggono i caratteri dalla Serial con le stesse, ma che leggono dalla SoftwareSerial che tu creerai ...

Cosa c'è di difficile in questo ???  :smiley-eek:

Guglielmo

Edit : in pratica tu all'inizio, in più, avrai una "SoftwareSerial mySerial(10, 11); // RX, TX" e quindi avrai una nuova seriale che non si chiama Serial ma mySerial ... i comandi rimarranno gli stessi ...
Search is Your friend ... or I am Your enemy !

dxcoco2

Io ho capito cosa vuoi dire ma il problema è che non mi riesce farlo funzionare!

Code: [Select]
include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);
#define MAXCHAR  4
#define TERCHAR  0x0D

char inputString[MAXCHAR + 1];
char inChar;
byte strIndex;
int led1= 13;
int led2= 2;
int led3= 3;
int led4= 4;
int btcnt= 6;
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by
int convar = 0;        // determina se il dispositivo è connesso

void setup()
{
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(btcnt, OUTPUT);

  strIndex = 0;
  inputString[strIndex] = 0x00;
   mySerial.begin(9600);
   Serial.begin(9600);
   Serial.println("Controllo LED Bluetooth - Home Control V1.0");
   delay(1000);
}


void loop()
{
  if (convar > 0) {
    analogWrite(btcnt, brightness);   

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }     

  delay(30);           
  }
  else {

  }

   if (mySerial.available()) {
    inChar = mySerial.read();
    // se si vogliono vedere in HEX i caratteri che si ricevono
    // togliere il commento alla riga seguente
    // Serial.println(inChar, HEX);

    if (inChar == (char) TERCHAR) {
      // è arrivato il carattere terminatore, si pu` elaborare la stringa
      // In questo esempio semplicemente la si stampa ...
          if (inputString == ("A001")){
         digitalWrite(led2, HIGH);
    }
    digitalWrite(led2, HIGH);
      mySerial.println(inputString);
      //
      // finito il suo uso la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }

    // NON è arrivato il carattere terminatore, si memorizza il carattere ricevuto
    // e si sposta il fine stringa ...
    inputString[strIndex] = inChar;
    strIndex++;

    if (strIndex > MAXCHAR) {
      // ... NON c'è pi` spazio nella stringa ... bisogna elaborarla e svuotarla
      // In questo esempio semplicemente la si stampa ...
      mySerial.println(inputString);
      //
      // e la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }

}
}


Questo è il codice...ti sembra giusto?

gpb01


Io ho capito cosa vuoi dire ma il problema è che non mi riesce farlo funzionare!
Code: [Select]

...
if (inputString == ("A001"))
...



dxcoco2 ... ti assicuro, senza voler offendere, ma ... mi sembra che tu prima di avventurarti in questi programmi ... dovresti studiarti un po' meglio le basi del C ... ;)

In C NON è possibile fare un confronto come quello che hai scritto tu ... o fai tu il confronto carattere a carattere oppure utilizzi la funzione strcmp() che fa parte di cstring (string.h) ...

Code: [Select]
int strcmp ( const char * str1, const char * str2 );

... però ... ripeto ... queste sono veramente le basi ... sarebbe veramente meglio che dedicassi un po' di tempo allo studio del C e poi tornassi ad affrontare, con maggiore preparazione, queste problematiche ... ;)

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

Go Up