Go Down

Topic: Domande Basilari Su Come Leggere Dati da 2 Sensori (Read 2897 times) previous topic - next topic

drciga

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

cyberhs

#16
Aug 07, 2012, 01:00 am Last Edit: Aug 07, 2012, 01:02 am by cyberhs Reason: 1
Prova con questo. Ho inserito i ritardi giusti ed un print per vedere se il buffer della seconda seriale si riempie.
Code: [Select]

#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)
}


cyberhs

#18
Aug 07, 2012, 02:36 am Last Edit: Aug 07, 2012, 02:52 am by cyberhs Reason: 1
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: [Select]

#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);
      }
    }
  } 
}

drciga

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: [Select]
#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!

drciga

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

Ecco il codice semidefinitivo!

Code: [Select]
#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!!!

drciga

Woila Sketch definitivo.

Code: [Select]
// 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

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy