Pages: 1 [2]   Go Down
Author Topic: Domande Basilari Su Come Leggere Dati da 2 Sensori  (Read 1678 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non mi interessa ottenere un valore in centimetri, mi interessa solo ottenere un valore riguardo la distanza da entrambi i sensori...
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 929
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova con questo. Ho inserito i ritardi giusti ed un print per vedere se il buffer della seconda seriale si riempie.
Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4);
SoftwareSerial mySerial2(5, 6);

byte Hdata = 0;
byte Ldata = 0;
byte CHKS = 0;
unsigned int Misura = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  mySerial2.begin(9600);
}

void loop() {

  if (mySerial.available() > 0) {
    if (mySerial.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial.read();     //continua la lettura e assegna alle
      Ldata = mySerial.read();     //variabili le letture successive.
      CHKS = mySerial.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
      if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
        Serial.print("Misura1cm ");
        Serial.println(Misura / 10, DEC);
      }
    }
  }  

  delay(50);                             // rimani fermo per 50 ms (tempo di ciclo del sensore)

  if (mySerial2.available() > 0) {
    Serial.print("Buffer ");
    Serial.println(mySerial2.available(), DEC);
    if (mySerial2.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial2.read();     //continua la lettura e assegna alle
      Ldata = mySerial2.read();     //variabili le letture successive.
      CHKS = mySerial2.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
      if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
        Serial.print("Misura2cm ");
        Serial.println(Misura / 10, DEC);
      }
    }
  }  

  delay(50);                             // rimani fermo per 50 ms (tempo di ciclo del sensore)
}
« Last Edit: August 06, 2012, 06:02:01 pm by cyberhs » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

niente ancora
Ecco quello Che Succede con il tuo sketch:

http://www.themoogs.net/problema.mov
Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 929
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Trovato!

Il problema era semplice: come ti avevo detto, solo una porta alla volta può essere in ascolto (vedi esempio SoftwareSerial/TwoPortReceive).

Basta inserire l'istruzione mySerial.listen() prima del ciclo di interrogazione della prima porta e l'istruzione mySerial2.listen() prima di quello della seconda.

Mi sembrava impossibile che non funzionasse!

Ho eliminato i ritardi perché probabilmente non servono.

Ettore Massimo Albani

Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4);
SoftwareSerial mySerial2(5, 6);

byte Hdata = 0;
byte Ldata = 0;
byte CHKS = 0;
unsigned int Misura = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  mySerial2.begin(9600);
}

void loop() {

  mySerial.listen();

  if (mySerial.available() > 0) {
    if (mySerial.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial.read();     //continua la lettura e assegna alle
      Ldata = mySerial.read();     //variabili le letture successive.
      CHKS = mySerial.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
      if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
        Serial.print("Misura1cm ");
        Serial.println(Misura / 10, DEC);
      }
    }
  } 

  mySerial2.listen();

  if (mySerial2.available() > 0) {
 
    if (mySerial2.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial2.read();     //continua la lettura e assegna alle
      Ldata = mySerial2.read();     //variabili le letture successive.
      CHKS = mySerial2.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
      if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
        Serial.print("Misura2cm ");
        Serial.println(Misura / 10, DEC);
      }
    }
  } 
}
« Last Edit: August 06, 2012, 07:52:08 pm by cyberhs » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo lo sketch che hai caricato non mi restituiva nessun valore, pero' mi e' stato di ispirazione e ho cominciato a giocarci
Sono riuscito a scorgere la fine del tunnel con Questo sketch:

Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4);
SoftwareSerial mySerial2(5, 6);

byte Hdata = 0;
byte Ldata = 0;
byte CHKS = 0;
unsigned int Misura = 0;

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

  mySerial.begin(9600);
  mySerial2.begin(9600);
}

void loop() {

  if (mySerial.available() > 0) {
    if (mySerial.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial.read();     //continua la lettura e assegna alle
      Ldata = mySerial.read();     //variabili le letture successive.
      CHKS = mySerial.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
           if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
        Serial.print("Misura1cm ");
        Serial.println(Misura / 10, DEC);
      }
   
    }
  } 
    delay(10);                             //rimani fermo per 5 secondi.


  if (mySerial2.available() > 0) {
    if (mySerial2.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial2.read();     //continua la lettura e assegna alle
      Ldata = mySerial2.read();     //variabili le letture successive.
      CHKS = mySerial2.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
            if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
          mySerial.listen();

        Serial.print("Misura2cm ");
        Serial.println(Misura / 10, DEC);
      }
   
    }
  } 

  delay(1000);                             //rimani fermo per 5 secondi.

}


Ho aggiunto    mySerial.listen();  prima del  Serial.print("Misura2cm "); e
SONO RIUSCITO AD OTTENERE QUESTO!!!!



Mi ha restituito il valore di entrambi una sola volta! poi si e' concentrato su uno solo!! Ci Siamo Quasi mi sa!!! io continuo a provare, ma se hai la soluzione postala!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

CE L' HO FATTA!!!
OGNI TANTO LAGGA DEVO RIVEDERE I RITARDI!

Ecco il codice semidefinitivo!

Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4);
SoftwareSerial mySerial2(5, 6);

byte Hdata = 0;
byte Ldata = 0;
byte CHKS = 0;
unsigned int Misura = 0;

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

  mySerial.begin(9600);
  mySerial2.begin(9600);
}

void loop() {

  if (mySerial.available() > 0) {
    if (mySerial.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial.read();     //continua la lettura e assegna alle
      Ldata = mySerial.read();     //variabili le letture successive.
      CHKS = mySerial.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
           if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
                 
                  mySerial2.listen();

        Serial.print("Misura1cm ");
        Serial.println(Misura / 10, DEC);
      }
   
    }
  } 
    delay(10);                             //rimani fermo per 5 secondi.


  if (mySerial2.available() > 0) {
    if (mySerial2.read() == 0xFF) {    // potrebbe essere il carattere di Start
      Hdata = mySerial2.read();     //continua la lettura e assegna alle
      Ldata = mySerial2.read();     //variabili le letture successive.
      CHKS = mySerial2.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
            if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;
         
          mySerial.listen();

        Serial.print("Misura2cm ");
        Serial.println(Misura / 10, DEC);
      }
   
    }
  } 

  delay(1000);                             //rimani fermo per 5 secondi.

}


Postero' lo sketch definitivo appena risolvo le ultime cose..

Ringrazio di cuore tutti quelli che mi hanno seguito in particolare cyberhs!!!
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Woila Sketch definitivo.

Code:
// Sketch Che consente la lettura di 2 sensori DYPME007TX

#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4);
SoftwareSerial mySerial2(5, 6);

byte Hdata = 0;
byte Ldata = 0;
byte CHKS = 0;
unsigned int Misura = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);         // Primo Valore
  mySerial2.begin(9600);        // Secondo Valore
}

void loop() {

  if (mySerial.available() > 0) {
    if (mySerial.read() == 0xFF) {    // carattere di Start
      Hdata = mySerial.read();     //continua la lettura e assegna alle
      Ldata = mySerial.read();     //variabili le letture successive.
      CHKS = mySerial.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
           if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;     
        mySerial2.listen();   // riprende il secondo valore
        Serial.print("Misura1cm ");     // Identificativo del seriale di ritorno
        Serial.println(Misura / 10, DEC); // Conversione in cm
      }   
    }
  } 
    delay(10);                        //rimani fermo per 10 millisecondi.
  if (mySerial2.available() > 0) {
    if (mySerial2.read() == 0xFF) {    // carattere di Start
      Hdata = mySerial2.read();     //continua la lettura e assegna alle
      Ldata = mySerial2.read();     //variabili le letture successive.
      CHKS = mySerial2.read();      //è il byte di checksum, da datasheet gli ultimi 8 bit della somma 0xFF + Hdata + Ldata.
            if (CHKS == lowByte(0xFF + Hdata + Ldata)) {
        Misura = (Hdata << 8) | Ldata;         
        mySerial.listen();            // riprende il primo valore
        Serial.print("Misura2cm ");   // Identificativo del seriale di ritorno
        Serial.println(Misura / 10, DEC);   // Conversione in cm
      }   
    }
  } 

  delay(10);                           //rimani fermo per 10 millisecondi.
}


Grazie ancora a tutti
Logged

Pages: 1 [2]   Go Up
Jump to: